Selenium 要素の特定
Selenium において、要素の特定は自動テストと Web 操作の核心です。
要素を特定することで、クリック、テキスト入力、属性取得などの操作を行うことができます。
要素特定の基本概念
要素の特定とは?
要素の特定とは、何らかの方法で Web ページ内の特定の要素(ボタン、入力ボックス、リンクなど)を見つけることです。
なぜ要素の特定が必要なのか?
自動操作では、対象の要素を正確に見つけて初めて、クリックや入力などの後続の操作を実行できます。
要素特定の一意性。
特定した要素が一意であることを確認し、誤った要素を操作しないようにします。
特定方法
Selenium には複数の要素特定方法が用意されており、よく使われるものは次のとおりです:
1、ID による特定
方法:find_element(By.ID, "id_value")
説明:要素の id 属性による特定。
from selenium.webdriver.common.by import By element = driver.find_element(By.ID, "username")
2、Name による特定
方法:find_element(By.NAME, "name_value")
説明:要素の name 属性による特定。
element = driver.find_element(By.NAME, "password")
3、Class Name による特定
方法:find_element(By.CLASS_NAME, "class_name")
説明:要素の class 属性による特定。
element = driver.find_element(By.CLASS_NAME, "submit-btn")
4、Tag Name による特定
方法:find_element(By.TAG_NAME, "tag_name")
説明:要素のタグ名による特定(<div>、<input> など)。
element = driver.find_element(By.TAG_NAME, "input")
5、CSS セレクターによる特定
方法:find_element(By.CSS_SELECTOR, "css_selector")
説明:CSS セレクターによる要素の特定。
element = driver.find_element(By.CSS_SELECTOR, "input#username")
6、XPath による特定
方法:find_element(By.XPATH, "xpath_expression")
説明:XPath 式による要素の特定。
element = driver.find_element(By.XPATH, "//input[@id='username']")
7、Link Text による特定
方法:find_element(By.LINK_TEXT, "link_text")
説明:リンクのテキスト内容による特定(<a> タグに適用)。
element = driver.find_element(By.LINK_TEXT, "Click Here")
8、Partial Link Text による特定
方法:find_element(By.PARTIAL_LINK_TEXT, "partial_link_text")
説明:リンクの部分的なテキスト内容による特定。
element = driver.find_element(By.PARTIAL_LINK_TEXT, "Click")
要素特定のベストプラクティス
一意な属性を優先的に使用する:
-
できる限り
id、nameなどの一意な属性で要素を特定します。
動的属性を避ける:
-
要素の属性が動的に生成される場合(ランダム ID など)、これらの属性を直接使用して特定することを避けます。
相対位置特定を使用する:
-
XPath または CSS セレクターを要素の階層関係と組み合わせて特定します。
待機メカニズムを追加する:
-
暗黙的待機または明示的待機を使用して、要素の読み込みが完了してから操作を実行します。
よく使われる要素特定方法
Selenium には複数の要素特定方法が用意されており、各方法は異なるシナリオに適しています。以下はよく使われる要素特定方法です:
1、find_element_by_id
find_element_by_idは要素のid属性で要素を特定します。id属性は HTML 内で一意であるため、この方法は通常最も直接的で効率的です。
例
2、find_element_by_name
find_element_by_nameは要素のname属性で要素を特定します。name属性はフォーム要素で非常に一般的です。
例
3、find_element_by_class_name
find_element_by_class_nameは要素のclass属性で要素を特定します。class属性は通常スタイル定義に使用され、複数の要素が同じものを共有する場合があります。class。
例
4、 find_element_by_tag_name
find_element_by_tag_nameは要素のタグ名で要素を特定します。タグ名は例えばdiv、input、aなどです。
例
5、 find_element_by_css_selector
find_element_by_css_selectorは CSS セレクターで要素を特定します。CSS セレクターは非常に柔軟で、複数の条件を組み合わせて使用できます。
例
6、 find_element_by_xpath
find_element_by_xpathは XPath 式で要素を特定します。XPath は XML ドキュメント内でノードを特定するための言語であり、非常に強力です。
例
7、 find_element_by_link_text
find_element_by_link_textはリンクのテキスト内容で要素を特定します。適用されるのは<a>タグの位置特定です。
例
8、 find_element_by_partial_link_text
find_element_by_partial_link_textはリンクの部分的なテキスト内容で要素を特定します。テキストが長い場合や部分一致のシナリオに適しています。
例
複数の要素を特定する(find_elements)
単一の要素だけでなく、複数の要素を特定する必要がある場合があります。Selenium はfind_elementsメソッドを提供しており、要素のリストを返します。
例
find_elementsメソッドとfind_elementメソッドの使用法は同じですが、返されるのはリストです。
動的要素の特定テクニック
Web アプリケーションでは、一部の要素の属性が動的に生成され、ページをリフレッシュするたびに変化します。このような動的要素を扱う場合は、以下のテクニックを使用できます:
1、相対パスを使用する
XPath または CSS セレクターでは、絶対パスではなく相対パスを使用します。相対パスは、要素の位置の変化による特定失敗を防ぐことができます。
例
2、部分一致を使用する
動的に生成されたid 或 classに対しては、部分一致の方法で要素を特定できます。例えば、contains関数を使用します。
例
3、待機メカニズムを使用する
動的要素はすぐにページに表示されない場合があるため、Selenium の待機メカニズムを使用して要素の出現を待つことができます。
例
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic_id"))
)
4、JavaScript を使用した特定
場合によっては、JavaScript を実行して動的要素を特定できます。
例
総合サンプル
Selenium は豊富な要素特定方法を提供しており、これらの方法を習得することでページ要素を効率的に特定できます。
動的要素に対しては、相対パス、部分一致、待機メカニズム、JavaScript による特定などのテクニックを柔軟に活用することで、自動テストの安定性と信頼性を大幅に向上させることができます。
以下は、複数の特定方法を使用して要素を見つけ、操作を実行する方法を示す完全なサンプルです:
例
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
# ブラウザを起動
service = ChromeService(executable_path="./chromedriver")
driver = webdriver.Chrome(service=service)
# Webページを開く
driver.get("https://www.example.com")
# ID で入力ボックスを特定し、テキストを入力
username = driver.find_element(By.ID, "username")
username.send_keys("testuser")
# Name で入力ボックスを特定し、テキストを入力
password = driver.find_element(By.NAME, "password")
password.send_keys("password123")
# CSS セレクターでボタンを特定してクリック
submit_button = driver.find_element(By.CSS_SELECTOR, "button.submit-btn")
submit_button.click()
# XPath でリンクを特定してクリック
link = driver.find_element(By.XPATH, "//a[text()='Click Here']")
link.click()
# ブラウザを閉じる
driver.quit()