find_elementとfind_elementsの違い
概要
Seleniumには
- find_element_by_xpath()
- find_elements_by_xpath()
という、よく似た関数(メソッド)があります。
取得できる内容(戻り値)の違い
driver.find_element_by_xpath('XPath記述')
がXPath指定した要素を返すのに対し、driver.find_elements_by_xpath('XPath記述')
は取得した要素のリスト(配列)を返します。
例1
コード | 戻り値のタイプ | 内容 | |
---|---|---|---|
A | driver.find_element_by_xpath ('//div[@id="1″]’) |
要素 | 「要素1」 |
B | driver.find_elements_by_xpath ('//div[@id="1″]’) |
配列 | 「要素1」を配列要素に持つ長さ1の配列 |
Bで取得した配列から要素1を取り出すには
element = driver.find_elements_by_xpath('//div[@id="1"]')[0]
のようにします。
例2
コード | 戻り値のタイプ | 内容 | |
---|---|---|---|
A | driver.find_element_by_xpath ('//div[@name="a"]’) |
要素 | 「要素1」 |
B | driver.find_elements_by_xpath ('//div[@name="a"]’ |
配列 | 「要素1」「要素2」「要素3」を配列要素に持つ長さ3の配列 |
Aの場合、指定したXPathで検索した最初(先頭)の要素が返されます。
各要素を取得するには、XPathで要素の順番を指定します。
- driver.find_element_by_xpath('//div[1][@name="a"]’)
- driver.find_element_by_xpath('//div[2][@name="a"]’)
- driver.find_element_by_xpath('//div[3][@name="a"]’)
Bの配列の中身は〔要素1,要素2,要素3〕です。
各要素を取得するには、配列の要素数を指定します。
- driver.find_elements_by_xpath('//div[@name="a"]’)[0]
- driver.find_elements_by_xpath('//div[@name="a"]’)[1]
- driver.find_elements_by_xpath('//div[@name="a"]’)[2]
A.find_elementのXPathは1始まり、B.find_elementsの配列の要素数は0始まりなので、注意が必要です。
利用方法
では、Seleniumで A.find_elementとB.find_elements に分かれているのはなぜでしょうか?
どういう使い分けがあるかを提示します。
要素の存在チェック
要素が存在しない場合、A.find_element_by_xpath() では例外が発生します。
一方、B.find_elements_by_xpath() では、空のリスト(配列)が返ってきます。
よって、配列の長さ(要素の個数)を見ることで、例外を発生させずに要素の存在チェックが可能です。
要素が存在しない場合
driver.find_element_by_xpath("XPath記述").click() #例外発生
if len(driver.find_elements_by_xpath("XPath記述")) > 0:
driver.find_element_by_xpath("XPath記述").click() #要素が存在しない場合は実行されない
繰り返し処理
B.find_elements_by_xpath()は、配列の要素を添え字で処理できるので、ループ処理で活用できます。
for i in range(len(driver.find_elements_by_xpath("XPath記述"))):
driver.find_elements_by_xpath("XPath記述")[i].click() #各要素についてクリック
上記のようにすれば、指定したXPathで取得した複数要素を、1つ1つ処理することができます。
エラーメッセージ
A.find_element_by_xpath() と B.find_elements_by_xpath() は違いが1文字だけですので、よく間違います。
その場合、エラーメッセージが表示されるので、例外発生時のエラーメッセージで判断します。
if driver.find_element_by_xpath("XPath記述") > 0: #「s」が抜けている
(処理)
エラーメッセージ
TypeError'>' not supported between instances of 'WebElement' and 'int'<traceback object at 0x0000027938982CC8>
driver.find_elements_by_xpath("XPath記述").click() #「s」は不要
エラーメッセージ
AttributeError'list' object has no attribute 'click'<traceback object at 0x0000027938A4A0C8>
ディスカッション
コメント一覧
まだ、コメントがありません