【Excel VBA×Selenium】ページの読み込み完了を待つ方法|document.readyStateを確認する

みなさんこんにちは。

Excel VBAとSeleniumでWebページを操作していると、画面遷移の直後に次の処理が進み、要素を取得できないことがあります。

その対策としてdriver.Wait 3000など固定時間だけ待つ方法もありますが、ページによって読み込み時間が変わるため、待ちすぎたり時間が足りなかったりします。

今回は、JavaScriptのdocument.readyStateを確認し、ページの読み込みが完了するまで待つ方法をご紹介したいと思います。

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

  • Seleniumで画面遷移後の処理が早すぎてエラーになる人
  • 固定時間のWaitを減らしたい人
  • document.readyStateをVBAから確認したい人

固定時間だけ待つ場合の問題

例えば、次のように3秒固定で待機すると、ページが1秒で開いても必ず3秒待ちます。反対に、読み込みに5秒かかれば待機時間が不足します。

'========================================
' ページを表示する
'========================================
driver.Get "https://example.com"

'========================================
' 3秒間固定で待機する
'========================================
driver.Wait 3000

document.readyStateを確認する

document.readyStateは、現在のドキュメントの読み込み状態を表します。主な値はloading、interactive、completeです。

SeleniumBasicではExecuteScriptを使って、VBAからJavaScriptを実行できます。

Dim readyState As String

'========================================
' 現在のページ読み込み状態を取得する
'========================================
readyState = CStr( _
    driver.ExecuteScript( _
        "return document.readyState;" _
    ) _
)

Debug.Print readyState
Excel VBA×Seleniumでdocument.readyStateがcompleteになったことを確認した画面

completeになるまで待機する

実際の処理では、readyStateがcompleteになるまで繰り返し確認します。

Dim readyState As String
Dim startTime As Date

'========================================
' 待機開始時刻を記録する
'========================================
startTime = Now

Do

    '========================================
    ' 現在の読み込み状態を取得する
    '========================================
    readyState = CStr( _
        driver.ExecuteScript( _
            "return document.readyState;" _
        ) _
    )

    '========================================
    ' completeならループを終了する
    '========================================
    If readyState = "complete" Then
        Exit Do
    End If

    '========================================
    ' 10秒を超えた場合は処理を終了する
    '========================================
    If DateDiff("s", startTime, Now) >= 10 Then
        MsgBox "ページの読み込みが完了しませんでした。"
        Exit Sub
    End If

    '========================================
    ' 100ミリ秒待ってから再確認する
    '========================================
    driver.Wait 100

Loop

ページの状態に合わせて終了するため、固定時間だけ待つ方法より無駄な待機を減らしやすくなります。

動的に表示される要素は別に待機する

document.readyState = completeになっても、JavaScriptの通信で後から追加される一覧やボタンがまだ表示されていない場合があります。

その場合は、FindElementのtimeoutやWaitDisplayedなどで目的の要素が利用できる状態になるまで別途待機してください。

Excel VBA×Seleniumでページ読み込み完了後に動的要素を正常に取得した画面

要素を取得できない場合は、

も参考にしてください。

最後に

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

今回は、Excel VBA×Seleniumでdocument.readyStateを確認し、ページの読み込み完了まで待機する方法をご紹介しました。

固定時間のWaitだけに頼らずページの状態を確認することで、Web操作を安定させやすくなります。動的に追加される要素は、要素単位の待機と使い分けてください。

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

開発依頼について

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

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

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

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

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

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

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

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

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

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

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

コメントを残す

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

CAPTCHA