如何使用Selenium和VBA

时间:2015-08-25 16:46:32

标签: vba excel-vba selenium selenium-webdriver access-vba

我是使用Selenium的新手,我对HTML只有非常基本的知识,所以请耐心等待。我正在尝试自动导出我们公司网站上的联系人列表,以便在Access数据库中使用。该列表位于一个包含多个页面的表中,每次最多可显示1000条记录,每个记录都有自己的复选框,用于选择要导出的记录。在过去,我已经能够点击"全选"选项并一次性导出所有内容,但我公司设置的方式,我一次只能导出10000条记录(约90K)。我认为只需按其唯一ID或名称单击每个复选框即可,但它们都具有相同的ID selectedResps-1和名称selectedResps以及2个交替的xpath(交替颜色在表):

/html/body[@class='appbody']/table[@id='tileLayoutTbl']/tbody/tr[3]/td/form[@id='respSearchForm']/div[@id='srmGlobal']/table[2]/tbody/tr[7]/td/div[@id='results']/table/tbody/tr[2]/td/div[@id='scrollingDiv']/table[@id='respSearchList']/tbody/tr[@class='oddrow']

/html/body[@class='appbody']/table[@id='tileLayoutTbl']/tbody/tr[3]/td/form[@id='respSearchForm']/div[@id='srmGlobal']/table[2]/tbody/tr[7]/td/div[@id='results']/table/tbody/tr[2]/td/div[@id='scrollingDiv']/table[@id='respSearchList']/tbody/tr[@class='rowGrey']

我希望有一些我可以做的事情,如下所示选择它们:

 For Each CheckBox in Table
      If CheckBox.Name = "selectedResps" then
          'Check the checkbox
      End If
 Next CheckBox

这样我就可以一次导出1000个联系人,这样我就可以获得每个出口限制10000条记录。

更新 -

按照@ JeffC的建议,我发现.FindElements()函数返回一个WebElements集合,并提出了一些我认为应该工作的代码:

Dim PageCollection As WebElements
Dim Item As WebElement
Dim D As New IEDriver

Set PageCollection = D.FindElementsByCssSelector("#SelectedReps-1")

For Each Item In PageCollection
    Item.Click
    Application.Wait (Now + TimeValue("00:00:01"))
Next Item

我遇到的问题是PageCollection为空(找到.Count属性),因此for循环不做任何事情。我已经验证了它可以使用.FindElementsByXpath()中上面的一个X路径来工作,我只需要知道为什么PageCollection不会填充。我是否需要将Selenium指向页面的某个部分才能查看?

1 个答案:

答案 0 :(得分:1)

我不知道如何使用Selenium VBA,但我可以告诉你如何用Java完成它,希望你能翻译这些概念......

List<WebElement> checkboxes = driver.findElements(By.cssSelector("#selectedResps-1"));
for (WebElement checkbox : checkboxes)
{
    checkbox.click();
}

所以基本上你想要用id(#)&#34; selectedResps-1&#34;来拉所有元素。在Java中返回List&lt;&gt;,我不知道它在VBA中返回什么。无论它返回什么,您都希望使用forfor each等循环遍历该集合类型,然后单击每个元素。

由于页面与您说的一样大,您可能需要在点击之间添加一点延迟,因为页面可能需要一段时间才能处理点击。

是否无法限制页面上的搜索结果,然后使用全选框?