【Excel VBA×Selenium】ElementClickInterceptedエラーの原因と対処法|別の要素にクリックを邪魔される場合

みなさんこんにちは。

Excel VBAとSeleniumでWebページを操作していると、ボタンは表示されているのにクリックできず、ElementClickInterceptedエラーが発生することがあります。

このエラーは、クリックしたい要素の上にローディング画面やポップアップなどが重なり、別の要素がクリックを受け取ってしまう場合に発生します。

今回は、オーバーレイの確認・待機・スクロール・要素の再取得を行う方法をご紹介したいと思います。

この記事はこんな人におすすめ

  • Seleniumでボタンは見えているのにクリックできない人
  • ElementClickInterceptedエラーの原因を確認したい人
  • ローディング表示が消えてからクリックしたい人

ElementClickInterceptedエラーが発生する例

例えば、ログインボタンの上にローディング用オーバーレイが表示されている状態でクリックすると、エラーになる場合があります。

Dim target As Selenium.WebElement

'========================================
' クリック対象を取得する
'========================================
Set target = driver.FindElementByCss( _
    "#loginButton" _
)

'========================================
' 対象をクリックする
'========================================
target.Click
Excel VBA×SeleniumでElementClickInterceptedエラーが発生した画面

要素は存在しているため、クリック位置を別の要素が覆っていないか確認することがポイントです。

オーバーレイを確認して非表示になるまで待つ

通信中のローディング表示やモーダルが重なっている場合は、開発者ツールで対象要素のidやclassを確認します。

Dim overlay As Selenium.WebElement

'========================================
' オーバーレイを取得する
' 見つからない場合はNothingを返す
'========================================
Set overlay = driver.FindElementByCss( _
    "#loadingOverlay", _
    raise:=False _
)

'========================================
' 存在する場合は非表示になるまで待つ
'========================================
If Not overlay Is Nothing Then
    overlay.WaitDisplayed False, 10000
End If

WaitDisplayed Falseとすると、要素が表示されなくなるまで待機できます。固定時間だけ待つ方法より、画面の状態に合わせて処理しやすくなります。

スクロール後に要素を再取得してクリックする

固定ヘッダーなどが重なる場合は、対象要素を画面内へスクロールします。表示状態が変わったあとは、要素を再取得してからクリックします。

'========================================
' 対象要素までスクロールする
'========================================
target.ScrollIntoView False

'========================================
' 現在のDOMから要素を再取得する
'========================================
Set target = driver.FindElementByCss( _
    "#loginButton", _
    timeout:=10000, _
    raise:=False _
)

'========================================
' 取得できた場合のみクリックする
'========================================
If Not target Is Nothing Then
    target.Click
Else
    MsgBox "対象要素を取得できませんでした。"
End If

ElementNotInteractableとの違い

ElementNotInteractableは対象要素そのものが非表示・無効などで操作できない場合、ElementClickInterceptedは別の要素がクリック位置を覆っている場合に確認したいエラーです。

ElementNotInteractableについては「ElementNotInteractableエラーの原因と対処法」も参考にしてください。

最後に

いかがでしたでしょうか。

今回は、Excel VBA×SeleniumでElementClickInterceptedエラーが発生した場合の原因と対処法をご紹介しました。

ボタンが見えているのにクリックできない場合は、オーバーレイやポップアップなど別の要素が重なっていないか確認してください。待機、スクロール、再取得の順番で確認すると原因を切り分けやすくなります。

少しでも参考になれば幸いです。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA