Seleniumを使ったブラウザ自動化において、要素の読み込み待ち処理は最も重要な工程の一つです。
2026年現在、Webアプリケーションの動的な挙動はより複雑化しており、適切な待機処理の重要性はさらに高まっています。
特に、要素がDOM上に存在するだけでなく「操作可能であるか」や「表示されているか」を正確に判定することが、安定したスクレイピングやテストの鍵となります。
本記事では、SeleniumのWebDriverWaitと組み合わせて使用するexpected_conditions(EC)の全条件を網羅的に紹介します。
逆引き形式でサンプルコードを掲載しているため、開発現場ですぐに活用できる内容となっています。
Seleniumにおける待機処理の重要性と基本構成
Seleniumには「暗黙的な待機(Implicit Wait)」と「明示的な待機(Explicit Wait)」の2種類が存在します。
暗黙的な待機は設定が簡単ですが、特定の条件を満たすまで待つといった細かな制御ができません。
一方、明示的な待機(Explicit Wait)は、特定の条件が満たされるまで、またはタイムアウト時間を経過するまでプログラムを一時停止させる手法です。
この明示的な待機で「どのような状態になるまで待つか」を定義するのがexpected_conditionsモジュールです。
まずは、expected_conditionsを利用するための標準的なインポートと基本構造を確認しましょう。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# WebDriverの初期化
driver = webdriver.Chrome()
# WebDriverWaitのインスタンス化(最大10秒間待機)
wait = WebDriverWait(driver, 10)
try:
# ページ遷移
driver.get("https://example.com")
# 特定の条件を指定して待機
element = wait.until(EC.presence_of_element_located((By.ID, "target-id")))
print("要素が見つかりました")
finally:
driver.quit()
要素が見つかりました
このように、wait.until()メソッドの中にEC.条件名を記述することで、複雑な待機ロジックを簡潔に実装できます。
タイトル・URLに関する待機条件
ページの遷移を確認したり、特定のページに到達したことを判定したりする際に便利な条件です。
ページタイトルが一致するまで待つ
title_isは、ページのタイトルが完全に一致するまで待機します。
一方で、title_containsはタイトルの一部が含まれているかどうかを判定します。
# タイトルが完全に一致するまで待機
wait.until(EC.title_is("マイページ - サービス名"))
# タイトルに特定のキーワードが含まれるまで待機
wait.until(EC.title_contains("ログイン"))
URLが特定の状態になるまで待つ
SPA(Single Page Application)など、ページ遷移なしでURLが変化する場合に有効です。
url_to_be、url_contains、url_matches(正規表現)などが利用可能です。
# URLが完全に一致するまで待機
wait.until(EC.url_to_be("https://example.com/dashboard"))
# URLに特定の文字列が含まれるまで待機
wait.until(EC.url_contains("/success"))
# 正規表現でURLをチェック
wait.until(EC.url_matches(r"https://example\.com/items/\d+"))
要素の表示状態に関する待機条件
最も頻繁に利用されるカテゴリーであり、要素がDOMにあるか、画面上に見えているかを区別する必要があります。
DOM上に要素が存在するまで待つ(presence)
presence_of_element_locatedは、HTMLのソースコード(DOM)内に要素が出現した時点で待機を終了します。
画面上に表示されている必要はなく、非表示(display: none)状態でも条件を満たします。
# 要素がDOM内に存在することを確認
element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".hidden-data")))
要素が画面上で可視化されるまで待つ(visibility)
visibility_of_element_locatedは、要素がDOMに存在し、かつ「高さと幅があり、画面上に表示されている」状態になるまで待ちます。
ユーザーが実際にクリックしたり、テキストを確認したりする操作の前には、こちらを使用するのが一般的です。
# ボタンが画面に表示されるまで待機
submit_button = wait.until(EC.visibility_of_element_located((By.ID, "submit-btn")))
要素が非表示または削除されるまで待つ(invisibility)
ローディングアイコンが消えるのを待ってから次の操作に移りたい場合に便利です。
# ローディングアニメーションが消えるのを待つ
wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "spinner")))
要素の操作性・テキストに関する待機条件
ボタンが押せる状態か、あるいは特定のメッセージが表示されたかを確認する条件です。
要素がクリック可能になるまで待つ
element_to_be_clickableは、要素が画面に表示されており、かつ「無効化(disabled)されていない」状態を待ちます。
JavaScriptによる動的なボタンの活性化を待つ際に必須となる条件です。
# ボタンがクリック可能(活性化)になるまで待機
clickable_element = wait.until(EC.element_to_be_clickable((By.NAME, "action-button")))
clickable_element.click()
要素内のテキストを条件にする
特定の要素の中に、期待するテキストが含まれるまで待機します。
例えば、処理完了後に「完了しました」というメッセージが出るまで待つといったケースで多用します。
# 特定の要素内に「完了」という文字が表示されるまで待機
wait.until(EC.text_to_be_present_in_element((By.ID, "status-message"), "完了"))
# input要素のvalue属性に値が入るまで待機する場合
wait.until(EC.text_to_be_present_in_element_value((By.ID, "user-id-input"), "admin"))
フレーム・アラート・ウィンドウに関する待機条件
iframeへの切り替えや、ブラウザのポップアップ通知を扱う際に重要です。
iframeへの切り替えと待機を同時に行う
frame_to_be_available_and_switch_to_itは、指定したiframeが利用可能になったら、そのままそのフレームにコンテキストを切り替えます。
コードが非常にスッキリするため、推奨される書き方です。
# iframeが表示されたら自動的に切り替える
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "ad-frame")))
# これ以降の操作はiframe内の要素が対象になる
アラートダイアログ(JS Alert)の出現を待つ
JavaScriptのalert()、confirm()などが表示されるまで待ちます。
# アラートが表示されるまで待機
alert = wait.until(EC.alert_is_present())
# アラートのテキストを取得して閉じる
print(alert.text)
alert.accept()
複数の条件を組み合わせる(Logical Conditions)
2026年のモダンな開発環境では、単一の条件だけでなく「AまたはBのどちらかが成立するまで待つ」といった高度な制御も求められます。
# いずれかの条件が満たされるまで待つ(any_of)
wait.until(EC.any_of(
EC.visibility_of_element_located((By.ID, "success-msg")),
EC.visibility_of_element_located((By.ID, "error-msg"))
))
# 全ての条件が満たされるまで待つ(all_of)
wait.until(EC.all_of(
EC.title_contains("完了"),
EC.url_contains("done")
))
expected_conditions 条件比較一覧表
よく使われる条件の特性を整理しました。
| 条件名 | 判定基準 | 主な用途 |
|---|---|---|
presence_of_element_located | DOM上に存在するか | データの抽出(非表示でも可) |
visibility_of_element_located | DOMに存在し、かつ表示されているか | テキスト読み取り、通常の操作 |
element_to_be_clickable | 表示され、かつ有効状態か | ボタンのクリック、入力 |
text_to_be_present_in_element | 特定のテキストを含んでいるか | ステータス変更の検知 |
invisibility_of_element_located | 非表示またはDOMから削除されたか | ローディング待ち |
よくあるエラーと回避策
expected_conditionsを使用している際に最も遭遇するのがTimeoutExceptionです。
これは指定した時間内に条件が満たされなかった場合に発生します。
主な原因は「ロケータの間違い」または「要素が実際に出現するまでの時間が長すぎる」ことです。
また、要素が再描画される際にStaleElementReferenceExceptionが発生することがあります。
この場合、refreshed条件を使って要素を再取得するまで待機する方法が有効です。
# 要素が古くなった場合に再取得を試みる待機
element = wait.until(EC.refreshed(EC.presence_of_element_located((By.ID, "dynamic-content"))))
まとめ
Seleniumのexpected_conditionsは、堅牢なブラウザ自動化を実現するために欠かせない機能です。
単に要素が見つかるまで待つのではなく、「表示されているか」「クリックできるか」「テキストが書き換わったか」といった具体的な状態を定義することで、エラーの少ないスクリプトを構築できます。
特にelement_to_be_clickableやvisibility_of_element_locatedの使い分けを理解することは、初心者が中級者へステップアップするための第一歩です。
本記事で紹介した逆引きサンプルを活用し、2026年の高度なWebサイトにも対応できる安定したオートメーションを目指しましょう。
まずは、自身のコードにある単純なtime.sleep()を、適切なexpected_conditionsに置き換えるところから始めてみてください。
