Performance Selenium relative locator从WebElement进行搜索的速度非常慢

Performance Selenium relative locator从WebElement进行搜索的速度非常慢,performance,selenium,selenium-webdriver,web-scraping,webdriver,Performance,Selenium,Selenium Webdriver,Web Scraping,Webdriver,我正在使用Selenium 2.0、Firefox 11.0和Java来处理一个表。我有一个由td单元格组成的table元素,其中一些包含span元素中包含的文本,另一些包含在其值属性中包含文本的输入元素。我的目标是获得每个单元格的文本,这样我就可以输出表内容并将它们与预期值进行比较。我想我会这样做: Locate the table WebElement by id List<WebElement> cells = tableElem.findElements(By.xpath("

我正在使用Selenium 2.0、Firefox 11.0和Java来处理一个表。我有一个由td单元格组成的table元素,其中一些包含span元素中包含的文本,另一些包含在其值属性中包含文本的输入元素。我的目标是获得每个单元格的文本,这样我就可以输出表内容并将它们与预期值进行比较。我想我会这样做:

Locate the table WebElement by id
List<WebElement> cells = tableElem.findElements(By.xpath(".//td"));
然后,我将循环遍历所有单元格并使用xpath//输入运行findElements;如果列表为空,我将在webElement上运行getText;如果列表不为空,我将在输入元素上运行getAttribute

但令我惊讶的是,这在firefox上运行了几分钟,我害怕在IE上尝试,而IE正是测试它的地方。当我调试时,很明显,瓶颈是来自td的//输入搜索,这让我很痛苦。时间长达10秒,所以即使只有几个细胞,我的测试也要花上一辈子的时间。我尝试了xpath的各种小变化,尝试了css选择器,并继续得到相同的结果

我想要一些关于如何以不同方式解决这个问题或如何优化我目前的方法的建议。我希望这只需要几秒钟

我已经包含了一些示例代码,可以说明我正在经历的减速。这不是我正在抓屏的网站,但速度是一样的:

    webDriver.navigate().to("https://accounts.google.com/NewAccount");
    List<WebElement> TDxpath = webDriver.findElements(By.xpath("//td"));
    List<WebElement> TDcss = webDriver.findElements(By.cssSelector("td"));
    for (WebElement td : TDcss) {
        List<WebElement> q = td.findElements(By.cssSelector("input"));
    }
    for (WebElement td : TDxpath) {
        List<WebElement> r = td.findElements(By.xpath(".//input"));
    }

你真的需要浏览器吗?你可以试试HtmlUnitDriver,那会非常快

或者您可以作为JS来完成,这也只需要一小部分时间,而且:


您使用的是哪个版本的Selenium?在我的机器上执行代码只需要2.8秒。这与打开页面一起进行。代码还行,您的环境一定出了问题。无论如何,我认为最慢的事情是程序和浏览器之间的通信。你确定不能用少于40个查询来获取所有数据吗?在Google示例中,您的用例是什么?您对输出的期望是什么?我有一个表,其中我事先不知道哪些单元格将包含带有文本的输入框,哪些单元格将只包含没有输入框的纯文本。我希望能够编写表在某些阶段的外观,并希望能够调用一些可比较函数,为我完成所有字符串匹配。我需要保持细胞的有序性才能做到这一点。诚然,谷歌的例子并不是一个真正的用例,但它似乎是一个简单的方式来证明这些查询有多慢。我想HtmlUnitDriver和JS是可能的……在google示例中需要注意的一点是,由于页面上实际上有9个表,其中许多表是嵌套的,所以有很多冗余工作要做。一旦你将搜索范围缩小到其中一个,搜索速度也会快得多。确保在真实情况下你没有做任何不必要的工作。是的,我无法提出任何更简单的查询来获取所有td元素和所有输入。通常是这样或那样。或者您可以通过利用//td[span[text='some text']或input[@value='some text']]和XPath中的轴来搜索具体的文本单元格。我曾考虑过使用HtmlUnitDriver,但我认为这不能解决问题。按id抓取表格不是我的瓶颈,也是我使用驱动程序的唯一目的。其余的搜索是相对于特定WebElement的,因此我认为我的问题更多的是WebElement类的findElements,而不是其他任何东西。它在我的计算机上大约200毫秒后在HtmlUnitDriver中完成:。
(JavascriptExecutor)driver.executeScript(
    "var tds = document.getElementsByTagName('td');"
    "for (var i = 0; i < tds.length; i++) {" +
    "   var inputs = tds[i].getElementsByTagName('input');" +
    "}"
    );