2014-11-05 85 views
0

我想用節點和webdriverJS遍歷表硒:硒遍歷表/ webdriverjs

<table> 
    <tr> 
    <td class="name">Peter</td> 
    <td class="count">1</td> 
    </tr> 
    <tr> 
    <td class="name">John</td> 
    <td class="count">3</td> 
    </tr> 
</table> 

我要爲每一行看名字和列細胞。

我有什麼:

driver.findElements(By.tagName('tr')).then(function(rows){ 

    // for every row 
    for (var i = 0; i< rows.length; i++){ 
     // check the name cell 
     rows[i].findElement(By.class('name')).getInnerHtml().then(function(name){ 
      // do some stuff 
     }); 

     // check the count cell 
     rows[i].findElement(By.class('count')).getInnerHtml().then(function(count){ 
      // do some stuff 
     }); 
    } 

}); 

這適用於第一一些行,但有許多排它在某一點失敗。

我的理論是:for循環中的findElement調用被傳遞給管理器,然後for循環完成。然後垃圾收集器刪除行數組。一旦經理執行findElement調用,數組及其元素不再存在並失敗。我得到的錯誤是:

StaleElementReferenceException : The Element is not Attached to the DOM

它的工作第一行作爲數組仍然存在於早期的執行上。

我的問題:

  1. 我究竟做錯了什麼?

  2. 我的理論是否正確?

  3. 如何將row[i]引用綁定到findElement調用,以使它們保持比原始數組更長的時間?

---- ----編輯

當我刪除內findElement電話中的一個,只追求每行一個單元,我能夠覆蓋更多的行。這讓我覺得,在這個實施中,時間起着一定的作用。這不應該是這樣,所以我可能做錯了什麼。

  1. Selenium中是否有像forEach函數?
+0

如果您沒有驗證行本身的任何內容,您可以爲每種單元類型編寫一個XPath,並逐個對這些單元進行迭代以查看是否有效。基本上用'driver.findElements(By.xpath('// tr/td [@class = \'name \']'))'''''''''''''''driver'替換'driver.findElements(By.tagName('tr')) .findElements(By.xpath('// tr/td [@class = \'count'''))'。 – shri046 2014-11-05 18:01:39

+0

我也在考慮這個選項,但我想保持一行的單元格。最後我想把名字和數字聯繫起來。這就是爲什麼我想要逐行瀏覽它,然後通過一行的單元格。 – pat 2014-11-05 22:07:26

+0

如果你用'console.log(name)'和'console.log(count)'替換你的'//做一些東西''你還會**得到間歇性故障嗎? – Louis 2014-11-05 23:56:07

回答

0

我發現這個問題:

我使用與煎茶的ExtJS實現的網站。

該表在數據存儲之上創建:顯然,該存儲被調用兩次,整個表在調用之間重新創建。

所以我不知要等到表加載第二次...

這將是下一個挑戰。