.click()が実行できない

selenium.webdriverで要素をクリックできない時

まず最初に考えるべきこと

.click()が成功した時の返り値はNoneです.

そうならないならば,エラーの原因を特定することが大切です.

要素の取得に失敗している

要素が正しく取得できているかどうかは,デバッグコンソール上で簡単に確認できます.

要素は取得できているが,.click()ができない

is not clickable at point

このエラーが出ている時は,クリックしたい要素は取得できているが,webdriver上でその要素が表示されていない可能性があります.

Qiitaというサイトを例に挙げます.次の画像の赤色で囲まれている「もっと読む」というボタンを押したい場面を考えます.

f:id:wiwijohnson:20211015012614j:plain

要素の取得に成功していることが確認できているにもかかわらず,クリックを実行した場合に前述のエラーが出るときは,webdriver上でそのボタンを捉えられていないケースが考えられます.

f:id:wiwijohnson:20211015014016j:plain

通常,サイトが開かれた直後の画面はこのように表示されており,「もっと読む」ボタンを押すためには画面をそのボタンが表示されるまで下にスクロールする必要があります. それを実現するコード例は以下の通りです.

button = driver.find_elements_by_xpath(xpath)[index]
driver.execute_script("arguments[0].scrollIntoView(true);", button)
button.click()

一行目でクリックしたい要素を取得します.driver.find_elements_by_xpath()関数はリストを返すことに気をつけてください.

二行目が今回の肝の部分です.argumentsはexecute_scriptにおける第二引数以降を格納しています.今回の場合は,第二引数のbuttonをarguments[0]として取得しています.buttonに対してscrollIntoView(true)を実行することで,その要素がwebdriver上において画面内に入るまで自動でスクロールをしてくれます.詳しくは Element.scrollIntoView() - Web API | MDNをご覧ください.

三行目で要素を実際にクリックします.

以上の手順を踏めば,無事.click()がNoneを返してくれるはずです.