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

    「2014年12月のWindows Update以降コマンドボタンが使えなくなった」トラブルへのFi…

    当ブログでも「KB2553154の更新プログラムをアンインストールする…

  2. Office関連

    Office製品のフィードバック先まとめ

    WordやExcel等のOffice製品を使っていて、「UIのこの日本…

  3. Office関連

    Microsoft Graph SDK for PHPを使ったAPIの呼び出しサンプル

    知らない間に(恐らくBuild 2017のタイミングに合わせて)Mic…

  4. アイコン一覧

    Office 2013 アイコン一覧(B)

    ・Office 2013 アイコン一覧 NUM…

  5. Office アドイン

    [Officeアドイン]Excel Custom functionsのデバッグ方法

    前回の記事でExcelの新たな機能「Custom functions」…

  6. Office関連

    受信メールに対して自動的に返信するOutlookマクロ

    「Outlook VBA 自動返信」といったキーワード検索でのアクセス…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

Translate

Chinese (Simplified)Chinese (Traditional)EnglishFrenchGermanJapaneseKoreanRussianSpanish

最近の記事

アーカイブ

PAGE TOP