Microsoft Edgeの操作を自動化する際はWebDriverを使うことが多いのですが、ブラウザーのバージョンにドライバーのバージョンを合わせる必要が有り、管理に手間が掛かるのが難点です。
特にVBAではドライバーの更新を自動で行ってくれる「WebDriverManager」のような便利なライブラリも無いため、下記記事のように自分で工夫する必要が有ります。
一方、Chrome DevTools Protocol(Edge DevTools Protocol)を使った、WebDriverを使わずにブラウザーを操作するためのライブラリを有志の方が公開されているので、今回はこちらのライブラリの使い方を簡単にご紹介します。
※2021年9月時点の情報です。今後使用方法等が変更される可能性があります。
- CodeProjectからZipファイルをダウンロードします。ダウンロードにはサインインが必要で、CodeProjectのアカウント以外にもGitHubやFacebook、Google、Microsoftアカウントが使用できます。
- Zipファイルを解凍し中に含まれるモジュールをインポートします。「modEdge」はサンプルコードなので、必ずしもインポートする必要はありません。
- Dictionaryを使用するため、参照設定から「Microsoft Scripting Runtime」(scrrun.dll)を追加します。
- 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のパスは確かに私も疑問に思っておりましたが「面倒くさかったから楽な方法で書いたんだな!」と、勝手に想像しておりました😅
この記事へのコメントはありません。