Office関連

Chrome DevTools ProtocolでEdgeを操作するVBAマクロ

Microsoft Edgeの操作を自動化する際はWebDriverを使うことが多いのですが、ブラウザーのバージョンにドライバーのバージョンを合わせる必要が有り、管理に手間が掛かるのが難点です。

特にVBAではドライバーの更新を自動で行ってくれる「WebDriverManager」のような便利なライブラリも無いため、下記記事のように自分で工夫する必要が有ります。

一方、Chrome DevTools Protocol(Edge DevTools Protocol)を使った、WebDriverを使わずにブラウザーを操作するためのライブラリを有志の方が公開されているので、今回はこちらのライブラリの使い方を簡単にご紹介します。

※2021年9月時点の情報です。今後使用方法等が変更される可能性があります。

  1. CodeProjectからZipファイルをダウンロードします。ダウンロードにはサインインが必要で、CodeProjectのアカウント以外にもGitHubやFacebook、Google、Microsoftアカウントが使用できます。
  2. Zipファイルを解凍し中に含まれるモジュールをインポートします。「modEdge」はサンプルコードなので、必ずしもインポートする必要はありません。
  3. Dictionaryを使用するため、参照設定から「Microsoft Scripting Runtime」(scrrun.dll)を追加します。
  4. Edgeを終了した状態でコードを実行します。「modEdge」の中にサンプルコード「runedge」があるので、まずはこちらで動作確認すると良いでしょう。

下図の通り必要最小限の関数しか実装されていないため、ブラウザーの操作は主にJavaScript(jsEval)で行っていくことになります。

2021/11/10 追記:
更新版がリリースされ、ブラウザーを閉じる処理等が追加されました。

サンプルコード

テスト用に本ブログをサイト内検索してヒットした記事を開くコードを書いてみました。
下記の通り、簡単なスクレイピング処理であればJavaScriptの実行だけで十分対応可能です。

Option Explicit

Public Sub Sample()
  Dim objBrowser As clsEdge
  
  Set objBrowser = New clsEdge
  With objBrowser
    .start
    .attach ""
    .navigate "https://www.ka-net.org/blog/"
    WaitBrowser objBrowser
    .jsEval "document.getElementById('s').value = 'VBA'"
    .jsEval "document.getElementById('searchsubmit').click()"
    WaitBrowser objBrowser
    .jsEval "const res = document.evaluate(""//a[@class='gs-title']"", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)"
    .navigate .jsEval("res.snapshotItem(5).href")
  End With
End Sub

Private Sub WaitBrowser(ByVal objBrowser As Object)
  Do While objBrowser.jsEval("document.readyState") <> "complete"
    DoEvents
  Loop
End Sub

今回紹介したライブラリは7月に公開されたばかりです。
欲しい機能が有る場合は、作者にリクエストを出して実装されるのを待つか、もしくはCDPのドキュメントを見ながら自分で実装すれば良いでしょう。

これまでCDPについては「WebSocketでアレコレするやつ」「Node.jsから使うやつ」程度のふわっとした知識しか無かったため、VBAからの利用は考えたことも無かったのですが、まさか実装する方がおられるとは思いもよりませんでした。

ちなみに今回紹介したライブラリはパイプを使って低レベルな通信を行っているそうです。

2021/10/27 追記:
@kumatti1 さんから参考になる情報をいただきましたので下記に引用させていただきます。

二つ目のコードは、外部からアタッチ(プロセス間通信によるパイプ処理)できるように
それ用の引数を付加して起動させたEdgeに対するコードなので、複数のEdgeが起動済みだと動かないのですが、
画面上に現れてないのに「なぜか、動かない…?」と暫く思っておりました。
別件でスタートアップになぜか(非表示で起動する)Edgeがセットされており、これが原因でした。
リンク先の方でも「タイムアウトがどうの」とあり、この状況は一般的なものと思われます。
CreateProcessA APIを非公開機能を使って起動してるのに、レジストリから読み込まずにEdge本体のパスをハードコートしてるのが、
懸念される所ですが、(エスケープ処理が面倒なものの)JavaScript構文はIEでの記述を想起させ、懐かしさに浸りました。
msedgedriver.exeもWebDriver.dllも要らない気楽さは何気にいいものです。

リンク先でも触れられてないので、これは環境によるのでしょうけど、他言語で書いた(C++/CLIでしか確認してない)Seleniumで起動済みのEdgeは別にカウントされるらしく、
複数起動ができない弊害というのか、それが軽減され、使い勝手がそれ程、損なわれないのもいいです。
(本当はVB6があればそちらで.exeで動かしたい所)

https://www.moug.net/faq/viewtopic.php?t=80987 より

非表示のEdgeが邪魔をするというのは気が付きにくいですね!
貴重な情報をありがとうございます。

Edgeのパスは確かに私も疑問に思っておりましたが「面倒くさかったから楽な方法で書いたんだな!」と、勝手に想像しておりました😅

関連記事

2021年9月の人気記事前のページ

Windows 11をクリーンインストールしてみました。次のページ

関連記事

  1. Office関連

    オフィス祭り 2018 in 東京に参加しました。

    先日書いた下記記事の通り、9月15日(土)に品川にある日本マイクロソフ…

  2. Office関連

    ヘッドレス ChromeをSeleniumBasicで動かしてみました。

    Chromeがヘッドレスモードに対応した頃、Seleniumで操作した…

  3. Office関連

    格子状にガイドを追加するPowerPointマクロ

    前回の記事で、PowerPoint 2013で追加されたGuide、G…

  4. Office関連

    Acrobat XIを操作してテキスト認識操作を行うVBAマクロ

    マクロからAcrobatを操作する場合「PDFファイル上のフィールドの…

  5. Office関連

    セル内の改行をカウントするExcelマクロ

    「Excel セルの内容 改行を数える VBA」といったキーワード検索…

  6. Office関連

    Office文書をパスワード付きPDFに変換するVBAマクロ

    4年ほど前に書いた、下記記事のマクロがWordでも使えるか?との質問を…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP