WebDriverのWaitを使ってDOMを監視したり意図的に待つ方法

Selenium   Web Browser Automation

画面テストはブラウザを使ってテスト行うため、HTMLのロードの時間やロード後に実行されるJavascript処理など、いろんなものに影響を受けるためテストを安定して自動実行するのが難しい。

そこで役に立つのがWebDriverが用意しているWait機能。WebDriverのドキュメントに「明示及び暗黙のWait」について説明があり、JSのロードやページ読み込み待ちの発生する場合に使えそうなWaitの使用方法が書かれている。

暗黙のWait

ドライバーに設定するだけで、要素が登場するまで設定した値だけ待つ。

https://gist.github.com/daipresents/d3847e8d747d4f7bfe49a7eb0f9b9a20.js?file=gistfile1.txt

明示のWait

明示のWaitをを使うと、「500ミリ秒ごとにチェックして、OKだったら処理に戻る」といったことを実装できます。ずっと待つのではなく「見つかったら戻る」ので多少時間を節約できる人間のような動きですね。

RSpecの場合、値検証に使うメソッドに以下のように組み込んでみた。

https://gist.github.com/daipresents/d3847e8d747d4f7bfe49a7eb0f9b9a20.js?file=gistfile2.txt

最後に最終的な結果判定をしてテスト失敗かどうかをみきわめる形。

タイムアウトしたときはTimeout::Errorが飛び出します。

https://gist.github.com/daipresents/d3847e8d747d4f7bfe49a7eb0f9b9a20.js?file=gistfile3.txt

Timeoutを検知して処理を追加することもできますね。

https://gist.github.com/daipresents/d3847e8d747d4f7bfe49a7eb0f9b9a20.js?file=gistfile4.txt

もし、値の確認時にページリロードを繰り返したい場合は、呼び出し元で

https://gist.github.com/daipresents/d3847e8d747d4f7bfe49a7eb0f9b9a20.js?file=gistfile5.txt

のようにURLを引数に与えて、

https://gist.github.com/daipresents/d3847e8d747d4f7bfe49a7eb0f9b9a20.js?file=gistfile6.txt

とかでリロードを繰り返せばいい気がするんですが、デフォルト500ms毎でぐるぐるしているみたいなので、ロードが遅すぎてうまくうごかなかった。