2016-12-24 41 views
3

我目前正在瀏覽Django/TDD的書籍,並且遇到了StaleElementReferenceException並被卡住了。我一直在搜索並搜索StackOverflow來解決我的錯誤,但我一直無法解決它。我的相關代碼如下:如何在Selenium中處理這個StaleElementReferenceException?

functional_tests.py

inputbox.send_keys(Keys.ENTER) 
self.browser.implicitly_wait(3) 
table = self.browser.find_element_by_id('id_list_table') 
#rows = table.find_elements_by_tag_name('tr') 
rows_ref = lambda: table.find_elements_by_tag_name('tr') 
#self.browser.implicitly_wait(3) 
foundBuy = False 
for row in rows_ref(): 
    self.browser.implicitly_wait(3) 
    rows_text = row.text 
    if (rows_text == '1: Buy peacock feathers'): 
     foundBuy = True 
     break 
if not (foundBuy): 
    self.fail('Could not find "1: Buy peacock feathers" in rows\' text') 
#self.assertIn('1: Buy peacock feathers', [row.text for row in rows_ref()]) 

在代碼 「rows_text = row.text」 線在上述代碼中發生的錯誤。在我最初的代碼中,它出現在底部的註釋掉的self.assertIn語句中。

home.html的

<html> 
    <head> 
     <title>To-Do lists</title> 
    </head> 
    <body> 
     <h1>Your To-Do list</h1> 
     <form method="POST"> 
      <input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/> 
      {% csrf_token %} 
     </form> 
     <table id="id_list_table"> 
      {% for item in items %} 
       <tr><td>{{ forloop.counter }}: {{ item.text }}</td></tr> 
      {% endfor %} 
     </table> 
    </body> 
</html> 

原代碼書中有我進入被註釋掉了(減去一個implicity_wait)。在我以前閱讀本書時,代碼沒有任何問題,但是我一直在不停地收到這個StaleElement錯誤,並且無法找到一種方法來克服它。任何人有任何建議?

回答

1

首先我想指出,隱含的等待並不是許多人認爲的。在你的代碼中,它看起來像你正在使用它作爲一種睡眠 - 但它遠非如此。如果無法找到元素,隱式等待會再次嘗試這段時間。如果第一次發現至少一個,則不起作用。設置一次就足夠了,然後在整個會話期間對每個元素查找都是有效的。但它不適合用於等待特殊條件。

有什麼事發生在這裏的是以下(一種競爭狀態):

  • 按下Enter鍵
  • 該網頁將被更新之前,駕駛員發現目前市面上所有元素
  • 你試試循環瀏覽元素,但頁面會在同一時間更新,使您以前的發現無效。

這一切都發生在幾分之一秒內。

按Enter鍵後,您可以使用實際的睡眠(不是推薦的解決方案,但爲了試驗它的效果),或者您可以等待實際操作發生/完成。 (例如,您可以使用一個自定義條件來計算當前的行數,並等待它改變,或者使用一個等待所有請求完成的javascript。)

相關問題