Selenium

Seleniumで「’WebDriver’ object has no attribute ‘find_element_by_○○’」が表示される原因と解決法

この記事は約5分で読めます。

 

最近案件でSeleniumを使用していたのですが、久しぶりに昔に書いたプログラムを実行すると「’WebDriver’ object has no attribute ‘find_element_by_○○’」というエラーが発生するようになっていました。今回はこのエラーが表示される原因と解決法についてメモしておこうと思います。

 

‘WebDriver’ object has no attribute ‘find_element_by_xpathの原因

 

エラー原因はSeleniumのバージョン3とバージョン4でメソッドの書き方が変わったことによる可能性が高いと思われます。

 

Seleniumのバージョンを確認する

 

まずは今使っているSeleniumのバージョンを確認してみてください。

以下のコードで確認できます。

 

import selenium
print(selenium.__version__) # 多分4.1.0 より大きい数字が表示されるはず

 

関連記事:Seleniumで「no such element: Unable to locate element」が出る原因

 

対処方法について

 

対処法は2つあります。

Seleniumのバージョンを下げてインストールし直す

・Selenium4.1以降の書き方にコードを書き換える

 

1つ目のバージョンを下げる場合は以下のコマンドでバージョンを下げてインストールし直すことができます。

 

$ pip install selenium==3.141.0

 

ただ他ライブラリとの依存性の話もあるので、環境によってはもしかすると上手くいかないかもしれません。

 

2つ目はシンプルにコードをSelenium4.1以降の書き方に変えるという方法です。

対応は下記に記載しています。

 

Slenium4以降のHTML要素の参照方法

 

Selenium4.1以降では第一引数にBy~で要素の種類を指定することになりました。関数名でidなのかnameなのかを指定するのではなくなって、確かにこっちの方が使いやすくなるかなとは思います。

 

from selenium import webdriver
from selenium.webdriver.common.by import By

 

nameからHTML要素を参照する

 

driver.find_element_by_name("name").send_keys("test1") ※Ver3
driver.find_element(By.NAME,"name").send_keys("test1") ※Ver4

 

idからHTML要素を参照する

 

driver.find_element_by_id("age_2").click() ※Ver3
driver.find_element(By.ID,"age_2").click() ※Ver4

 

classからHTML要素を参照する

 

class_arr1 = driver.find_elements_by_id("Form-Item-Input") ※ver3
class_arr2 = driver.find_elements(By.CLASS_NAME,"Form-Item-Input") ※Ver4

 

xpathからHTML要素を参照する

 

driver.find_element_by_xpath("/html/body/form/div/div[4]/textarea").send_keys("textarea1") ※ver3
driver.find_element(By.XPATH,"/html/body/form/div/div[4]/textarea").send_keys("textarea2") ※Ver4

 

CSS SelectorからHTML要素を参照する

 

driver.find_element_by_css_selector("body > form > div > div:nth-child(4) > textarea").send_keys("textarea1") ※Ver3
driver.find_element(By.CSS_SELECTOR,"body > form > div > div:nth-child(4) > textarea").send_keys("textarea2") ※Ver4

 

複数のHTML要素の参照

 

driver.find_element(By.NAME,"name").send_keys("xxxxx") ※単数
driver.find_elements(By.NAME,"name").send_keys("xxxxx") ※複数

find_element」とすれば単一の要素取得、「find_elements」とすれば複数の要素取得になります。

 

個人的には別に前の書き方のままでよかったんじゃないかなと思いますが、Tweepyとかライブラリのメソッドはバージョンによってメソッド名や引数設定の方法が異なることがあるので、バージョン確認大事って感じですね。では~

 

コメント

  1. […] 関連記事:Seleniumで「WebDriver; object has no attribute find_element_by_○○」が表示される原因と解決法 […]

タイトルとURLをコピーしました