用語集 · UI 自動化
暗黙的待機(Implicit Wait)
英語: Implicit wait
別名: 暗黙的な待機, 暗黙の待機, インプリシットウェイト, implicit waits
定義
Selenium のグローバル設定で、すべての findElement 呼び出しが NoSuchElementException を投げる前に、指定時間まで要素をポーリングし続けるようにします。
暗黙的待機(Implicit Wait)は、諦める前に一定時間要素を探し続けるよう WebDriver に指示するものです。ドライバーのセッションごとに一度設定すると、それ以降のすべての findElement と findElements の呼び出しに適用されます。待機が、自分で選んだ箇所ではなく要素の検索の中で暗黙のうちに行われるため「暗黙的」と呼ばれます。デフォルトは 0 です。
具体例(Selenium 4、Java)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
// Polls for up to 5 seconds for the element to exist in the DOM
WebElement email = driver.findElement(By.id("email"));
// findElements also waits up to 5 seconds, then returns an empty list
List<WebElement> errors = driver.findElements(By.cssSelector(".error"));
Selenium 4 では Duration を受け取るオーバーロードを使います。古い implicitlyWait(long, TimeUnit) は非推奨です。
明示的待機との違い
| 暗黙的待機 | 明示的待機 | |
|---|---|---|
| 範囲 | セッション中のすべての要素検索 | テスト内の 1 か所での 1 つの条件 |
| 待つ対象 | 要素が DOM に存在すること | 任意の条件:表示、クリック可能、テキストの存在、消えること |
| 設定場所 | ドライバーに一度だけ | WebDriverWait を使ってインラインで |
暗黙的待機は、要素が表示される、または有効になるまでは待ちません。ボタンが存在していてもまだ無効なら、findElement はすぐに戻り、クリックが失敗するか何も起きないかもしれません。
多くのチームが避ける理由
- 明示的待機と混在させると予測できなくなる。 Selenium のドキュメントは両者の併用に警告しています。明示的待機の中で行われる検索にも暗黙的なタイムアウトが適用されるためです。
- 何かが存在しないことの確認が遅くなる。 要素が正しく存在しない場合でも、
findElements(...).isEmpty()は毎回暗黙的タイムアウトの全時間を待ちます。 - 意図が見えなくなる。 どのステップが本当に待機を必要としているのか、読み手には分かりません。
一般的な推奨は、暗黙的待機を 0 のままにし、必要な箇所で明示的待機を使うことです。レガシーなスイートが暗黙的待機に依存している場合は短く保ち、それを取り除かないまま明示的待機を重ねないようにします。