seleniumのコードはあっていそうだけどエラーのElementClickInterceptedExceptionが出る。
要素が取得できていないのはページ遷移が読み込めていないから?と疑問に思うことがあります。要素をクリックできなかった原因を考えると下記の2点が考えられます。
①指定するIDやCSSセレクターなどの要素指定が違う
②Webページの要素がなにかしらの原因で読み込まれていないので指定できない
今回は上記②のコードはあっていそうだがElementClickInterceptedExceptionが出る原因の対策方法として「時間待機の方法」と「ジャバスクリプトによる画面外の要素取得」の2点の解説とPythonコードをご紹介します。
ElementClickInterceptedExceptionとは
ElementClickInterceptedExceptionは指定した要素をクリックできなかったエラーになり、コードではclick()を利用したところで当該エラーが発生します。
対策
Webページの読み込みを待つ
Webページが全て読み込まれていない状況で要素をクリックしても要素がないためエラーになります。
この状況を回避するためにはWebページが読み込まれるまで待機するコードを追加します。
from selenium.webdriver.support.ui import WebDriverWait
wait_time_1 = 5
wait_time_2 = 1
driver.implicitly_wait(wait_time_1)
time.sleep(wait_time_2)
ここのdriver.implicitly_wait(wait_time_1)は要素が見つかる最大待機時間を指定します。要素が見つかれば待機時間を待たずに次の動作へ移ります。
time.sleepは指定しなくても大丈夫ですがあった方が応用がきくので入れています。
上記を入れて時間調整すればwebページの読み込みの遅さが原因で要素が取得できない問題をクリアできます。
待機方法などの詳細はSeleniumのWebdriver自動更新とブラウザ操作のPythonコマンドの記事でご紹介しております。
画面外の要素取得はdriver.execute_script()
要素を取得する対象がWebサイトのウインドウ範囲外にありスクロールが必要な場合はジャバスクリプト経由のクリックが必要です。
実際どのようなコードとなるのかを比較して記載します。
#Python通常コード
driver.find_element(By.ID,"要素名").click()
#ジャバスクリプトコード
element = driver.find_element(By.ID,"要素名")
driver.execute_script('arguments[0].click();',element)
上記のジャバスクリプトコードに置き換えることでウインドウ範囲外の要素がクリックできるようになります。
最後に
Web操作系のコードはジャバスクリプトがやっぱり強いですね。Pythonはコードを書く量が少なくて済むので必要な時のみジャバスクリプトコードを併用していくのがおすすめです。
最後に私がPythonの勉強をして入門者から中級者までにこの本1冊あれば習得できるおすすめ本記事も書いております【本1冊で】Python入門から中級までなれるおすすめ本ご興味がある方は御覧くださいませ。
コメント