【Excel VBA×Selenium】ファイルのダウンロード完了を待つ方法|crdownloadが消えるまで確認する

みなさんこんにちは。

Excel VBAとSeleniumでファイルをダウンロードした直後、ファイルを開けず困ったことはないでしょうか。

今回は、Chromeの一時ファイル.crdownloadを確認し、固定のWaitに頼らず完了を待つ方法をご紹介したいと思います。

ダウンロード中のcrdownloadとは

Chromeはダウンロード中に.crdownloadを作る場合があります。完了すると通常のファイル名になります。小さいファイルでは、一時ファイルを確認できないこともあります。

今回はSelenium公式テストページの「File 1」を使用します。

Selenium公式のファイルダウンロード確認ページでFile 1のリンクを表示した画面

サンプルコード

マクロを記述したブックを保存してから実行してください。参照設定には「Selenium Type Library」が必要です。

Option Explicit

Sub WaitChromeDownload()
    Dim driver As New Selenium.ChromeDriver
    Dim folder As String, target As String
    Dim deadline As Date, finished As Boolean

    '保存済みブックの横に専用フォルダを作る
    If ThisWorkbook.Path = "" Then
        MsgBox "先にブックを保存してください。": Exit Sub
    End If
    folder = ThisWorkbook.Path & "\DownloadTest"
    If Dir(folder, vbDirectory) = "" Then MkDir folder
    target = folder & "\file_1.txt"

    '古いファイルによる完了の誤判定を防ぐ
    If Dir(target) <> "" Then Kill target
    If Dir(folder & "\*.crdownload") <> "" Then
        MsgBox "一時ファイルが残っています。": Exit Sub
    End If

    On Error GoTo ErrProc
    'Chrome起動前に保存先を指定する
    driver.SetPreference "download.default_directory", folder
    driver.SetPreference "download.prompt_for_download", False
    driver.SetPreference "download.directory_upgrade", True
    driver.Start "chrome"

    'Selenium公式ページからダウンロード開始
    driver.Get "https://www.selenium.dev/selenium/web/downloads/download.html"
    driver.FindElementById("file-1").Click

    '30秒を上限に、完成ファイルと一時ファイルを確認
    deadline = DateAdd("s", 30, Now)
    Do
        If Dir(target) <> "" And _
           Dir(folder & "\*.crdownload") = "" Then
            finished = True
            Exit Do
        End If
        If Now >= deadline Then Exit Do
        driver.Wait 200
        DoEvents
    Loop

    '成功またはタイムアウトを通知する
    If finished Then
        MsgBox "ダウンロード完了:" & target
    Else
        MsgBox "30秒経過:完了を確認できませんでした。"
    End If

ExitProc:
    On Error Resume Next
    driver.Quit
    Exit Sub
ErrProc:
    MsgBox "エラー:" & Err.Description
    Resume ExitProc
End Sub

完了判定とタイムアウト

完了条件はfile_1.txtがあり、.crdownloadがないことです。ほかのダウンロードと混ざらない専用フォルダを使います。

Excel VBAでcrdownloadファイルの有無を監視してダウンロード完了を判定するコード

DateAddで期限を30秒に設定し、超過した場合は処理を終了します。

実行結果と注意点

正常に終了すると「DownloadTest」フォルダ内にfile_1.txtが保存され、完了メッセージが表示されます。

Excel VBAとSeleniumでfile_1.txtのダウンロード完了を確認した画面

誤判定を防ぐため古い同名ファイルは削除します。タイムアウトした場合はChromeのダウンロード状況を確認してください。

なお、

は別の記事でも紹介しています。

最後に

いかがでしたでしょうか。今回は、.crdownloadと完成ファイルの有無を組み合わせ、ダウンロード完了を待つ方法をご紹介しました。少しでも参考になれば幸いです。

開発依頼について

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

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

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

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

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

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

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

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

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

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

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

コメントを残す

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

CAPTCHA