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関連

    [VBA]ユーザーフォーム上のコンボボックスでオートコンプリート機能を実装する方法

    MSDNフォーラムに「ユーザーフォーム上のコンボボックスで、任意の文字…

  2. Office関連

    SendKeysでWindowsキーを送信するVBAマクロ

    「VBA SendKeys Windowsキー」といったキーワード検索…

  3. アイコン一覧

    Office 365アイコン(imageMso)一覧(U)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  4. Office関連

    ソースコードを番号行付きのテーブルに変換するWordマクロ

    Word文書内のソースコードを、他の文書と区別して目立たせたいときに役…

  5. Office関連

    テキストボックスの中にある表を操作するWordマクロ

    Yahoo!知恵袋で、「Wordマクロでテキストボックスの中にある表の…

  6. Office関連

    マクロで実行したいコマンドのIDを調べる簡単な方法

    MSDN フォーラムに下記質問がありました。・Excel-VB…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP