2010-09-14 85 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