Office関連

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

2015年と2018年にSeleniumBasicを使ってMicrosoft Edgeを操作する方法について記事を書きました。

Windows 10 May 2019 Updateが公開され、Edge周りの環境が変わったので、改めて動作確認したいと思います。

動作確認環境

  1. Microsoft Windows 10 Pro バージョン 1903 (OS ビルド 18362.145) 64ビット版
  2. Excel 2016 MSO (16.0.4849.1000) 32ビット版
  3. Microsoft Edge 44.18362.1.0
  4. Microsoft EdgeHTML 18.18362
  5. 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を操作したいという方は一定数おられるようです。

winmail.datから添付ファイルを取り出すPowerShellコード前のページ

Excelを使わずにCSVからExcelファイルに変換するPowerShellコード次のページ

関連記事

  1. Office アドイン

    Office 2016で進化したOffice アドイン

    今日OfficeDevを眺めていて気が付いたのが「OfficeJS S…

  2. Office アドイン

    [Officeアドイン]ワークシートで選択範囲を変更したときに発生するイベント

    ワークシート上で選択範囲の変更を検知する際、VBAでは通常「Works…

  3. Office関連

    「クイックアクセスツールバーからPowerPointマクロを実行するアドイン」のコード

    2年ほど前に書いたPowerPointマクロの記事「クイックアクセスツ…

  4. Office関連

    Office 2007のサポートが2017年10月10日に終了します。

    2007年1月にパッケージ版が発売されてから早10年、長らく活躍してき…

  5. Office関連

    [Excel Services ECMAScript]ActiveWorkbookのパスを取得する。…

    埋め込んだExcelワークブックのパスを取得するコードです。 (さ…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP