2016-12-24 15 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> 

本は私がコメントアウトされて入力している元のコード(マイナス1 implicity_wait)。前回この本を読んでいても、コードは問題なく動作しましたが、私はこのStaleElementエラーをノンストップにしていて、過去に到達する方法を見つけられませんでした。誰でも何か提案がありますか?

答えて

1

まず、暗黙の待ちは多くの人が考えるとは限らないことを指摘したいと思います。あなたのコードでは、それを一種の睡眠として使用しているように見えますが、それはそれとはかけ離れています。暗黙の待機は、要素を見つけることができない場合、この秒数だけ再び試みます。最初に少なくとも1つ見つかった場合、効果はありません。一度だけ設定すれば十分で、セッション全体で各要素の検索に有効です。しかし、特別な条件を待つためにそれを使用することは適切ではありません。ここで発生するようです何

は、以下の(競合状態の一種)である:ページが更新される前に、あなたは

  • をEnterキーを押します

    • 、ドライバーは現在利用可能な全ての要素を見つけ
    • あなたが試します要素をループしますが、その間にページが更新され、前回の検索が無効になります。

    これはすべて数秒で発生します。

    Enterキーを押した後に実際のスリープを使用することができます(推奨された解決策ではありませんが、実験的には機能します)、実際の処理が完了するまで待つことができます。 (たとえば、現在の行数をカウントし、変更するまで待機するカスタム条件を使用するか、すべてのポストリクエストが終了するまで待機するjavascriptを使用できます)

  • 関連する問題