【问题标题】:Selenium and AutoHotkey - How to get the size of table rows/column?Selenium 和 AutoHotkey - 如何获取表格行/列的大小?
【发布时间】:2020-07-01 04:49:33
【问题描述】:

我一直在研究几个小时没有成功

我只需要 Autohotkey 的语法来获取表格行/列的大小

我正在关注本指南https://www.guru99.com/handling-dynamic-selenium-webdriver.html

在其他语言中,他们建议这样做:

WebElement tbody = driver.findElement(By.xpath("//div[@class='z-listbox-body']/table/tbody"));
List<WebElement> rows = tbody.findElements(By.xpath("tr"));
totalrows = rows.size();

注意,他们使用“List”将变量转换为List类型,问题是,在AHK中没有变量类型定义,应该是自动定义的,但在这种情况下显然不是

这是我正在测试的页面,但无法正常工作 http://demo.guru99.com/test/web-table-element.php#

我只需要知道它有多少行和/或列,它应该像这样简单:

 MsgBox %  ""  oChrome.findElementByXpath("//*[@id='leftcontainer']/table/thead/tr/th").size()

(不给出错误但不显示任何值)

甚至这个,就像他们建议的那样 (How to get the total number of elements in a HTML with Selenium WebDriver and Autohotkey?)

 MsgBox %  ""  oChrome.findElementByXpath("//*[@id='leftcontainer']/table/thead/tr/th").Count()

(错误:未知名称,具体:计数)

目标是获得列数(在本例中为 5)和行数(26),这是为了进一步实现 For Each 并循环遍历每行的值

如果有任何建议,我将不胜感激,谢谢!

完整代码

oChrome := ChromeGet() ; Object for Chrome

MsgBox %  ""  oChrome.findElementByXpath("//*[@id='leftcontainer']/table/thead/tr/th").Size() ; FAIL

MsgBox %  "Finish" 
return

ChromeGet(IP_Port := "127.0.0.1:9222") {
    oChrome := ComObjCreate("Selenium.ChromeDriver")
    oChrome.SetCapability("debuggerAddress", IP_Port)
    oChrome.Start()
    return oChrome
}

【问题讨论】:

  • 你不应该使用Length函数吗?如果你先定义一个变量,然后得到它的长度。对于列是这样的:Var := oChrome.findElementByXpath("//table//th") MsgBox % "" Var.Length() 对于没有变量的行:MsgBox % "" oChrome.findElementByXpath("//table//tr[not(th)]").Length()
  • 也没有工作:(似乎它与无法识别的函数调用或类似的事情有关,或者错过了类(比如在处理 Selects 时,有一部分你必须在哪里设置“.AsSelect”等等)
  • 你能从你的 XPath 表达式返回的元素中打印文本吗? Count 函数不再起作用?你说它在这里起作用:stackoverflow.com/questions/57237659/… 尝试诱导“innerText”然后计数或长度:Var := oChrome.findElementByXpath("//table//th").Attribute("innerText") MsgBox % "" Var.Count() 也尝试使用另一个 webdriver:driver:= ComObjCreate("Selenium.CHROMEDriver") ;Chrome driver driver.Get("http://demo.guru99.com/test/web-table-element.php#")
  • 感谢您的回复!是的,实际上这确实是一件愚蠢的事情,请看我的回答,我错过了“findElementByXpath”上的“s”,实际上,在堆栈溢出问题中,它确实使用了“findElementsByXpath”,但我很傻,谢谢!跨度>
  • 似乎合乎逻辑。不错的收获。我也错过了。由于findElement 不输出列表而是输出单个元素,Count 函数返回错误。正式注明。

标签: selenium selenium-webdriver xpath selenium-chromedriver autohotkey


【解决方案1】:

啊,所以,经过几天的研究,我注意到了一个更大的东西,我需要使用:

.findElementsByXpath()

代替:

.findElementByXpath()

在查看 Python 的 Selenium 文档时,我注意到了这一点: https://selenium-python.readthedocs.io/locating-elements.html

这让我很喜欢上面那个额外的“s”,所以,就是这样!我也使用了 Count()。 它属于一个简单的逻辑(现在我意识到常识),findElementsByXpath(),正如文档所说,搜索多个元素值,而不仅仅是一个,这样你就可以使用“.Count()”来例如,搜索节点中的子节点总数 因此,为我工作的最终代码如下:

oChrome := ChromeGet() ; Object for Chrome

MsgBox %  ""  oChrome.findElementsByXpath("//*[@id='leftcontainer']/table/thead/tr/th").Count() 

MsgBox %  "Finish" 
return

ChromeGet(IP_Port := "127.0.0.1:9222") {
    oChrome := ComObjCreate("Selenium.ChromeDriver")
    oChrome.SetCapability("debuggerAddress", IP_Port)
    oChrome.Start()
    return oChrome
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2020-09-22
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多