使用selenium VBA将动态网页表中的单元格值带到excel单元格

时间:2016-07-27 12:42:16

标签: excel vba selenium-webdriver

我是selenium VBA的新手,后谷歌搜索已经创建了以下代码,以便使用selenium v​​ba从动态网页中获取每个单元格值。我收到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

2 个答案:

答案 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****

你可以尝试做两个修复中的一个......

  1. .findElements()更改为.findElement(),以便您只抓取第一个(可能只有?)表格。如果你只想要第一个,这是解决这个问题的正确方法。

  2. 在第一行的元素集合中添加索引,例如将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 _____________^^^
    
  3. 附加说明: 我有另一个建议来简化你的一些代码。在For i循环中,您有硬编码索引2-7,我认为您可以轻松使用循环。我更新了以下代码。这完成了两件事......

    1. 它消除了重复抓取页面的麻烦。在原始代码中,您一次只能抓取一个元素。在下面的代码中,我获取了TD的集合,然后迭代它们。这样我只抓一次页面来获取我关心的所有元素,然后处理该集合。效率更高。
    2. 简化代码。
    3. 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