【Excel VBA×Selenium】Timeoutエラーの原因と対処法|待機時間を超えて要素を取得できない場合

みなさんこんにちは。

Excel VBAとSeleniumでWebページを操作していると、指定した待機時間内に要素を取得できず、Timeoutエラーになることがあります。

単純に待機時間が短い場合もありますが、セレクターが間違っている、要素がまだ表示されていない、JavaScriptで後から追加されるなど、原因はさまざまです。

今回は、SeleniumBasicで要素取得時にタイムアウトする場合の確認ポイントと対処法をご紹介したいと思います。

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

  • Selenium VBAでTimeoutエラーが発生する人
  • 待機時間を延ばしても要素を取得できない人
  • 要素取得の失敗を安全に処理したい人

Timeoutエラーが発生する主な原因

Timeoutエラーが発生した場合は、最初から待機時間だけを長くするのではなく、何を待っているのかを確認することが大切です。

  • 指定した時間内に要素がDOMへ追加されていない
  • CSSセレクターやIDなどの指定が間違っている
  • 要素は存在するが、まだ表示されていない
  • 画面遷移やJavaScriptの処理が完了していない
Excel VBA×Seleniumで要素の表示待機時間を超えてTimeoutエラーが発生した画面

timeout値とセレクターを確認する

SeleniumBasicのFindElementByCssなどでは、timeoutをミリ秒単位で指定できます。

Dim target As Selenium.WebElement

'========================================
' 最大5秒間、対象要素が現れるまで待つ
'========================================
Set target = driver.FindElementByCss( _
    "#loginButton", _
    timeout:=5000, _
    raise:=False _
)

例えば5000なら最大5秒間待機します。ただし、待機時間を長くしてもセレクター自体が間違っていれば要素は取得できません。

ブラウザの開発者ツールなどで、指定しているIDやCSSセレクターが現在のHTMLと一致しているか確認してください。

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

要素を取得できても、まだ画面上に表示されていない場合があります。その場合はWaitDisplayedで表示されるまで待機できます。

'========================================
' 要素を取得できた場合だけ処理する
'========================================
If Not target Is Nothing Then

    '========================================
    ' 最大5秒間、表示されるまで待機する
    '========================================
    target.WaitDisplayed _
        displayed:=True, _
        timeout:=5000

End If

要素の存在を待つ処理と、表示されるのを待つ処理は別に考えると原因を切り分けやすくなります。

Excel VBA×Seleniumで対象要素が存在しているがまだ表示されていないことを確認した画面

raise=Falseで安全に再取得する

要素が見つからない可能性がある場合は、raise:=Falseを指定すると、タイムアウト時に例外を発生させずNothingとして確認できます。

Dim target As Selenium.WebElement

'========================================
' 最大10秒間、対象要素を探す
'========================================
Set target = driver.FindElementByCss( _
    "#loginButton", _
    timeout:=10000, _
    raise:=False _
)

'========================================
' 取得できなかった場合
'========================================
If target Is Nothing Then

    MsgBox "対象要素を取得できませんでした。"
    Exit Sub

End If

'========================================
' 取得できた要素をクリックする
'========================================
target.Click
「Excel VBAのSeleniumで要素の表示を待機し、正常に取得できたことを示す成功ダイアログ」

ページ読み込み待ちと要素待ちは使い分ける

ページ自体の読み込みが終わっていても、JavaScriptによって目的の要素が後から追加されることがあります。

その場合は、ページ全体の読み込み待ちだけでなく、今回のように対象要素を直接待つ方法を組み合わせると安定しやすくなります。

ページ読み込みの確認方法については、

も参考にしてください。

最後に

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

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

待機時間だけを延ばすのではなく、対象要素、セレクター、表示状態を順番に確認することが大切です。

timeoutとraise:=Falseを使い分けながら、要素を取得できなかった場合の処理も用意しておくと安全かと思います。

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

開発依頼について

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

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

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

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

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

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

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

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

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

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

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

コメントを残す

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

CAPTCHA