最近案件でSeleniumを使用していたのですが、久しぶりに昔に書いたプログラムを実行すると「’WebDriver’ object has no attribute ‘find_element_by_○○’」というエラーが発生するようになっていました。今回はこのエラーが表示される原因と解決法についてメモしておこうと思います。
Contents
‘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とかライブラリのメソッドはバージョンによってメソッド名や引数設定の方法が異なることがあるので、バージョン確認大事って感じですね。では~
コメント
[…] 関連記事:Seleniumで「WebDriver; object has no attribute find_element_by_○○」が表示される原因と解決法 […]
[…] 関連記事:Seleniumで「’WebDriver’ object has no attribute ‘find_element_by_○○’」が表示される原因と解決法 […]
[…] Seleniumで「’WebDriver’ object has no attribute ‘find_element_by_○○’」が表示される原因と解決法 […]
[…] Seleniumで「’WebDriver’ object has no attribute ‘find_element_by_○○’」が表示される原因と解決法 […]
[…] 関連記事:Seleniumで「’WebDriver’ object has no attribute ‘find_element_by_○○’」が表示される原因と解決法 […]