find_elementとfind_elementsの違い

2021年1月26日

概要

Seleniumには

  1. find_element_by_xpath()
  2. find_elements_by_xpath()

という、よく似た関数(メソッド)があります。

取得できる内容(戻り値)の違い

  1. driver.find_element_by_xpath('XPath記述') がXPath指定した要素を返すのに対し、
  2. driver.find_elements_by_xpath('XPath記述') は取得した要素のリスト(配列)を返します

例1

div要素(id指定)
  コード 戻り値のタイプ 内容
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

div要素(name指定)
  コード 戻り値のタイプ 内容
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で要素の順番を指定します。

  1. driver.find_element_by_xpath('//div[1][@name="a"]’)
  2. driver.find_element_by_xpath('//div[2][@name="a"]’)
  3. driver.find_element_by_xpath('//div[3][@name="a"]’)

Bの配列の中身は〔要素1,要素2,要素3〕です。
各要素を取得するには、配列の要素数を指定します。

  1. driver.find_elements_by_xpath('//div[@name="a"]’)[0]
  2. driver.find_elements_by_xpath('//div[@name="a"]’)[1]
  3. 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>

2021年1月26日Selenium Tips要素の取得

Posted by sj