Seleniumを活用したブラウザ自動化において、特定の要素がページ上に存在するかどうかを判定する処理は、スクリプトの安定性を左右する極めて重要な要素です。
多くの開発者が最初に直面する壁は、対象の要素が見つからない場合にプログラムがエラーで停止してしまうという問題でしょう。
この記事では、エラーを回避しながらスマートに要素の存在を確認できるfind_elementsメソッドと空リストを活用した判定手法について詳しく解説します。
2026年現在のモダンなWeb開発シーンにおいても、この手法は最も汎用的で信頼性の高いアプローチとして広く採用されています。
find_elementを使用する際のリスクと課題
Seleniumで要素を取得する際、最も直感的なメソッドはfind_elementです。
しかし、このメソッドには要素が存在しない場合にNoSuchElementExceptionという例外をスローするという特性があります。
もし例外処理(try-except構文)を記述せずにfind_elementを実行し、要素が見つからなかった場合、プログラムはその時点で強制終了してしまいます。
以下のようなコードは、一見正しく動作するように見えますが、要素が存在しない可能性を考慮できていません。
# 要素が見つからないと、ここでNoSuchElementExceptionが発生して停止する
element = driver.find_element(By.ID, "target-id")
element.click()
要素の存在を確認するために毎回try-exceptで囲む手法もありますが、コードが冗長になり、可読性が低下するというデメリットがあります。
また、例外処理は本来「予期せぬエラー」に対処するための仕組みであり、「要素があるかないかを確認する」という通常のロジックに組み込むのは、設計の観点からも推奨されません。
find_elementsが推奨される理由
要素の存在確認において、複数形のfind_elementsを利用することが推奨される最大の理由は、その戻り値の型にあります。
find_elementsメソッドは、指定した条件に合致するすべての要素をリスト形式で返します。
重要な点は、対象の要素が一つも見つからなかった場合に、例外をスローせず「空のリスト([])」を返すという仕様です。
これにより、プログラムを停止させることなく、安全に要素の有無を判定することが可能になります。
空リストを利用した判定の基本構造
Pythonにおいて、リストは中身があればTrue、空であればFalseとして評価される性質(Truthy/Falsy)を持っています。
この性質を利用することで、非常にシンプルかつ直感的な存在確認コードを記述できます。
# find_elementsを使って要素を探す
elements = driver.find_elements(By.CSS_SELECTOR, ".dynamic-content")
# リストが空でなければ(要素が存在すれば)処理を実行
if elements:
print("要素が見つかりました。操作を開始します。")
elements[0].click()
else:
print("要素は存在しません。")
この書き方であれば、要素が見つからなくてもエラーにならず、elseブロックの処理へと安全に遷移できます。
複数要素が存在する場合の挙動
find_elementsはその名の通り、条件に合致するすべての要素を取得します。
存在確認のみが目的であれば、リストの長さが1以上であるかどうかを確認するだけで十分です。
特定の1つだけを操作したい場合は、elements[0]のようにインデックスを指定してアクセスします。
find_elementsと待機処理(Wait)の組み合わせ
モダンなWebサイトではJavaScriptによる動的なコンテンツ生成が一般的であり、要素が表示されるまでにタイムラグが発生することが多々あります。
単純にfind_elementsを実行するだけでは、要素がロードされる前にチェックが終わってしまい、誤って「存在しない」と判定されるリスクがあります。
これを防ぐためには、Seleniumの待機処理と組み合わせて使用することが不可欠です。
暗黙的な待機(Implicit Wait)の影響
driver.implicitly_wait()を設定している場合、find_elementsもその影響を受けます。
要素が見つからない場合、設定された秒数が経過するまでSeleniumは再試行を繰り返します。
しかし、暗黙的な待機はプロジェクト全体に影響を及ぼすため、特定の箇所だけで柔軟に制御するには不向きです。
明示的な待機(Explicit Wait)による高度な制御
特定の要素が現れるまで待ちたい場合は、WebDriverWaitとexpected_conditionsを使用するのがベストプラクティスです。
ただし、presence_of_element_locatedなどは見つからない場合にタイムアウト例外を投げるため、注意が必要です。
例外を回避しつつ待機を行いたい場合は、あえてfind_elementsをループ内で回すか、カスタム待機条件を自作する手法が取られます。
要素の存在確認におけるパフォーマンス比較
要素の存在確認を行う手法はいくつかありますが、実行速度やコードのメンテナンス性に違いがあります。
以下の表に、主要な手法の比較をまとめました。
| 手法 | 例外発生の有無 | 主な用途 | 推奨度 |
|---|---|---|---|
| find_element + try-except | あり | 確実に存在するはずの要素の取得 | 中 |
| find_elements + if文 | なし | 条件分岐を伴う存在確認 | 高 |
| WebDriverWait | あり(タイムアウト時) | 非同期ロードされる要素の待機 | 高 |
このように、単純な存在確認においてはfind_elementsの利便性が際立っています。
実戦で役立つ「要素確認ユーティリティ」の作成
コードの各所でfind_elementsを書くのは非効率なため、再利用可能な関数を定義しておくと便利です。
特に2026年の開発現場では、型ヒントを活用した堅牢なコード記述が求められます。
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webdriver import WebDriver
def is_element_present(driver: WebDriver, by: By, value: str) -> bool:
"""
指定した要素がページ上に存在するかどうかを判定します。
"""
elements = driver.find_elements(by, value)
return len(elements) > 0
# 使用例
if is_element_present(driver, By.NAME, "login_button"):
print("ログインボタンを確認しました。")
このようなユーティリティ関数を用意することで、メインのロジックをスッキリと保つことができます。
また、len(elements) > 0と明示的に比較することで、ブール値を返す意図が他の開発者にも伝わりやすくなります。
特定の状態に応じた判定の使い分け
要素が「HTML上に存在すること」と「ユーザーの目に見える状態であること」は別問題です。
find_elementsで取得できたとしても、その要素がdisplay: none;などで隠されている場合があります。
この場合、要素は存在するが操作はできないという状態になります。
要素が実際に表示されているかまで確認したい場合は、取得した要素オブジェクトのis_displayed()メソッドを併用しましょう。
elements = driver.find_elements(By.ID, "alert-msg")
if elements and elements[0].is_displayed():
print("警告メッセージが表示されています。")
「存在チェック」と「表示チェック」を適切に使い分けることが、安定した自動テストやスクレイピングを実現する鍵となります。
存在しないことを確認する(否定の判定)
逆に、特定の要素が消えたことを確認したいケースもあります。
例えば、ロード画面(スピナー)が消えるのを待ってから次の操作に移るような場合です。
この場合もfind_elementsが活躍します。
import time
# ローディング要素が消えるまで最大10秒待機
for _ in range(10):
if not driver.find_elements(By.CLASS_NAME, "loading-spinner"):
print("ロードが完了しました。")
break
time.sleep(1)
このように、リストが空であることをループの終了条件にすることで、ポーリング(定期的な状態確認)処理も容易に実装できます。
まとめ
Seleniumで要素の存在確認を行う際は、find_elementによる例外処理を避け、find_elementsによるリスト判定を活用するのが最も賢明な選択です。
この手法を用いることで、コードがシンプルになり、予期せぬエラーによるスクリプトの停止を防ぐことができます。
要素が見つからない場合には空のリストが返されるというPythonicな仕様を最大限に活用しましょう。
また、Webサイトの応答速度に合わせて適切な待機処理(Explicit Wait)を組み合わせることで、より堅牢な自動化システムを構築することが可能になります。
今回解説したfind_elementsと空リストの活用術をマスターして、エラーに強いSeleniumスクリプトを目指してください。
