Seleniumを使っていて、要素をclick()しようとした際に”Element is not clickable at point”エラーが発生しました。
短い内容ですが、このエラーがと対処法について記載します。
前提
本記事はSelenium x ChromeDriver x Headless Chromiumで構成されている前提で書かれています。
使用するブラウザ等によって違いはあるかもしれませんので、ご承知おきください。
エラー内容
このエラーは指定した要素のある座標がクリックできないというものです。
ブラウザの画面内に対象となる要素がない場合に発生します。
なお、私の場合、この事象はHeadlessモードでも発生しました。
「Headlessモードは画面表示しないから関係ない」と思っていると深みにハマるので、気をつけてくださいね。
対処法
画面におさまっていないのが要因なので、対処法としては画面におさめることです。
具体的にやることは、以下のどちらかになるでしょう。
- 画面サイズを大きくしておさまるようにする
- スクロールして画面内におさめる
画面サイズを大きくしておさまるようにする
要素が画面上部にあるようなら、最初から画面サイズを大きくしておく形でも良いかもしれません。
from selenium import webdriver
# WebDriverのパスを設定
driver = webdriver.Chrome(executable_path='path_to_chromedriver.exe')
# ブラウザウィンドウのサイズを設定
driver.set_window_size(1024, 768) # 幅 1024 ピクセル、高さ 768 ピクセル
# 要素のあるページを開く
driver.get(url)
別の書き方もあるようです。
from selenium import webdriver
# ブラウザ立ち上げ時に指定するオプションを生成
chrome_options = webdriver.ChromeOptions()
# ウィンドウサイズを指定する(例. 1024x768)
chrome_options.add_argument('--window-size=1024,768')
# オプションを指定してブラウザ立ち上げ
driver = webdriver.Chrome(executable_path='path_to_chromedriver.exe', chrome_options=chrome_options)
driver.get('https://www.example.com')
スクロールして画面内におさめる
要素がページの冒頭ではなく下の方にあるようでしたら、ウィンドウを大きくするのではなくスクロールする方が適切です。
スクロールするには、JavaScriptのスクロールのためのメソッドを利用します。
# スクロールを実行(例: 500ピクセル下にスクロール)
driver.execute_script("window.scrollBy(0, 500);")
マウス操作をシミュレートしてスクロールすることも可能です。
やり方を2種類紹介します。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
...{driver立ち上げ&ページを開く処理}
# スクロール実行例1. 500ピクセル下にスクロール
actions = ActionChains(driver)
actions.send_keys(Keys.PAGE_DOWN).perform()
# スクロール実行例2. 指定の要素までスクロール
element = driver.find_element_by_id('element_id')
actions = ActionChains(driver)
actions.move_to_element(element).perform()
まとめ
クリック可能な要素でclick()した際、”Element is not clickable at point”エラーが発生した場合は
- 画面サイズを大きくしておさまるようにする
- スクロールして画面内におさめる
で、クリックできるようになるという内容でした。
繰り返しになりますが、Headlessモードでも起きるので注意が必要です。
ちょっとしたことだけど、結構やっちゃいそうな問題ですよね。