イベント購読
ネットワークやログなどの非同期イベントを VBA 側で受け取ります。デモは Demo_CDP.checkNetworkEvents / Demo_WebDriverBiDi.checkNetworkEvents が正本です。
2 つの受け取り方
一般的には、拡張用テンプレート のように別途 Class オブジェクトを作り、WithEvents を定義して対象コンテキスト Class を渡し、非同期イベントごとの処理を書いて…といった儀式が必要です。
一方、.BrowserEvents(BiDi なら .BiDiEvents)を使う場合は、標準モジュール(.bas)上で直接イベント処理を行えます。
Demo には Page.javascriptDialogOpening を .bas 上で処理する例があるので、それを参考に実装してみるとよいでしょう(Demo_CDP.TestAlert など)。
TIP
試作や短いデモでは BrowserEvents が手軽です。長期運用では、先の Class + WithEvents でイベント処理を行うのがベストです。
CDP(BrowserEvents)
BrowserEventsにNew Dictionaryを渡して記録開始- 必要なら
SetFilterEventsでイベント名を絞る - ドメインを
ExecuteCDPで enable - 操作後、Dictionary を読む(必要ならファイルへ保存)
Dim t As CDPContext
Set t = ShSetting01_StartBrowser.StartCDPModeContext
t.SetFilterEvents = "Network.requestWillBeSent"
t.SetFilterEvents = "Network.loadingFinished"
Set t.BrowserEvents = New Dictionary
t.ExecuteCDP "Network.enable"
t.navigate "https://example.com"
' t.BrowserEvents に蓄積
' 記録を止める: Set t.BrowserEvents = Nothing
' セーブデータを戻して再開も可能
t.ThisCDPBrowser.CloseBrowserフィルタ未設定時はキャプチャ対象が広くなります。本番では必要なイベントだけに絞ってください。
BiDi(BiDiEvents)
BiDiEventsにNew DictionarySubscribeBiDiEventにイベント名を渡す(Collectionまたは 1次元配列)- 操作後
TakeEventsで受信キューを吸い上げる
Dim t As WebDriverBiDiContext
Set t = ShSetting01_StartBrowser.StartBiDiModeContext
Set t.ThisWebDriverBiDiMode.BiDiEvents = New Dictionary
t.ThisWebDriverBiDiMode.SubscribeBiDiEvent = Array("network.beforeRequestSent", "network.responseCompleted", "log.entryAdded")
t.navigate "https://example.com"
t.ThisWebDriverBiDiMode.TakeEvents
' t.ThisWebDriverBiDiMode.BiDiEvents を参照
t.ThisWebDriverBiDiMode.CloseBrowserタブ(コンテキスト)単位での購読(v3.1.1.1〜)
上記はブラウザ全体(全タブ共通)での購読です。タブAはネットワーク系イベントを購読するが、タブBは何も購読しない、といった使い分けをしたい場合は、ThisWebDriverBiDiMode.SubscribeBiDiEvent の代わりに t.SubscribeBiDiEvent(WebDriverBiDiContext.SubscribeBiDiEvent、v3.2.0でsessionSubscribeから改称)を使ってください。不要なイベントを流さない分、パフォーマンス低下を防げます。
セーブ/再開
両デモとも、蓄積 Dictionary を別変数に退避 → Nothing で停止 → 再代入で再開、というパターンを示しています。長時間ジョブで「区間だけ聞きたい」ときに便利です。

