SeleniumはWebアプリケーションの自動テストにおいて広く使われているツールですが、その中でもXPathは非常に重要な役割を果たします。XPathを理解し正しく使うことで、複雑なDOM構造の中からターゲットの要素を正確に取得できるようになります。
本記事では、XPathの基本からSeleniumでの実用的な使い方まで、例を交えながら詳しく解説します。
目次
-
XPathとは?
-
XPathの基本構文
-
絶対パスと相対パスの違い
-
XPathの演算子と関数
-
SeleniumでXPathを使う方法
-
よくあるXPathの使い方パターン
-
トラブルシューティング
-
まとめ
XPathとは?
XPath(XML Path Language)は、XMLやHTMLドキュメント内の要素を検索・選択するための言語です。Seleniumでは、XPathを使って要素を特定し、自動操作を行うことができます。
たとえば、以下のようなHTMLがあったとします:
- リンゴ
- バナナ
- オレンジ
この中の「バナナ」要素をXPathで指定するには:
//li[text()="バナナ"]
XPathの基本構文
XPathには主に以下のような構文があります:
構文 説明
//tagname 指定したタグ名の要素を全体から取得
//div[@id='main'] 属性が一致する要素を取得
//input[@type='text'] type属性が"text"のinput要素
//ul/li[2] 2番目のli要素
//a[contains(text(), 'ログイン')] テキストに「ログイン」を含むa要素
絶対パスと相対パスの違い
絶対パス:HTMLのルートから特定の要素までの完全なパス
/html/body/div/ul/li[2]
相対パス://から始まり、どこにあっても一致する要素を対象にできる柔軟な方法
//li[2]
ヒント:自動テストでは相対パスの使用が推奨されます。ページ構造の変更に柔軟に対応できるからです。
XPathの演算子と関数
XPathはさまざまな演算子や関数をサポートしています:
演算子/関数 例 説明
text() //p[text()='ようこそ'] テキストが一致する要素
contains() //a[contains(text(), '詳細')] テキストに一部一致する
starts-with() //input[starts-with(@id, 'user')] IDが"user"で始まるinput
and / or //input[@type='text' and @name='username'] 複数条件の指定
SeleniumでXPathを使う方法
PythonとSeleniumを使ってXPathを活用する方法を見ていきましょう。
必要なライブラリのインストール bash
pip install selenium
簡単なスクリプト例
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
XPathを使って要素を取得
element = driver.find_element(By.XPATH, "//h1[text()='Example Domain']")
print(element.text)
driver.quit() このスクリプトでは、XPathでタグの中に"Example Domain"というテキストを持つ要素を取得しています。
よくあるXPathの使い方パターン
1. ボタンをクリックする
driver.find_element(By.XPATH, "//button[@id='submit']").click()
2. 入力フィールドに文字を入力
driver.find_element(By.XPATH, "//input[@name='email']").send_keys("test@example.com")
3. リストの中の特定の要素を選ぶ
driver.find_element(By.XPATH, "//ul/li[3]").click()
4. クラス名に一部一致
class名に"active"が含まれているdiv
driver.find_element(By.XPATH, "//div[contains(@class, 'active')]")
トラブルシューティング
XPathを使用する際、以下のような問題がよく発生します:
要素が見つからない
ページの読み込みが完了していない
XPathの指定が間違っている
フレーム内に要素がある
対策:
WebDriverWaitを使って要素の表示を待つ
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.XPATH, "//div[@id='main']"))
)
まとめ
XPathはSeleniumで要素を操作する上で非常にパワフルな手段です。単純な要素取得から、複雑な条件付きの検索まで対応できるため、実践的なスクリプト作成には欠かせません。