メインコンテンツへスキップ
SDETRole
SDETRole

用語集 · UI 自動化

明示的待機(Explicit Wait)

英語: Explicit wait

別名: 明示的な待機, 明示的ウェイト, エクスプリシットウェイト, explicit waits

定義

要素がクリック可能になるなど特定の条件を、タイムアウトまでポーリングして待つ待機方法で、Selenium では WebDriverWait で記述します。

明示的待機(Explicit Wait)は、特定の条件が真になるまでテストを一時停止する待機方法です。条件を繰り返し確認し、条件が満たされなければタイムアウトで失敗します。テストが待つ必要のあるちょうどその場所に書き、何を待つかを明示するため「明示的」と呼ばれます。Selenium 4 では、WebDriverWait と ExpectedConditions の条件またはラムダ式を組み合わせて使います。

具体例(Selenium 4、Java)

import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

WebElement save = wait.until(
    ExpectedConditions.elementToBeClickable(By.id("save")));
save.click();

wait.until(ExpectedConditions.textToBePresentInElementLocated(
    By.cssSelector("[role='status']"), "Saved"));

// Any condition can be a lambda that returns a non-null or true value
wait.until(d -> d.findElements(By.cssSelector(".result-row")).size() == 20);

WebDriverWait はデフォルトで 500 ms ごとにポーリングし、ポーリング中は NotFoundException を無視します。間隔を変えたい場合や無視する例外を追加したい場合は、FluentWait(withTimeout、pollingEvery、ignoring)を使います。

暗黙的待機との違い

暗黙的待機は 1 つのグローバル設定で、すべての findElement 呼び出しが要素が存在するまでポーリングするようになります。表示状態、クリック可能かどうか、テキストについては何も考慮しません。明示的待機はテスト内の特定の箇所で 1 つの条件を対象にするため、スピナーが消える、ボタンが有効になるなど、必要な状態を正確に待てます。

Selenium のドキュメントは、両者を混在させないよう警告しています。タイムアウトが組み合わさると、待機時間が予測できなくなるためです。多くのチームは暗黙的待機を 0 にして、すべての箇所で明示的待機を使っています。

よくある間違い

  • 待機の代わりに Thread.sleep を使う。 固定のスリープは、マシンによって短すぎる(フレーキーになる)か長すぎる(遅くなる)かのどちらかで、たいていはその両方です。
  • 表示状態が必要なのに存在を待つ。 presenceOfElementLocated はノードが DOM に入った時点で合格し、要素が非表示でも通ってしまいます。
  • 再描画をまたいで WebElement を保持する。 By ロケーターで待機し、DOM が変わった後に要素が改めて検索されるようにします。
  • ヘルパーごとに巨大なタイムアウトの待機を新しく作る。 妥当なデフォルトを 1 つ、フレームワークで一元管理します。

キーワードを入力すると SDETRole 全体を検索できます。

Pagefind による全文検索 · ブラウザ内で動作します 検索ページを開く →