Seleniumを使ってWebブラウザと対話するとき、初めにすることが対話したい要素を取得することだと思います。要素を取得したらその要素をクリックしたり、要素にキーを送信したりすることができます。
この記事ではWebページの特定の要素を取得する方法をまとめます。
要素の検索
WebDriverオブジェクトには、ページ上の要素を見つけるために次の2つのメソッドが用意されています。
- find_element()
- find_elements()
find_element()メソッドは、クエリに一致するページ上の最初の要素を表す単一のWebElementオブジェクトを返します。 find_elements()メソッドは、ページ上の一致する要素ごとにWebElementオブジェクトのリストを返します。
次の例は要素のid属性の値で要素を検索します。
from selenium import webdriver
from selenium.webdriver.common.by import By
>>> driver = webdriver.Firefox()
>>> driver.get('https://pythonmaniac.com/selenium-find-element/')
elem = driver.find_element(By.ID, '//button[text()="Some text"]')
上記のようにfind_element()およびfind_elements()メソッドには、1つ目の引数に検索する方法をByクラスの属性で指定し、2番目の引数に検索する値を指定します。
find_element()およびfind_elements()で使用できるByクラスの属性には次のものがあります。
Byクラスの属性 | 属性で検索する |
---|---|
ID | HTMLのid属性の値で検索 |
NAME | HTMLのname属性の値で検索 |
XPATH | XPathを指定 |
LINK_TEXT | リンクテキスト |
PARTIAL_LINK_TEXT | |
TAG_NAME | HTMLのタグ名 |
CLASS_NAME | CSSのclassの値で検索 |
CSS_SELECTOR | CSSのセレクタ |
*_by_tag_name()メソッドを除き、すべてのメソッドの引数では大文字と小文字が区別されます。メソッドが探しているものと一致する要素がページ上に存在しない場合、SeleniumモジュールはNoSuchElement例外を発生させます。この例外によってプログラムがクラッシュしたくない場合は、コードにtry ステートメントとExceptステートメントを追加します。
find_element()およびfind_elements()メソッドで要素が見つからない場合は、NoSuchElementExceptionが発生します。
IDによる検索
要素のid属性の値がわかっているときに使用します。
次の例はこのページの「検索で使用するサンプルHTML」のid属性の値として「myid」を持つ要素を取得します。
>>> elem = driver.find_element(By.ID, 'myid')
>>> elem.text
'IDで検索'
一致するid属性を持つ要素が見つからない場合はNoSuchElementExceptionが発生します。
NAMEによる検索
要素のname属性で検索する。一致するname属性を持つ最初の要素が返されます。
>>> elem = driver.find_element(By.NAME, 'myname')
>>> elem.send_keys("NAMEによる検索")
一致するname属性を持つ要素が見つからない場合はNoSuchElementExceptionが発生します。
XPATHによる検索
XPathは、XML文書の要素を特定するための仕様ですが、HTMLに対しても機能します。XPathは様々な条件で要素を特定することができるため、特定の要素を指定するXPathはいくつも考えられますので、状況に応じて適切なXPathを与える必要があります。
ここではもっとも単純な絶対パスで要素を特定します。
リンクテキストによるハイパーリンクの検索
aタグで使用されているリンクテキストがわかっている場合はこれを使用します。指定された値に一致するリンクテキストを持つ最初の要素が返されます。一致するリンクテキスト属性を持つ要素が見つからない場合はNoSuchElementExceptionが発生します。
elem_byid = driver.find_element(By.LINK_TEXT, '検索で使用するサンプルHTML')
elem.text
タグ名による検索
タグ名で要素を検索します。指定されたタグ名を持つ最初の要素が返されます。
>>> elem = driver.find_element(By.TAG_NAME, 'h2')
>>> elem.text
'要素の検索'
>>> elem = driver.find_element(By.TAG_NAME, 'H2')
>>> elem.text
'要素の検索'
指定される要素の名前は大文字と小文字は区別されません。一致するタグ名を持つ要素が見つからない場合はNoSuchElementExceptionが発生します。
>>> elems = driver.find_elements(By.TAG_NAME, 'H2')
>>> for e in elems:
... e.text
...
'要素の検索'
'まとめ'
'この記事を書いた人'
'関連記事'
クラス名による検索
要素のclass名で検索します。一致するclass名ぞk末位を持つ最初の要素が返されます。一致するクラス名を持つ要素が見つからない場合はNoSuchElementExceptionが発生します。
elem = driver.find_elements(By.CLASS_NAME, 'myclass')
CSSセレクタによる検索
CSSセレクタに一致する最初の要素が返されます。CSSセレクタに一致する要素が見つからない場合、NoSuchElementExceptionが発生します。
検索で使用するサンプルHTML
IDで検索
クラス名で検索
まとめ
参考サイト:Locating Elements | Selenium with Python