【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

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でdocument.readyStateを確認し、ページの読み込み完了まで待機する方法をご紹介しました。
固定時間のWaitだけに頼らずページの状態を確認することで、Web操作を安定させやすくなります。動的に追加される要素は、要素単位の待機と使い分けてください。
少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
