Fluent Wait とポーリング戦略

1. Fluent Wait とは

Fluent Wait は Selenium WebDriver が提供する 最も柔軟な同期メカニズムで、次の 3 つを自由に設定できます。

設定項目 役割 デフォルト 主な API メソッド
最大待機時間 (timeout) 条件が満たされるまでの最長待機時間 0 秒 withTimeout(Duration)
ポーリング間隔 (polling interval) 条件を再評価する周期 500 ms pollingEvery(Duration)
無視する例外 待機中に無視したい例外 なし ignoring(Class…)

ポーリング間隔と例外リストを細かく制御できる点が、暗黙 wait/通常の明示 wait(WebDriverWait)との決定的な違いです。selenium.devrepeato.app


2. 基本構文(Java 例)

java
Wait<WebDriver> wait = new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(30)) // 最大 30 秒待つ .pollingEvery(Duration.ofMillis(200)) // 200 ms ごとに判定 .ignoring(NoSuchElementException.class); // 要素未発見時は無視 WebElement btn = wait.until(d -> d.findElement(By.id("submit")));
  • ラムダ式関数型インタフェースで独自条件を記述できる。

  • ExpectedConditions も利用可能(until(ExpectedConditions.elementToBeClickable(locator)) など)。medium.comdev.to


3. ポーリング戦略の考え方

シナリオ 推奨ポーリング間隔 理由
軽量 DOM 変化(単一要素の表示) 100–300 ms テスト全体の遅延を最小化。
大規模 SPA で AJAX 多用 300–700 ms ネットワーク遅延/描画コストを考慮。
レスポンスに数秒かかる API 連動 1–2 s 無駄なポーリングでリソースを消費しない。

ポイント:

  • 短すぎる間隔は CPU・ネットワーク負荷を高め、対象要素がまだ生成中の場合には無駄に例外を発生させるリスクがあります。

  • 長すぎる間隔はフレームワークがチャンスを逃し、実行時間が不必要に延びます。stackoverflow.combrowserstack.com


4. 例外ハンドリング

Fluent Wait では ignoring() に複数の例外型を渡し、待機ループ中にログだけ残してスキップできます。

java
wait.ignoring(NoSuchElementException.class, ElementNotInteractableException.class);
  • 失敗させたくない一時的な例外を限定することで、テストの flakiness を低減。

  • 逆に無視しすぎると、本当に異常な状態を見逃すので注意。selenium.devdiyorbekmamadaliev.medium.com


5. Fluent Wait を使うべきケース

  1. Ajax/フェードイン要素

    • 例: ローディングスピナーが消えるまでボタンをクリック不可。

  2. 段階的に属性が変化する要素

    • 例: disabledenabled に切り替わる送信ボタン。

  3. API 応答をポーリング

    • DOM ではなく、executeScript() で返るステータス値を監視。

  4. 複数条件を合成したい場面

    • クリック可能かつ表示テキストが特定値、など複雑条件。


6. ベストプラクティスと注意点

ベストプラクティス 解説
Implicit Wait と混在させない 予測不能な合算待機になる。暗黙 wait を 0 に設定してから Fluent Wait を使う。selenium.dev
待機ロジックをユーティリティ化 再利用し、重複コードを削減。依存注入で WebDriver を渡す。
最短の妥当な timeout を見積もる ページ/API の SLA を計測し、平均+バッファ値を設定。
JUnit/TestNG の @Timeout と併用 無限ループ化を防止。
テストレポートに待機情報を記録 ログや Allure で開始時刻・経過秒数を出力すると調査が容易。

7. 他の Wait との比較

特性 Implicit Wait WebDriverWait (Explicit) Fluent Wait
適用範囲 セッション全体 インスタンス単位 インスタンス単位
ポーリング間隔 500 ms (固定) 500 ms (変更不可) 任意に設定可
例外無視 NoSuchElementException 同左 任意に追加可
用途 単純な要素探索 定型条件 複雑/カスタム条件

Fluent Wait は “カスタム明示 wait” と位置付けられ、ポーリングと例外をチューニングしたい高度なケースで真価を発揮します。browserstack.comqaexpertise.com


まとめ

Fluent Wait は timeoutpolling intervalignored exceptions を自在に操り、ダイナミックな Web アプリの同期問題を洗練された形で解決します。適切なポーリング戦略を設計し、Implicit Wait を併用しないことが安定自動化への鍵です。

ChatGPT4o 生成日:2025/06/21