page-object gem と Watir Webdriver を使用すると、ページで Selenium::WebDriver::Error::StaleElementReferenceError に出くわすことがあります。このエラーは、いくつかの基本的なものをロードし、ajax リクエストを作成し、より多くの情報を再入力します (速度の錯覚のため)。ページで)。
これは、そこに HTML 要素が存在するために発生し、すぐに消えて、ユーザーが実際に気付く前に再び表示されます。
ページオブジェクトの「.when_present」メソッドを使用して、オブジェクトが最初にページに表示されるまで待機してからアクセスします。ただし、コードが要素を見つけた後でも、通常、古い要素エラーが発生します。これは、元の HTML 要素がなくなり、アクセスしようとするまでに別の要素が再び表示されるためです。
これを回避するために、(ページオブジェクトではなく) ストレートな Watir を使用する方法を見つけました。基本的に、Watir::Wait.until ブロック内で StaleElementReferenceError をキャッチします。例外が発生した場合、ブロックは false を返し、Wait.until は true になるかタイムアウトになるまで再試行します。私たちが発見したことは、これは通常、最初に Stale Element を取得し (以下の 3 行目)、レスキューから false を返し、Wait.until がブロックを再度実行し、2 回目は true であり、テストに移行して合格することです。 .
1 Watir::Wait.until {
2 begin
3 tds = page.my_element.when_present.element.tds
4 table_data_classes = tds.map{|cell| cell.attribute_value("class") }
5
6 # Should have at least one with a class of "xyz"
7 xyz = table_data_classes.select{|data| data.include?("xyz")}
8 xyz.size > 0
9 rescue Selenium::WebDriver::Error::StaleElementReferenceError
10 false
11 end
12 }
この種のページオブジェクトラッパーがあるかどうかは本当に疑問です。何も見つかりませんでした。そうでない場合は、上記が機能するため問題ありません。ちょっと興味があるんだけど。
ありがとう