我正在尝试使用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性能吗?
发布于 2010-09-15 06:31:14
如果您有权更改HTML,请尝试在表数据元素上放置一个类声明。然后您可以使用By.ClassName而不是XPath。
但在我进一步讨论之前,您到底想要做什么?看起来很奇怪
一旦.Net和IE完全支持CssSelectors,这将是一个很好的选择,但目前它还不可靠。请记住,现在,您的文档需要在标准模式下呈现。
你可以考虑只看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-14 15:17:25
我一直在selenium 1上遇到同样的问题,我通过更新第三方xpath库来改进它,不确定这是否仍然适用于selenium 2……但归根结底,如果它不是浏览器原生的,它就不够快。
最后,如果像您的示例和CSS选择器这样的东西不能解决问题,我只需要返回selenium中的整个DOM,并使用另一个库在代码中解析树,然后以这种方式遍历它。有点肮脏的技巧,但确实绕过了你使用缓慢的IE xpath。
https://stackoverflow.com/questions/3705659
复制相似问题