0

我使用Selenium 2.0,Firefox 11.0和Java來處理表。我有一個由td單元組成的表格元素,其中一些包含span元素中包含的文本,另一些包含其值屬性中具有文本的輸入元素。我的目標是獲取每個單元格的文本,以便可以輸出表格內容並將其與預期值進行比較。我以爲我會只是做這樣的事情:Selenium相對定位器從WebElement極其緩慢的搜索

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

然後,我將通過所有的細胞,並與XPath的「.//input」運行findElements,如果該列表是空的我會在webElement運行循環的getText ,如果列表不是空的,我會在輸入元素上運行getAttribute。

但令我驚訝的是,這花了幾分鐘在Firefox上運行(我不敢嘗試IE瀏覽器,它應該在哪裏測試)。當我調試時,很顯然,瓶頸是//輸入搜索td,這正在殺死我。這是十秒鐘以上,所以即使只有幾個細胞,我的測試也將持續進行。我已經嘗試了各種各樣的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")); 
    } 
+0

硒哪個版本您使用的? 需要2.8秒才能在我的機器上執行您的代碼。這與打開頁面一起。代碼是好的,你的環境肯定有問題。 – JacekM

回答

0

你真的需要一個瀏覽器?你可以試試HtmlUnitDriver,那會非常快!

或者你可以做到這一點的JS,也只需要時間和you can get Lists from the script一個分數:

(JavascriptExecutor)driver.executeScript(
    "var tds = document.getElementsByTagName('td');" 
    "for (var i = 0; i < tds.length; i++) {" + 
    " var inputs = tds[i].getElementsByTagName('input');" + 
    "}" 
    ); 
+0

無論如何,我認爲最慢的事情是程序和瀏覽器之間的溝通。你確定你不能拿出少於40個查詢來獲取所有數據嗎? Google示例中的用例是什麼?您期望輸出什麼內容? –

+0

我有一張桌子,我事先不知道哪些單元格將包含帶有文本的輸入框,哪些單元格將只包含明文而沒有輸入框。我希望能夠在某些階段編寫表應該看起來像什麼,並且希望能夠調用一些compareTable函數,該函數將爲我執行所有字符串匹配。我需要能夠保留單元格的順序來完成此操作。谷歌的例子是不是一個真正的用例,但它似乎是一個簡單的方法來演示這些查詢有多慢。 HtmlUnitDriver和JS是我猜的可能性...... – newmanne

+0

有一點需要注意的是,谷歌的例子是有很多冗餘的工作,因爲頁面上實際上有9個表格,其中很多都是嵌套的。一旦你減少搜索到其中的一個,它也快得多。確保你在真實情況下不做任何不必要的工作。是的,我不能想出任何更簡單的查詢來獲得所有的'td'元素和所有'輸入'。它通常是一個或另一個。或者,也許你可以通過在XPath中利用'// td [span [text()='some text']或輸入[@ value ='some text']]'和'fol​​lowing'軸來搜索具體的文本單元格。 –