2

我正在尝试使用 selenium-dotnet-2.0a5 遍历许多表,并且必须使用 xpath。例如;

var tableRows = _table.FindElements(By.TagName("tr"));

foreach (var row in tableRows)
{ 
    row.FindElements(By.XPath("td|th"));
    //iterate through tablecells and get text of each
}

迭代大约 50 行的平均时间,firefox 0-2 秒,chrome 6-8 秒,IE 60-70 秒。

我的大部分测试都需要在 IE 中运行,关于如何获得更好的 xpath 性能的任何提示?

4

2 回答 2

2

我总是对 selenium 1 有同样的问题,我通过更新它使用的 3rd 方 xpath 库来改进它,它不确定这是否仍然适用于 selenium 2 ......但最终如果它不是浏览器的本机,它就不够快.

最后,如果我需要类似您的示例并且 CSS 选择器不会削减它,我只需从 selenium 返回整个 DOM 并使用另一个库在代码中解析树并以这种方式遍历它。有点肮脏的技巧,但使用慢速 IE xpath 确实可以解决您的问题。

于 2010-09-14T07:17:24.587 回答
1

如果您有权更改 HTML,请尝试在表数据元素上放置类声明。然后您可以使用 By.ClassName 而不是 XPath。

但在我继续之前,你到底想做什么?这似乎很奇怪

一旦 CssSelectors 在 .Net 和 IE 中得到完全支持,这将是一个不错的选择,但目前它并不可靠。现在请记住,您的文档需要以标准模式呈现。

您需要考虑只查看 td 而不是 td 和 th。虽然它肯定是可行的,但它增加了一定程度的复杂性。为了简单起见,我在下面做了。通常,您会知道有多少 th 以及它们持有什么,并分别处理它们。

进入代码,我发现 By.TagName 有轻微的加速。这在 43 行乘 4 列中花费了大约 20 秒。

        IWebElement table = driver.FindElement(By.TagName("table"));
        ReadOnlyCollection<IWebElement> cells = table.FindElements(By.TagName("td"));
        foreach (IWebElement cell in cells)
        {
            Console.WriteLine(cell.Text);
        }

但后来我尝试将页面源加载到内存中并使用HtmlAgilityPack解析页面。小心使用 XML 解析器来阅读 html 文档,你会发现 html 可能不是完美的 XML。以下代码花费了几乎令人讨厌的 96毫秒

        HtmlDocument html = new HtmlDocument();
        html.LoadHtml(driver.PageSource);
        HtmlNodeCollection nodeCollect =  html.DocumentNode.SelectNodes("//td");
        foreach (HtmlNode node in nodeCollect)
        {
            Console.WriteLine(node.InnerText);
        }

继续加载页面源代码和解析,如果你想做的只是遍历文档检查元素。当您需要导航/交互时,恢复到您的驱动程序。

于 2010-09-14T22:31:13.947 回答