【Python】SeleniumでAttributeError: 'WebDriver' object has no attributeの対処方法
2023.03.03 /
本記事ではPythonのSeleniumにおける、AttributeError: 'WebDriver' object has no attributeのエラーが発生した際の対処方法について解説していきます。
今まで問題なくPythonのSeleniumでスクレイピングアプリケーションを作成できていたのに、突然AttributeError: 'WebDriver' object has no attributeが発生したという方は非常に多いと思います。
AttributeErrorが発生した原因とその対処方法について、本記事を通して理解を深めてください。
Seleniumで発生したエラー
Seleniumとはブラウザを操作・制御するためのモジュールであり、スクレイピングによるデータ収集やRPAによるブラウザ操作の自動化といったアプリケーション作成に利用されます。
いつも通りにPythonでSeleniumを利用したプログラムを作成し、実行すると以下のエラーが発生するようになりました。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu');
options.add_argument('--disable-extensions');
options.add_argument('--proxy-server="direct://"');
options.add_argument('--proxy-bypass-list=*');
options.add_argument('--start-maximized');
options.add_experimental_option("excludeSwitches", ['enable-automation'])
chromedriver = 'C:\OFFICE54\chromedriver.exe'
service = Service(executable_path=chromedriver)
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://office54.net/")
selector = driver.find_element_by_css_selector("div table.table")
AttributeError: 'WebDriver' object has no attribute 'find_element_by_css_selector'
上記のエラーはWebDriverにfind_element_by_css_selectorが存在しないという内容です。find_element_by_css_selectorはWebページのHTML要素を検索するためのメソッドです。
AttributeError: 'WebDriver' object has no attributeの原因
AttributeError: 'WebDriver' object has no attributeの原因は、seleniumのバージョン4.3.0からfind_element_by_*とfind_elements_by_*のメソッドが廃止されたからです。
githubのseleniumページには次のように記載があります。
Selenium 4.3.0
* Deprecated find_element_by_* and find_elements_by_* are now removed (#10712)
そのためseleniumをバージョンアップした後に、今までのようにfind_element_by_*メソッドを利用すると今回のエラーが発生するのです。
AttributeError: 'WebDriver' object has no attributeの解決方法
AttributeError: 'WebDriver' object has no attributeのエラーを解決する方法として以下2つの方法があります。
- seleniumのバージョン4.3.0より以前のバージョンをインストール
- seleniumのバージョン4系の記述に合わせる
それぞれの方法について解説していきます。
seleniumのバージョン4.3.0より以前のバージョンをインストール
seleniumのバージョン4.3.0より以前のバージョンをインストールすることでfind_element_by_*メソッドがプログラムで利用できるようになります。
まずは以下コマンドを実行して現在の環境からseleniumをアンインストールします。
>>> pip uninstall selenium
次に4.3.0以前のバージョンを指定してseleniumをインストールします。
>>> pip install selenium==4.1.0
上記の操作により、エラーが発生せずにfind_element_by_*メソッドが使えるようになります。
バージョンを下げることによりfind_element_by_*メソッドが使えるようになりますが、selenium4系では次のようなWarningが発生します。
DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
seleniumのバージョン4系の記述に合わせる
プログラムのコードを修正できるのであれば、seleniumのバージョンを下げるのではなくバージョン4系の記述方法に合わせてください。
今だにseleniumの使い方を解説しているサイトでは、旧バージョンのfind_element_by_*メソッドのみしか解説していないものもありますので注意してください。
新しいバージョンのseleniumでは、HTML要素の検索にはfind_element()メソッドを使用します。以下に使用例を記します。
<html>
<body>
<form id="form">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="login" type="submit" value="login" />
</form>
</body>
</html>
from selenium.webdriver.common.by import By
element_form = driver.find_element(By.ID, 'form')
element_username = driver.find_element(By.NAME, 'username')
詳しいfind_element()メソッドの使い方については以下記事をご参照ください。
【Python】Selenium:ブラウザ操作して静的・動的(Ajax、javascript)ページから情報を取得
まとめ
本記事「【Python】SeleniumでAttributeError: 'WebDriver' object has no attributeの対処方法」はいかがでしたか。
本記事で解説した重要なことを以下にまとめます。
- AttributeErrorはSeleniumのバージョンアップによって引き起こされた
- selenium4.3.0からはfind_element_by_*メソッドは使用できない
- エラーを回避するために、バージョンを下げるかfind_element()メソッドを使用する
ぜひこの機会に新しいfind_element()メソッドを使えるようになりましょう。