要素の取得と基本アクション

要素の取得(Element Locating)

1. WebDriver が返す WebElement とは

  • DOM 上の単一ノードを表す Selenium のオブジェクト。

  • 取得後は 遅延評価(lazy evaluation)されるため、あとで実際に利用するときに DOM を再検索する点に注意。

2. 代表的なロケータ戦略(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 側で実施する。

ベストプラクティス

  1. ページ改修に強いロケータ(データ属性や安定したクラス)を用いる。

  2. 取得後すぐに要素が可視・可操作とは限らないため、明示的待機(WebDriverWait + expected_conditions を習慣化する。

python
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC email_box = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.NAME, "email")) )

基本アクション(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

python
from selenium.webdriver.common.keys import Keys search_box.send_keys("Selenium", Keys.ENTER)

2. 属性・状態の取得

プロパティ / メソッド 内容
.text 要素内部の表示文字列(子要素含む)
.get_attribute("value") 値属性など任意の属性を取得
.is_displayed() 表示状態を真偽値で取得
.is_enabled() 操作可能かどうかを取得

3. アクションチェーン(複合操作)

ActionChains によりマウスホバー、ドラッグ&ドロップ、複数キー押下などをスクリプト的に連結可能。

python
from selenium.webdriver import ActionChains actions = ActionChains(driver) actions.move_to_element(menu).pause(0.5).click(sub_item).perform()

4. スクロール・JavaScript 実行

  • 視野外要素のクリック時は JavaScript スクロールが必要になる場合がある。

  • 例: driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", target)

5. フォーム部品専用 API

要素タイプ 推奨操作
<select> from selenium.webdriver.support.ui import SelectSelect(elem).select_by_value("JP")
チェックボックス & ラジオ .is_selected() で状態確認し、click() で切替

失敗しないためのポイント

  1. ページ遷移を伴う処理

    • 遷移後の要素を待たずに直接操作すると StaleElementReferenceException。必ず WebDriverWait で新しい要素を取得し直す。

  2. 動的クラス名

    • React/Vue などの SPA ではクラス名がハッシュ化されることが多い。data-testid や安定 ID を開発チームに依頼する。

  3. リトライ設計

    • ネットワーク遅延・アニメーション完了待ちなど環境要因でテストが不安定となる。

    • 共通ユーティリティとして再試行付きの safe_click を用意すると保守性が向上。

python
def safe_click(driver, locator, timeout=10): el = WebDriverWait(driver, timeout).until( EC.element_to_be_clickable(locator) ) el.click()
  1. テスト読みやすさ

    • ロケータをページオブジェクト(Page Object Pattern)に集約し、アクションはメソッドとして公開。

    • 例: LoginPage(driver).login("user", "pass")


まとめ

  • 要素取得 は「安定したロケータ選定」+「明示的待機」が柱。

  • 基本アクションclick()send_keys()clear()get_attribute() を押さえ、複合操作は ActionChains

  • 実務では「DOM 変化」「非同期処理」に応じたエラーハンドリングを組み込み、再現性の高いスクリプトを目指すことが重要。

ChatGPT4o 生成日:2025/06/21