Skip to content

イベント購読 ​

ネットワークやログなどの非同期イベントを 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) ​

  1. BrowserEvents に New Dictionary を渡して記録開始
  2. 必要なら SetFilterEvents でイベント名を絞る
  3. ドメインを ExecuteCDP で enable
  4. 操作後、Dictionary を読む(必要ならファイルへ保存)
vb
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) ​

  1. BiDiEvents に New Dictionary
  2. SubscribeBiDiEvent にイベント名を渡す(Collection または 1次元配列)
  3. 操作後 TakeEvents で受信キューを吸い上げる
vb
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 で停止 → 再代入で再開、というパターンを示しています。長時間ジョブで「区間だけ聞きたい」ときに便利です。

関連 ​

Excel VBA × CDP / WebDriver BiDi