用語集 · 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 つ、フレームワークで一元管理します。