結論
指定した要素がDOM上には存在しているが、対話(操作)可能な状態になっていない。そんな要素を操作しようとしたことで発生する例外のようです。
実際に起きたこと
seleniumを使用した個人のpythonプログラムを作っていました。作成後しばらくは意図通りに実行できていました。ところがある時を境にElementNotInteractableException
という例外が発生し、正しく実行しなくなりました。
調査
以下の記事を参考にしました。
多くの場合、以下のようなfind_element
関数を使って要素を検索し、見つけた要素に対してclickなどをすると思います。
driver.find_element(...)
発生した例外は「要素を見つけることはできた。でもディスプレイに表示されていないなどの理由から操作できない。」というような要素を操作しようとしたことで投げられたようです。
今回の場合
以下を用いてブラウザのウィンドウサイズを大きくすることで解決できました。
driver.set_window_size(width, height)
解決までの流れは以下です。
-
ElementNotInteractableException
が発生。 - 例外について調査したところ、操作できない要素を操作しようとしたことで投げられた例外であることが分かる。
- GoogleColab上1で実行していたため、一度ブラウザで対象のWebページにアクセスして画面の様子を目視確認する。
- 確認したところ、指定のWeb要素が操作できないようには見えない。
- pythonのコードで対象のWebページにアクセスした直後の画面の様子をスクリーンショットにしてGoogleドライブに保存。2
- スクリーンショットを確認したところ、画面がスマホ版のものになっていた。
- 改めてコードを確認したところ、
driver.set_window_size
でウィンドウサイズを指定していた箇所があり、そのサイズが明らかに小さかった。 -
driver.set_window_size
の引数を大きくして実行したところ、ElementNotInteractableException
が発生することはなくなった。
おわりに
操作できない原因はそれぞれの状況によって変わってくるため、それに応じて解決の対応が変わってくるかと思います。ですが1つの例として今回の記事が参考になれば幸いです。