我是使用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指向页面的某个部分才能查看?
答案 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中返回什么。无论它返回什么,您都希望使用for
或for each
等循环遍历该集合类型,然后单击每个元素。
由于页面与您说的一样大,您可能需要在点击之间添加一点延迟,因为页面可能需要一段时间才能处理点击。
是否无法限制页面上的搜索结果,然后使用全选框?