Selenium相对定位器从WebElement搜索速度极慢

时间:2012-05-22 21:37:20

标签: performance selenium selenium-webdriver web-scraping webdriver

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

Locate the table WebElement by id
List<WebElement> cells = tableElem.findElements(By.xpath(".//td"));

然后我将循环遍历所有单元格并使用xpath“.//input”运行findElements,如果列表为空,我将在webElement上运行getText,如果列表不为空,我将运行getAttribute输入元素。

但令我惊讶的是,这需要几分钟才能在Firefox上运行(我害怕在IE上尝试它,这是它应该被测试的地方)。当我调试时,很明显瓶颈是来自td的.//输入搜索,它正在杀死我。它超过十秒,所以即使只有几个单元格,我的测试也会永远消失。我已经尝试了各种微小的变种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"));
    }

1 个答案:

答案 0 :(得分:0)

你真的需要浏览器吗?你可以尝试HtmlUnitDriver,这将非常快!

或者你可以把它作为一个JS来做,也只需要一小部分时间和you can get Lists from the script

(JavascriptExecutor)driver.executeScript(
    "var tds = document.getElementsByTagName('td');"
    "for (var i = 0; i < tds.length; i++) {" +
    "   var inputs = tds[i].getElementsByTagName('input');" +
    "}"
    );