【Excel VBA×Selenium】ElementNotInteractableエラーの原因と対処法|クリックできない場合

みなさんこんにちは。

Excel VBAとSeleniumを使ってWebページを操作していると、要素自体は取得できているのにクリックや文字入力ができず、ElementNotInteractableエラーが発生することがあります。

このエラーは、対象要素が非表示になっている、まだ操作できる状態になっていない、同じ条件に一致する別の要素を取得しているなどの場合に発生します。

今回は、ElementNotInteractableエラーが発生したときに確認したいポイントを順番にご紹介したいと思います。

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

  • Seleniumで要素は取得できるのにクリックできない人
  • ElementNotInteractableエラーの原因を切り分けたい人
  • 表示待ちやスクロール後に要素を操作したい人

ElementNotInteractableエラーが発生する例

例えば、HTML上には存在していても非表示になっているボタンを取得してクリックすると、操作できずエラーになることがあります。

Dim target As Selenium.WebElement

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

'非表示など操作できない状態ではエラーになる場合がある
target.Click
Excel VBA×SeleniumでElementNotInteractableエラーが発生した画面

要素の表示状態を確認する

まず、取得した要素が実際に画面へ表示され、操作可能な状態か確認します。SeleniumBasicではIsDisplayedとIsEnabledを利用できます。

If target.IsDisplayed = False Then
    MsgBox "対象要素はまだ表示されていません。"
    Exit Sub
End If

If target.IsEnabled = False Then
    MsgBox "対象要素はまだ操作できません。"
    Exit Sub
End If

表示されるまで待ってから操作する

JavaScriptなどで後から表示される要素は、取得直後には操作できない場合があります。その場合は表示・有効化を待ってからクリックします。

'========================================
' 最大10秒間、表示・有効化を待つ
'========================================
target.WaitDisplayed True, 10000
target.WaitEnabled True, 10000

'操作可能になってからクリックする
target.Click

画面内へスクロールしてからクリックする

対象要素が画面外にある場合は、クリック前にScrollIntoViewで表示領域へ移動しておくと処理しやすくなります。

'対象要素が見える位置までスクロールする
target.ScrollIntoView

'スクロール後にクリックする
target.Click
Excel VBA×SeleniumでScrollIntoViewを使って対象ボタンを画面内へ表示した状態

同じ条件に一致する要素が複数ないか確認する

同じclassなどを持つ要素が複数存在すると、非表示側の要素を取得してしまう場合があります。その場合は複数要素を取得し、表示されている要素を選びます。

Dim elements As Selenium.WebElements
Dim i As Long

'同じclassを持つ要素をまとめて取得する
Set elements = driver.FindElementsByCss(".action-button")

For i = 1 To elements.Count

    '表示され、操作可能な要素だけを対象にする
    If elements(i).IsDisplayed And _
       elements(i).IsEnabled Then

        Set target = elements(i)
        Exit For

    End If

Next i

画面更新後は要素を再取得する

画面の表示切替やJavaScript処理の後は、古い要素をそのまま使わず、現在のDOMから対象要素をもう一度取得してから操作すると安定しやすくなります。

'表示状態が変わった後に要素を再取得する
Set target = driver.FindElementByCss( _
    "#loginButton", _
    timeout:=10000, _
    raise:=False _
)

If target Is Nothing Then
    MsgBox "対象要素を取得できませんでした。"
    Exit Sub
End If

target.WaitDisplayed True, 10000
target.ScrollIntoView
target.Click
Excel VBA×Seleniumで要素を再取得してログインボタンを正常にクリックした画面

エラー発生時の確認順序

  • 対象要素が画面に表示されているか
  • 要素が有効になっているか
  • 画面外にある場合はスクロールしたか
  • 同じ条件に一致する非表示要素を取得していないか
  • 画面更新後に要素を取得し直しているか

最後に

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

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

要素を取得できていても、その要素が表示・操作可能とは限りません。表示状態、待機、スクロール、取得対象を順番に確認すると原因を切り分けやすくなります。

Seleniumでクリックや入力ができず困ったときに、少しでも参考になれば幸いです。

開発依頼について

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

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

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

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

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

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

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

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

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

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

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

コメントを残す

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

CAPTCHA