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

    ドラッグ&ドロップしたOfficeファイルをPDFに変換するVBScript

    複数のExcelファイルをPDFに一括変換する必要があったので、簡単な…

  2. Office関連

    「傍点をふる」をWord 2007/2010で簡単に使う方法

    Wordで文字列を強調したいときに便利なのが「傍点をふる」コマンド。…

  3. Office関連

    [リボン・カスタマイズ]toggleButtonのオン・オフを動的に変更する。

    “リボン上のトグルボタンをマクロで押し下げすることはできないか?”、と…

  4. Office アドイン

    [Officeアドイン]Word JavaScript APIの機能紹介

    Office Dev Center - Changelogを見ると分か…

  5. Office関連

    徹底的にSymbol(シンボル)フォントをチェックするWordマクロ

    文字列をメモ帳にコピー&ペーストすると文字化けしたり、フォント指定で検…

  6. Office アドイン

    [Office用アプリ]サポートページにある資料へのリンクをまとめてみました。

    MicrosoftのサポートページにあるOffice 用アプリや関連技…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

Translate

Chinese (Simplified)Chinese (Traditional)EnglishFrenchGermanJapaneseKoreanRussianSpanish

最近の記事

アーカイブ

PAGE TOP