1

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

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

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

但令我惊讶的是,这需要几分钟才能在 firefox 上运行(我害怕在 IE 上尝试它,这是它应该被测试的地方)。当我调试时,很明显瓶颈是来自 td 的 .//input 搜索,这正在杀死我。它超过十秒,因此即使只有几个细胞,我的测试也需要永远进行。我已经尝试了 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"));
    }
4

1 回答 1

0

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

或者您可以将其作为 JS 来执行,这也只需要一小部分时间,您可以Lists从脚本中获取:

(JavascriptExecutor)driver.executeScript(
    "var tds = document.getElementsByTagName('td');"
    "for (var i = 0; i < tds.length; i++) {" +
    "   var inputs = tds[i].getElementsByTagName('input');" +
    "}"
    );
于 2012-05-22T22:49:54.840 回答