要素の取得(Element Locating)
1. WebDriver が返す WebElement とは
WebDriver が返す WebElement とは-
DOM 上の単一ノードを表す Selenium のオブジェクト。
-
取得後は 遅延評価(lazy evaluation)されるため、あとで実際に利用するときに DOM を再検索する点に注意。
2. 代表的なロケータ戦略(selenium.webdriver.common.by.By)
selenium.webdriver.common.by.By)| 戦略 | 典型例 | 特徴と留意点 |
|---|---|---|
By.ID |
driver.find_element(By.ID, "login-btn") |
最速・一意で理想的。ID が動的に変わる SPA では不向き。 |
By.NAME |
driver.find_element(By.NAME, "email") |
フォーム要素で有効。重複があると想定外の要素を返すことに注意。 |
By.CSS_SELECTOR |
driver.find_element(By.CSS_SELECTOR, "div.card > a.btn") |
柔軟かつ高速。保守性を高めるためにクラス名に意味を持たせる。 |
By.XPATH |
driver.find_element(By.XPATH, "//table//tr[2]/td[3]") |
複雑な条件検索が可能。読みやすさ・速度で CSS より劣る。 |
By.LINK_TEXT / PARTIAL_LINK_TEXT |
driver.find_element(By.LINK_TEXT, "詳細") |
アンカーテキストが静的な場合に便利。多言語対応が必要な場合は避ける。 |
By.TAG_NAME |
driver.find_elements(By.TAG_NAME, "input") |
主に大量取得で使用し、フィルタは Python 側で実施する。 |
ベストプラクティス
ページ改修に強いロケータ(データ属性や安定したクラス)を用いる。
取得後すぐに要素が可視・可操作とは限らないため、明示的待機(
WebDriverWait+expected_conditions) を習慣化する。
基本アクション(Interactions)
1. クリック・入力系
| メソッド | 用途 | 典型的な例 |
|---|---|---|
click() |
ボタン・リンクをクリック | login_button.click() |
send_keys(*keys) |
テキスト入力・キー送信 | email_box.send_keys("user@example.com") |
clear() |
入力フィールドをクリア | search_box.clear() |
submit() |
フォームの送信 | form_element.submit() |
キーボード定数(selenium.webdriver.common.keys.Keys)
2. 属性・状態の取得
| プロパティ / メソッド | 内容 |
|---|---|
.text |
要素内部の表示文字列(子要素含む) |
.get_attribute("value") |
値属性など任意の属性を取得 |
.is_displayed() |
表示状態を真偽値で取得 |
.is_enabled() |
操作可能かどうかを取得 |
3. アクションチェーン(複合操作)
ActionChains によりマウスホバー、ドラッグ&ドロップ、複数キー押下などをスクリプト的に連結可能。
4. スクロール・JavaScript 実行
-
視野外要素のクリック時は JavaScript スクロールが必要になる場合がある。
-
例:
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", target)
5. フォーム部品専用 API
| 要素タイプ | 推奨操作 |
|---|---|
<select> |
from selenium.webdriver.support.ui import Select → Select(elem).select_by_value("JP") |
| チェックボックス & ラジオ | .is_selected() で状態確認し、click() で切替 |
失敗しないためのポイント
-
ページ遷移を伴う処理
-
遷移後の要素を待たずに直接操作すると
StaleElementReferenceException。必ずWebDriverWaitで新しい要素を取得し直す。
-
-
動的クラス名
-
React/Vue などの SPA ではクラス名がハッシュ化されることが多い。
data-testidや安定 ID を開発チームに依頼する。
-
-
リトライ設計
-
ネットワーク遅延・アニメーション完了待ちなど環境要因でテストが不安定となる。
-
共通ユーティリティとして再試行付きの
safe_clickを用意すると保守性が向上。
-
-
テスト読みやすさ
-
ロケータをページオブジェクト(Page Object Pattern)に集約し、アクションはメソッドとして公開。
-
例:
LoginPage(driver).login("user", "pass")
-
まとめ
-
要素取得 は「安定したロケータ選定」+「明示的待機」が柱。
-
基本アクション は
click()/send_keys()/clear()/get_attribute()を押さえ、複合操作はActionChains。 -
実務では「DOM 変化」「非同期処理」に応じたエラーハンドリングを組み込み、再現性の高いスクリプトを目指すことが重要。
ChatGPT4o 生成日:2025/06/21