could not be scrolled into view
Python による WEB スクレイピングで、以下のようなコードを実行しようとしたところ、could not be scrolled into view
が発生した。
element = driver.find_element(by=By.ID, value="hoge")
element.click()
エラー
selenium.common.exceptions.ElementNotInteractableException: Message: Element <button class="hogehoge" type="button"> could not be scrolled into view
解決しなかった策
エラーを調べたところ、エレメントがクリックできない状態にあるという情報があり、以下のコードを試したが、解決せず。
wait = WebDriverWait(driver=driver, timeout=10)
element = wait.until(expected_conditions.element_to_be_clickable((By.ID, "hoge")))
解決策
対象の要素までスクロールしてからクリックさせるようにしたところ失敗しなくなりました。
その際少し待たないと同じように失敗したので、スリープを入れています。
elem = self.wait.until(expected_conditions.element_to_be_clickable((By.ID, "hoge")))
elem.location_once_scrolled_into_view
time.sleep(1)
element.click()
ヘッドレスブラウザでの操作は見える範囲でないとクリックできない?
スクロールしなくても要素は見つかっているはずですが・・
もう少し調査する必要がありそうです。
追記 2024/01/20
seleniumのスクロールのページを見ました。
以下のことが書いてありました。
This is the most common scenario. Unlike traditional click and send keys methods, the actions class does not automatically scroll the target element into view, so this method will need to be used if elements are not already inside the viewport.
日本語訳
これは最も一般的なシナリオです。従来のクリックしてキーを送信するメソッドとは異なり、アクション クラスはターゲット要素をビューに自動的にスクロールしないため、要素がまだビューポート内にない場合はこのメソッドを使用する必要があります。
viewportにない場合はクリックできないということでしょうか。
確かに人がクリックするにはスクロールしないとダメですが、、
JSでのclickと同じと思っていましたが、スクレイピングは違ったようです。
どちらかというとRPA寄り?
まだまだ勉強が必要です。
追記 2024/02/10
実行をDocker上でやっていたので気づかなかったのですが、ホストOSから実行するとブラウザが立ち上がって自動操作するんですね。(Test CafeとかRPAみたいな)
クリックできないとかそういうエラーが腑に落ちました。