Pythonを使用したWebブラウザの自動操作において、最も頻繁に行われる作業の一つが操作対象となる要素の特定です。
ボタンをクリックする、入力フォームにテキストを打ち込む、あるいは特定のテキストを抽出するといったアクションのすべては、まずHTMLの中から目的の要素を正しく見つけ出すことから始まります。
Seleniumでは要素を特定するための手法(ロケーター)が複数用意されていますが、その中でもid属性とname属性による特定は、動作の安定性と処理速度の両面で極めて優れた方法です。
本記事では、Selenium 4以降の最新の記述方法に基づき、id属性とname属性を活用した要素特定の実践的なテクニックを詳しく解説します。
Seleniumにおける要素特定(ロケーター)の重要性
Web自動化スクリプトが失敗する最大の原因は、要素が見つからないことによるエラーです。
Webサイトの構造は複雑であり、適切なロケーターを選択しなければ、サイトの微細な更新によってスクリプトがすぐに動作しなくなってしまいます。
数あるロケーターの中で、id属性は「ページ内で一意(ユニーク)であること」がHTMLの仕様として定義されているため、最も信頼性が高い特定方法とされています。
一方で、name属性はフォーム送信の際のリクエストパラメータとして使用されるため、入力フォームの操作において非常に有用です。
これら二つの属性を使いこなすことは、保守性の高い自動化プログラムを構築するための第一歩となります。
Selenium 4以降の基本記述ルール
2026年現在のSelenium 4系(およびそれ以降)では、以前の古いバージョンで使用されていた find_element_by_id や find_element_by_name といったメソッドは完全に廃止、あるいは非推奨となっています。
現在は、Byクラスをインポートし、find_element() メソッドの引数として指定する形式が標準です。
必須となるインポート文
要素特定を行う際には、まず以下のモジュールをインポートする必要があります。
from selenium import webdriver
from selenium.webdriver.common.by import By
この By クラスを利用することで、idやnameだけでなく、XPathやCSSセレクターなどのさまざまな指定方法を共通のインターフェースで利用できるようになります。
id属性による要素の特定方法
id属性は、HTMLドキュメント内で特定の要素に固有の名前を付けるために使用されます。
id属性を指定するメリット
- 一意性の保証:原則として1つのページに同じidは存在しないため、誤った要素を取得するリスクが低いです。
- 処理の高速化:ブラウザのレンダリングエンジンはidによる検索を最適化しているため、他のロケーターよりも高速に要素を見つけることができます。
- 可読性の向上:コードを見ただけで、どの要素を操作しようとしているのかが明確になります。
基本的な書き方
以下のようなHTML要素があると仮定します。
<button id="submit-button">ログイン</button>
このボタンをPythonで特定してクリックするコードは以下の通りです。
# id属性を使用して要素を特定
element = driver.find_element(By.ID, "submit-button")
# 特定した要素を操作(クリック)
element.click()
id属性を使用する際の注意点
id属性は非常に強力ですが、現代のモダンなWebサイト(ReactやVue.js、Angularなどで構築されたサイト)では、idが動的に生成されるケースがあります。
例えば、id="button_82731" のように、ページをリロードするたびに数値部分が変わってしまうような場合、単純な By.ID 指定ではエラーが発生します。
このような場合は、後述する他の手法や部分一致の検討が必要です。
name属性による要素の特定方法
name属性は、主に <input>、<select>、<textarea> といったフォーム関連の要素で使用されます。
name属性の役割とメリット
name属性は、サーバー側にデータを送信する際の識別子として機能します。
そのため、ユーザー情報の入力欄や検索ボックスなど、インタラクティブな要素の特定に非常に適しています。
id属性が付与されていない入力項目であっても、name属性は設定されていることが多いため、フォーム操作の自動化においては欠かせない手段です。
基本的な書き方
以下のような検索ボックスのHTMLがあると仮定します。
<input type="text" name="query" placeholder="検索キーワードを入力">
この入力欄に文字を入力するコードは以下の通りです。
# name属性を使用して要素を特定
search_box = driver.find_element(By.NAME, "query")
# 文字列の入力
search_box.send_keys("Python Selenium")
name属性が重複する場合の挙動
id属性とは異なり、name属性は同じページ内に複数存在する可能性があります(例:ラジオボタンやチェックボックス)。
driver.find_element(By.NAME, "...") を使用した場合、Seleniumはページ内で最初に見つかった要素を返します。
もし複数の要素の中から特定の順番のものを操作したい場合は、find_elements (末尾がsの複数形)を使用する必要があります。
# name属性に一致するすべての要素をリストで取得
elements = driver.find_elements(By.NAME, "common-name")
# 2番目の要素を操作
if len(elements) > 1:
elements[1].click()
idとnameの比較と使い分け
要素を特定する際、どちらの属性を使うべきか迷うことがあります。
以下の比較表を参考に使い分けてください。
| 特徴 | id属性 (By.ID) | name属性 (By.NAME) |
|---|---|---|
| 一意性 | 非常に高い(ページ内で唯一) | 普通(重複の可能性あり) |
| 主な用途 | レイアウト要素、特定のボタンなど | フォームの入力項目、送信データ |
| 実行速度 | 最速 | 高速 |
| 推奨度 | 最優先で使用すべき | idがない場合の有力な選択肢 |
原則として、id属性が存在するならidを使用するのが鉄則です。
idがなく、name属性がある場合にはnameを使用するという優先順位でスクリプトを設計しましょう。
実践コード:ログイン処理の自動化
ここでは、id属性とname属性を組み合わせて、実際のログイン処理を模した自動化コードを記述します。
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
# WebDriverのセットアップ
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try:
# テスト対象のURLへ移動
driver.get("https://example.com/login")
# 1. ユーザー名入力欄をname属性で特定
username_field = driver.find_element(By.NAME, "user_login")
username_field.send_keys("test_user")
# 2. パスワード入力欄をid属性で特定
password_field = driver.find_element(By.ID, "user_password")
password_field.send_keys("secure_password123")
# 3. ログインボタンをid属性で特定
login_button = driver.find_element(By.ID, "btn-submit")
# ボタンをクリック
login_button.click()
# 遷移を待つための待機
time.sleep(3)
# ログイン後のURLを確認
print(f"現在のURL: {driver.current_url}")
finally:
# ブラウザを閉じる
driver.quit()
現在のURL: https://example.com/dashboard
このコードでは、フォームの各項目に対して最も適したロケーターを選択しています。
ユーザー名にはnameを、パスワードと送信ボタンにはidを使用することで、簡潔かつ堅牢なスクリプトになっています。
安定性を高めるための明示的待機
idやnameで正しく要素を指定していても、ページ読み込みのタイミングによっては NoSuchElementException(要素が見つからない例外)が発生することがあります。
これは、ブラウザがHTMLを読み込み、JavaScriptを実行して要素を描画する前に、Python側が操作を実行しようとするために起こります。
これを防ぐには、WebDriverWait を利用した「明示的待機」が推奨されます。
明示的待機の実装例
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 要素が画面に現れるまで最大10秒間待機する
wait = WebDriverWait(driver, 10)
# idが "dynamic-content" の要素が表示されるまで待つ
target_element = wait.until(
EC.presence_of_element_located((By.ID, "dynamic-content"))
)
print("要素の読み込みが完了しました")
2026年のWeb開発においては、コンテンツの動的読み込み(非同期通信)が当たり前となっているため、要素の特定と待機処理はセットで考えるべきです。
トラブルシューティング:要素が見つからない場合
idやnameを正しく記述しているはずなのに要素が見つからない場合、以下の3つのポイントを確認してください。
1. iframeの中に要素がないか
操作したい要素が <iframe> タグの内側にある場合、Seleniumの操作対象をそのフレームに切り替える必要があります。
# iframeに切り替え
driver.switch_to.frame("frame-id")
# その後で要素を特定
element = driver.find_element(By.ID, "inner-id")
# 元の階層に戻る
driver.switch_to.default_content()
2. 要素が非表示になっていないか
HTML上には存在するものの、CSSで display: none; などが設定されている場合、click() などの操作が失敗します。
要素が「可視状態」であることを確認してから操作してください。
3. スペースやタイポの確認
HTMLソース内のidやnameに、目に見えない半角スペースが含まれていることがあります。
ソースコードをコピー&ペーストする際は、前後の余計な空白が含まれていないか注意深くチェックしてください。
まとめ
本記事では、Python Seleniumにおけるid属性とname属性を用いた要素特定の基本について解説しました。
- id属性はページ内で一意であり、最も信頼性が高く高速なロケーターです。
- name属性はフォーム操作において非常に便利ですが、重複の可能性に注意が必要です。
- Selenium 4以降は
By.IDやBy.NAMEを使用した記述方法が標準です。 - ページの読み込み速度に左右されないよう、WebDriverWait による待機処理を組み合わせることが、安定した自動化の鍵となります。
Webスクレイピングやテスト自動化の現場において、これらの基本を忠実に守ることで、エラーの少ないメンテナンスしやすいコードを作成できるようになります。
まずは操作したい要素のHTMLソースを確認し、最適なidやnameが見つかるかどうかをチェックするところから始めてみましょう。
