2010-09-14 56 views
2

我试图用selenium-dotnet-2.0a5遍历许多表,并且必须使用xpath。例如;Selenium 2.0 IE 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秒,铬6-8秒,IE 60-70秒的平均时间。

我的大部分测试都需要在IE中运行,关于如何获得更好的xpath性能,我可以做些什么?

+1

@Mikey:你为什么不只一次导入树?说'/ html/body/table/tr/*'或'/ html/body/table/tr/* [self :: td或self :: th]' – 2010-09-14 15:44:31

回答

1

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

但是在我进一步探讨之前,你究竟想要做什么?看起来很奇怪,

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

你会想考虑只看td,而不是td和th。虽然它确实可行,但它增加了一定的复杂性。为了简单起见,我已经在下面做了。通常你会知道有多少,他们持有什么,并分别处理它们。

进入代码我发现有一个轻微的加速去By.TagName。这花了大约20秒43行4列。

 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); 
     } 

去与加载页面的源代码和解析,如果你想这样做,通过文档检查元素进行迭代。当您需要导航/互动时,还原到您的驱动程序。

+0

+1,用于解析获取文本和使用驱动程序进行交互的源的建议。 – 2010-09-15 13:19:27

+0

感谢您对htmlagility的推荐,我重新编写了我的课程以使用它,而且一切都更快 – Thermionix 2010-09-16 01:53:53

2

我总是有与硒1相同的问题,我通过更新第三方XPath库,它不知道这是否仍然适用于硒2,但它最终没有它原生的浏览器它改善它没有不够快。

最后,如果我需要类似于您的示例和CSS选择器只是不会削减它,我只是从硒中返回整个DOM,并使用另一个库解析代码中的树,并以此方式迭代。肮脏的黑客的位,但确实让你使用慢的IE浏览器xpath。

+0

在这个特定的例子中,桌子的td和th。您是否尝试过使用两个循环,一个用于row.FindElements(By.TagName(“th”)),另一个用于row.FindElements(By.TagName(“td”))? – 2010-09-14 08:30:27