2015年と2018年にSeleniumBasicを使ってMicrosoft Edgeを操作する方法について記事を書きました。
Windows 10 May 2019 Updateが公開され、Edge周りの環境が変わったので、改めて動作確認したいと思います。
動作確認環境
- Microsoft Windows 10 Pro バージョン 1903 (OS ビルド 18362.145) 64ビット版
- Excel 2016 MSO (16.0.4849.1000) 32ビット版
- Microsoft Edge 44.18362.1.0
- Microsoft EdgeHTML 18.18362
- SeleniumBasic v2.0.9.0
SeleniumBasicのインストール
GitHubのReleasesページからファイルをダウンロードし、インストールを行います。2019年6月時点でも、SeleniumBasicの最新版はv2.0.9.0となっていて、以前の記事公開時点から更新されていません。
WebDriverの選択画面では、Edge用のドライバーを選択します。
(といっても、SeleniumBasic付属のWebDriverは古過ぎて使い物になりません。)
下図画面の通り、インストール先は「%USERPROFILE%\AppData\Local\SeleniumBasic」となります。
.NET Framework 3.5の有効化
SeleniumBasicを動かすには、「.NET Framework 3.5」を有効化する必要があります。
[すべてのコントロール パネル項目] → [プログラムと機能] → [Windows の機能の有効化または無効化]から「.NET Framework 3.5 (.NET 2.0 および 3.0 を含む)」にチェックを入れて、OKボタンをクリック、指示に従ってインストールを行った後、PCを再起動すれば.NET Framework 3.5が有効になります。
.NET Framework 3.5が無効になっていると、SeleniumBasicのオブジェクトを作成しようとした時点で「実行時エラー ‘-2146232576 (80131700)’:オートメーション エラー」が発生します。
オートメーションエラーだけでは何が原因なのか分からず、SeleniumBasicを使うときに意外とハマりやすい罠なのでお気を付けください。
WebDriverの追加
Microsoftの公式サイトにある通り、Edge バージョン 18では、DISMコマンドでWebDriverを追加する必要があります。
DISM.exe /Online /Add-Capability /CapabilityName:Microsoft.WebDriver~~~~0.0.1.0
管理者権限で実行したコマンドプロンプトから、上記コマンドを実行すると、System32フォルダに「MicrosoftWebDriver.exe」ファイルが追加されます。
ファイルのバージョンも10.0.18362.1となっています。
SeleniumBasic付属のWebDriverと入れ替えて実行
WebDriverの準備ができたので、前回の記事に倣って、ファイルを入れ替えて実行してみました。
(「MicrosoftWebDriver.exe」ファイルを「%USERPROFILE%\AppData\Local\SeleniumBasic」にコピーして「edgedriver.exe」にリネーム)
--------------------------- Microsoft Visual Basic for Applications --------------------------- 実行時エラー '0': オートメーション エラーです。 この操作を正しく終了しました。
オブジェクトの作成時点ではエラーは発生しませんが、Startメソッドを実行しようとした時点でオートメーションエラーが発生します。
開発者向けドキュメントを参考に、AddArgumentメソッドで「jwp」オプションを付けてみましたが、結果は変わりません。
jwpオプションを付けて先にWebDriverを実行
仕方が無いので先にWebDriverを実行しておいて、StartRemotelyメソッドを使用することにしました。
(コードは前回の記事と大体同じですね。)
Option Explicit Public Sub Sample() Dim pid As Long Dim pno As Long: pno = 17556 pid = StartEdgeDriver(PortNo:=pno) If pid = 0 Then Exit Sub With CreateObject("Selenium.WebDriver") .StartRemotely "http://localhost:" & pno & "/", "MicrosoftEdge" .Get "https://www.yahoo.co.jp/" .FindElementById("srchtxt").SendKeys "あいうえお" MsgBox "一時停止", vbInformation + vbSystemModal .Quit End With TerminateEdgeDriver pid MsgBox "終了", vbInformation + vbSystemModal End Sub Private Function StartEdgeDriver( _ Optional ByVal DriverPath As String = "C:\Windows\System32\MicrosoftWebDriver.exe", _ Optional ByVal PortNo As Long = 17556) As Long Dim DriverFolderPath As String Dim DriverName As String Dim Options As String Dim itm As Object, itms As Object Dim pid As Long: pid = 0 With CreateObject("Scripting.FileSystemObject") If .FileExists(DriverPath) = False Then GoTo Fin DriverFolderPath = .GetParentFolderName(DriverPath) DriverName = .GetFileName(DriverPath) End With '多重起動確認 Set itms = CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery _ ("Select * From Win32_Process Where Name = '" & DriverName & "'") If itms.Count > 0 Then For Each itm In itms pid = itm.ProcessId: GoTo Fin Next End If 'WebDriver実行 Options = " --host=localhost --jwp --port=" & PortNo With CreateObject("WbemScripting.SWbemLocator").ConnectServer.Get("Win32_Process") .Create DriverPath & Options, DriverFolderPath, Null, pid End With Fin: StartEdgeDriver = pid End Function Private Sub TerminateEdgeDriver(ByVal ProcessId As Long) Dim itm As Object, itms As Object Set itms = CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery _ ("Select * From Win32_Process Where ProcessId = " & ProcessId & "") If itms.Count > 0 Then For Each itm In itms itm.Terminate: Exit For Next End If End Sub
これでようやく上手くいきました。
下記キャプチャー動画の通り、VBAマクロからEdgeが操作できているのが分かるかと思います。
実は上記コードは、MSDNフォーラムの回答用に書いたコードになります。
Chromium版のEdgeも発表され、旧来のEdge操作なんて需要はないだろうと思っていましたが、今でもEdgeを操作したいという方は一定数おられるようです。
この記事へのコメントはありません。