我是selenium VBA的新手,后谷歌搜索已经创建了以下代码,以便使用selenium vba从动态网页中获取每个单元格值。我收到web_tr和web_td web元素中的web元素时出错
尝试使用此行:
ActiveSheet.Cells(i, 1).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[1]").Text
我只是获取标题行项目的第一个值,尽管它在循环中。
Web_tr和web_td是Web元素,接收这些变量的Web元素是这里的问题。请帮助。
With ThisWorkbook
.Sheets("UpfrontOrder#").Activate
Set web_table = selenium.findElementsByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody")
Set web_tr = web_table.findElementsByTagName("tr") '***** the error pop-up gets in here****
row_count = selenium.findElementsByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr").Count
For i = 1 To row_count
Set web_td = web_tr.findElementsByTagName("td")
ActiveSheet.Cells(i, 1).Value = web_td(1).getText
'ActiveSheet.Cells(i, 1).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[1]").Text
ActiveSheet.Cells(i, 2).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[2]").Text
ActiveSheet.Cells(i, 3).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[3]").Text
ActiveSheet.Cells(i, 4).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[4]").Text
ActiveSheet.Cells(i, 5).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[5]").Text
ActiveSheet.Cells(i, 6).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[6]").Text
ActiveSheet.Cells(i, 7).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']/td[7]").Text
'ActiveSheet.Cells(i, 1).Value = web_td.findElementByXPath("td[1]").Text
'ActiveSheet.Cells(i, 2).Value = web_td(1).Text
Next i
End With
答案 0 :(得分:0)
我对Selenium的VBA版本并不熟悉,但从我所知道的情况来看,我认为我认为有一个问题会导致你得到的错误。当您使用.findElements*
(复数)时,它将返回元素集合而不是单个元素。您的第一行(下方)正在使用.findElements()
,但在第二行(下方)中未指定要引用的web_table
集合的哪个元素。
Set web_table = selenium.findElementsByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody")
Set web_tr = web_table.findElementsByTagName("tr") '***** the error pop-up gets in here****
你可以尝试做两个修复中的一个......
将.findElements()
更改为.findElement()
,以便您只抓取第一个(可能只有?)表格。如果你只想要第一个,这是解决这个问题的正确方法。
在第一行的元素集合中添加索引,例如将web_table.
更改为web_table(1).
如果您想要除第一个之外的TABLE
标记,请添加正确的引用。
Set web_table = selenium.findElementsByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody")
Set web_tr = web_table(1).findElementsByTagName("tr")
add this _____________^^^
附加说明:
我有另一个建议来简化你的一些代码。在For i
循环中,您有硬编码索引2-7,我认为您可以轻松使用循环。我更新了以下代码。这完成了两件事......
TD
的集合,然后迭代它们。这样我只抓一次页面来获取我关心的所有元素,然后处理该集合。效率更高。For i = 1 To row_count
Set web_td = web_tr.findElementsByTagName("td")
ActiveSheet.Cells(i, 1).Value = web_td(1).getText
Dim tds As New List
Set tds = ActiveSheet.Cells(i, 2).Value = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr['i']")
For j = 2 To 7
ActiveSheet.Cells(i, j).Value = tds(j).Text
Next j
Next i
答案 1 :(得分:0)
谢谢你们两位。
以下代码适用于查找每个单元格值。
With ThisWorkbook
.Sheets("UpfrontOrder#").Activate
Set web_table = selenium.findElementByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody")
Set web_tr = web_table.findElementsByTagName("tr")
row_count = selenium.findElementsByXPath("//table[@id='ctl00_cphContentBody_itemsTable']/tbody/tr").Count
For i = 0 To (row_count - 2)
Set web_td = web_tr(i).findElementsByTagName("td")
For j = 0 To 6
ActiveSheet.Cells((i + 1), (j + 1)).Value = web_td(j).Text
Next j
Next i
End With