はじめに
PythonでSeleniumを用いたスクレイピングのプログラムを作成し、依頼者のパソコンで動作確認を行ったところ、「ElementClickInterceptedException」というエラーが発生しました。本記事では、その原因と解決方法について記録としてまとめます。
発生したエラーの概要
作成したプログラムは、あるサイトにアクセスしてログインボタンをクリックするという基本的な操作を行うものです。私のパソコンでは問題なく動作していたのですが、依頼者のパソコンで実行した際に、ログインボタンをクリックする処理で以下のようなエラーが発生しました。
selenium.common.exceptions.ElementClickInterceptedException
このエラーの原因を調査した結果、Seleniumは画面に表示されていない(画面外にある)要素に対してはclick()が実行できないという仕様があることがわかりました。
原因:画面サイズの違いによる要素の非表示
私の環境と依頼者の環境では画面サイズ(解像度)が異なっており、その違いにより、対象のボタンが画面外に表示されていたことが原因でした。Seleniumは目視で表示されていないボタンに対しては、element.click()
では操作できないため、クリック操作に失敗していたことになります。
解決方法:JavaScriptのexecute_script()メソッドを使用する
このような場合には、JavaScriptを使用して強制的に要素をクリックさせる方法が有効です。Seleniumのexecute_script()
メソッドを使うことで、画面に表示されていない要素でもクリックが可能となります。
以下に、実際のプログラム例を記載いたします。
# Chromeを起動する
browser = webdriver.Chrome(ChromeDriverManager().install())
browser.implicitly_wait(3)
# サイトのログインページにアクセスする
browser.get("サイトのログインページのURL")
browser.implicitly_wait(3)
# ログインボタンを取得し、JavaScriptでクリックする
login = browser.find_element(By.NAME, "action")
browser.execute_script("arguments[0].click();", login)
browser.implicitly_wait(3)
プログラムの解説
- 1〜3行目:Chromeブラウザを起動し、ブラウザオブジェクトを
browser
という変数に格納しています。 - 4〜6行目:対象のサイトにアクセスしています。
"サイトのログインページのURL"
の部分には実際のURLを記載してください。 - 7〜10行目:ログインボタンをJavaScriptでクリックする処理です。
- 8行目:
By.NAME
でログインボタンを特定し、login
という変数に格納します。私の場合はname="action"
の要素でした。 - 9行目:
execute_script()
を使用し、対象の要素を強制的にクリックしています。通常のlogin.click()
ではエラーになっていました。 - 10行目:クリック後の遷移に備えて待機時間を設定しています。
おわりに
今回のエラーは、画面解像度の違いによってボタンが表示領域外になっていたことが原因でした。Seleniumで画面外の要素をクリックする必要がある場合は、JavaScriptによるクリック処理を導入することで対応できます。
同様のエラーでお困りの方にとって、少しでも参考になれば幸いです。
最後までお読みいただきありがとうございました。