Seleniumを安定稼働させる
約300のテストクラス、実行しているテストケースで言えば約1,100ケース。
これを毎日定時に2回回してるけれども、まず失敗しない。しても、10回に1ケース。
なぜ、これほど安定するのか。
それは、魔法を使っているから!ではなく、ページを読み込む箇所に、以下のメソッドを挿入しているから。
/** * footerが出るまで待機する */ public static void FootrArrivalWait() { TargetArrivalWait(By.xpath("/html/body/footer")); } * ターゲット要素が出現するまで待機する * * @param by * ターゲット要素 */ public static void TargetArrivalWait(By by) { try { Wait<WebDriver> wait = new WebDriverWait(driver, 10); wait.until(visibilityOfElementLocated(by)); } catch (TimeoutException e) { fail("要素出現タイムアウト:" + by); } }
この2つのメソッドをページ読み込みを行う箇所に挿入しただけで、全く失敗しなくなった。
実は、Seleniumがエラーを吐く原因の9割が、Seleniumの動作が速すぎて、レタリングとかが追いつかないから。
だったら、待てばいいじゃん。
でも、毎回毎回ユニークな要素を指定するのは非効率的なので、フッター読み込み待機メソッドを作った。
このフッター読み込み待機メソッド(TargetArrivalWait(By by))をページオブジェクトに仕込めばOK。