2年以上前、SeleniumBasicがMicrosoft Edgeに対応した頃、当ブログでも取り上げたことがありました。
SeleniumBasicの更新が2年以上止まっていることもあり、しばらく触っていなかったのですが、気が向いたので久しぶりにSeleniumBasicでEdgeを操作してみることにしました。
SeleniumBasicのインストール
GitHubのReleasesページからファイルをダウンロードし、インストールを行います。2018年7月時点では、SeleniumBasicの最新版はv2.0.9.0となっています。
インストールするWebDriverの選択画面が表示されますが、ここではとりあえずEdge用とIE用のものを選択しておきます。
下図画面の通り、インストール先は「%USERPROFILE%\AppData\Local\SeleniumBasic」となります。
動作確認
インストール後、簡単なコードで動作確認を行います。
Public Sub Sample1() With CreateObject("Selenium.EdgeDriver") .Start .Get "https://www.yahoo.co.jp/" .FindElementById("srchtxt").SendKeys "あいうえお" MsgBox "一時停止", vbInformation + vbSystemModal .Quit End With MsgBox "終了", vbInformation + vbSystemModal End Sub
上記コードを実行したところ、下図のエラーが発生しました。
やはり更新の止まっている古いSeleniumBasicではEdgeを操作できないのでしょうか?
確認のため、インストール先のフォルダを見てみると、Edge用のWebDriver(edgedriver.exe)を見つけました。
ただ、このファイルはバージョンが10.0.10240.0と、かなり古いものです。
そこで、公式サイトから最新のファイルをダウンロードし、WebDriverを差し替えたところ(「MicrosoftWebDriver.exe」から「edgedriver.exe」にリネーム)、上記コードが問題なく動作するようになりました。
WebDriverを指定してSeleniumBasicによる操作を実行
WebDriverを最新のファイルに差し替えることで動作することは確認できましたが、ブラウザー(WebDriver)が更新されるたびにファイルを入れ替えるのは、それはそれで面倒くさいものです。
そこで、WebDriverの起動処理を分け、任意の場所にあるWebDriverを実行するようなコードを書いてみました。
Public Sub Sample2() Dim pid As Long Dim pno As Long: pno = 17556 pid = StartDriver(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 TerminateDriver pid MsgBox "終了", vbInformation + vbSystemModal End Sub Private Function StartDriver(Optional ByVal BrowserName As String = "MicrosoftEdge", _ Optional ByVal PortNo As Long = 58082) As Long 'WebDriver実行 Dim DriverPath As String Dim DriverName As String Dim Options As String Dim itm As Object, itms As Object Dim pid As Long Const DriverFolderPath As String = "C:\System\Driver" Const EdgeDriverName As String = "MicrosoftWebDriver.exe" Const IEDriverName As String = "IEDriverServer.exe" pid = 0 '初期化 With CreateObject("Scripting.FileSystemObject") Select Case LCase(BrowserName) Case "microsoftedge", "edge" DriverName = EdgeDriverName Options = " --host=localhost --port=" & PortNo Case "internet explorer", "ie" DriverName = IEDriverName Options = " /host=127.0.0.1 /port=" & PortNo & " /log-level=ERROR /silent" Case Else: GoTo Fin End Select DriverPath = .BuildPath(DriverFolderPath, DriverName) If .FileExists(DriverPath) = False Then GoTo Fin 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実行 With CreateObject("WbemScripting.SWbemLocator").ConnectServer.Get("Win32_Process") .Create DriverPath & Options, DriverFolderPath, Null, pid End With Fin: StartDriver = pid End Function Private Sub TerminateDriver(ByVal ProcessId As Long) 'WebDriver終了 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
WebDriverの起動と終了を自力で行うようにしたため、冗長なコードとなっていますが、これであれば好きなフォルダにWebDriverを置いてSeleniumBasicを使うことができます。
VBAマクロからEdgeを操作する機会もなかなか無いと思いますが、興味がありましたら、一度試してみてはいかがでしょうか。
2019/6/5 追記:
Windows 10 May 2019 Updateでも動作確認を行いました。
この記事へのコメントはありません。