ブラウザーの制御に広く使われているWebDriverですが、ブラウザーがアップデートされる度にバージョンに合わせたWebDriverの実行ファイルをダウンロード・インストールするのは手間が掛かります。
WebDriverの更新を自動で行ってくれる、「WebDriverManager」という便利なライブラリも公開されているのですが、JavaやPython、.Net向けのライブラリはあるものの、VBAマクロから使いやすそうなものは見つかりませんでした。
仕方が無いので、Microsoft Edgeのみの対応にはなりますが、インストールされているブラウザーのバージョンに合わせてWebDriverをダウンロードする、簡単なマクロを書いてみました。
Option Explicit Public Sub Sample() Dim EdgeDriverFilePath As String Const EdgeDriverFolderPath = "C:\System\Driver\Edge" 'Edge Driverの保存場所 'EdgeDriverFilePath = DownloadEdgeDriver(EdgeDriverFolderPath, "92.0.902.55") 'バージョンを指定する場合 EdgeDriverFilePath = DownloadEdgeDriver(EdgeDriverFolderPath) If Len(EdgeDriverFilePath) > 0 Then Debug.Print "EdgeDriverFilePath:" & EdgeDriverFilePath End If End Sub Private Function DownloadEdgeDriver(ByVal EdgeDriverFolderPath As String, _ Optional ByVal DriverVersion As String = "") As String 'Edge DriverをダウンロードしてDriverのパスを返す '※バージョンを指定しない場合は現在のEdgeのバージョンに合わせてDriverをダウンロード Dim EdgeDriverFilePath As String Dim DownloadFolderPath As String Dim DownloadFilePath As String Dim SourceFilePath As String Dim Url As String: Url = "https://msedgedriver.azureedge.net/" Const DriverFileName = "msedgedriver.exe" Const ZipFileName = "edgedriver.zip" If Len(DriverVersion) < 1 Then DriverVersion = GetCurrentEdgeVersion If Isx64 Then Url = Url & DriverVersion & "/edgedriver_win64.zip" Else Url = Url & DriverVersion & "/edgedriver_win32.zip" End If With CreateObject("Scripting.FileSystemObject") EdgeDriverFolderPath = .BuildPath(EdgeDriverFolderPath, DriverVersion) EdgeDriverFilePath = .BuildPath(EdgeDriverFolderPath, DriverFileName) If .FolderExists(EdgeDriverFolderPath) Then 'すでにEdge Driverが存在している場合は処理終了 If .FileExists(EdgeDriverFilePath) Then DownloadEdgeDriver = EdgeDriverFilePath Exit Function End If Else .CreateFolder EdgeDriverFolderPath End If DownloadFolderPath = GetDownloadFolderPath(DriverVersion) DownloadFilePath = .BuildPath(DownloadFolderPath, ZipFileName) SourceFilePath = .BuildPath(DownloadFolderPath, DriverFileName) If DownloadFile(Url, DownloadFilePath) Then UnZip DownloadFilePath, DownloadFolderPath 'Zip解凍して出力されたEdge Driverファイルを指定した場所にコピー If .FileExists(SourceFilePath) Then .CopyFile SourceFilePath, EdgeDriverFilePath, True End If .DeleteFolder DownloadFolderPath, True If .FileExists(EdgeDriverFilePath) = False Then .DeleteFolder EdgeDriverFolderPath, True EdgeDriverFilePath = "" End If End With DownloadEdgeDriver = EdgeDriverFilePath End Function Private Function Isx64() As Boolean '64ビット環境かどうか判別 Dim itm As Object Dim ret As Boolean For Each itm In CreateObject("WbemScripting.SWbemLocator") _ .ConnectServer.ExecQuery("Select * From Win32_OperatingSystem") If InStr(itm.OSArchitecture, "64") Then ret = True Exit For End If Next Isx64 = ret End Function Private Function GetCurrentEdgeVersion() As String 'Edgeのバージョン取得 Dim ret As String On Error Resume Next ret = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge\BLBeacon\version") On Error GoTo 0 GetCurrentEdgeVersion = ret End Function Private Function GetDownloadFolderPath(ByVal DriverVersion As String) As String 'Edge Driverのダウンロード先フォルダ(Temp)のパス取得 Dim DownloadFolderPath As String Const TemporaryFolder = 2 With CreateObject("Scripting.FileSystemObject") DownloadFolderPath = .BuildPath(.GetSpecialFolder(TemporaryFolder).Path, DriverVersion) If .FolderExists(DownloadFolderPath) Then .DeleteFolder DownloadFolderPath, True .CreateFolder DownloadFolderPath End With GetDownloadFolderPath = DownloadFolderPath End Function Private Function DownloadFile(ByVal Url As String, ByVal OutputFilePath As String) As Boolean 'ファイルダウンロード Dim req As Object Dim ret As Boolean Const adTypeBinary = 1 Const adSaveCreateOverWrite = 2 Set req = CreateObject("WinHttp.WinHttpRequest.5.1") req.Open "GET", Url, False req.send Select Case req.Status Case 200 With CreateObject("ADODB.Stream") .Type = adTypeBinary .Open .Write req.responseBody .SaveToFile OutputFilePath, adSaveCreateOverWrite .Close End With ret = True Case Else: ret = False End Select DownloadFile = ret End Function Private Sub UnZip(ByVal TargetFilePath As Variant, _ Optional ByVal OutputFolderPath As Variant = "") 'Zipファイル解凍 '※CopyHereメソッドによるZip解凍はサポート対象外( https://support.microsoft.com/ja-jp/help/2679832 ) With CreateObject("Scripting.FileSystemObject") If .FileExists(TargetFilePath) = False Then Exit Sub If LCase(.GetExtensionName(TargetFilePath)) <> "zip" Then Exit Sub If .FolderExists(OutputFolderPath) = False Then OutputFolderPath = .GetFile(TargetFilePath).ParentFolder.Path End If End With With CreateObject("Shell.Application") .Namespace(OutputFolderPath).CopyHere .Namespace(TargetFilePath).Items, &H4 Or &H10 End With End Sub
処理内容は下記の通り至ってシンプルで、問題無く処理が行われれば、実行ファイルのパスが返ってきます。
- Edgeのバージョンを取得します。
- 64ビット環境かどうかを判別し、環境に合ったファイル(Zip)をダウンロードします。
- Zipファイルを解凍し、WebDriverの実行ファイルを指定された場所にコピーします。
コード中にも書いていますが、Zip解凍にはサポート対象外の「CopyHere」メソッドを使用しいるため、安定して処理を行いたい場合は外部のアプリケーションやライブラリを使用した方が良いでしょう。
また、以前PowerShellで似たようなコードを書いたことがあるので、こちらも参考までに載せておきます。
関連ツイート
ご紹介いただき、ありがとうございます!🙏
IEオートメーションが使えなくなる問題に対してはどう対応するのが良いか検討事項ですよね😅
脱・IE!ブラウザー操作止める!何ならマクロでの処理を止める!!…ができれば手っ取早いのですが・・・💦 https://t.co/njEeOaoKwm— きぬあさ (@kinuasa) August 23, 2021
「簡単」じゃないじゃないですか!?
同様のことをちょうど途中まで構築しててイヤになってた時に見つけました。
ありがとうございます。
あと、このコードに
※ダウンロード・ファイル展開のフォルダをWindows/Tempに
FSO.GetSpecialFolder(2)
※SeleniumBasicインストールフォルダをレジストリ取得しコピー
HKEY_CURRENT_USER\Software\Classes\Selenium.” & BrowserName & “Driver”
の機能を盛り込んでフルオートに改変してみます。