Excel

【2018年7月版】SeleniumBasicでMicrosoft Edgeを操作してみました。

2年以上前、SeleniumBasicMicrosoft 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を操作する機会もなかなか無いと思いますが、興味がありましたら、一度試してみてはいかがでしょうか。

関連記事

  1. Office関連

    2つの文書を比較するWordマクロ

    先日テキスト比較ソフトの「ちゃうちゃう!」がバージョンアップされたこと…

  2. Office関連

    アクティブなスライドを取得するPowerPointマクロ

    PowerPointのマクロを触っていて、「ActiveSlide」の…

  3. Windows 10

    PowerShellでMicrosoft Edgeを操作する

    前回の記事でWebDriverを使ってMicrosoft Edgeを操…

  4. Office関連

    [Word VBA]引数の型がVariantになっているのはなぜ?

    インストラクターのネタ帳でお馴染みの伊藤さんが先日下記の記事をアップさ…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP