WebDriverBiDiContext
BiDi の browsing context(タブ/ページ)です。Playwright の Page に相当します。
Dim t As WebDriverBiDiContext
Set t = ShSetting01_StartBrowser.StartBiDiModeContext
t.navigate "https://example.com"
t.ThisWebDriverBiDiMode.CloseBrowser親は ThisWebDriverBiDiMode(WebDriverBiDiMode)です。日常利用では設定シート経由の StartBiDiModeContext を推奨します。
要素のクリック/入力など高レベル API は CDP 側が充実しています。必要なら UpgradeBiDiPlus で変換してください。
起動・再接続
OpenBrowserAndConnectTab
Public Sub OpenBrowserAndConnectTab(caps As BrowserCapabilities)ブラウザ起動・session.new・初回タブ(context)接続まで自動で行います。日常利用では設定シート経由で十分です。低レベルに起動したいときだけ直接呼んでください。
| 引数 | 意味 |
|---|---|
caps | 起動時のオプションをまとめた BrowserCapabilities |
ユーザーデータフォルダ名・ブラウザの種類・追加の起動引数・初期 URL などは、すべて caps で渡します。session.new に渡す sessionCapabilitiesRequest は、caps.Set_BiDiSessionCapabilitiesRequest で設定します。
BrowserCapabilities.Set_StartURL = "https://example.com"
Dim t As WebDriverBiDiContext
Set t = New WebDriverBiDiContext
t.OpenBrowserAndConnectTab BrowserCapabilitiesContext 経由の起動は、常に「起動スプラッシュ画面」を経由してから実際の URL へ遷移します(--app 使用時のレースコンディション対策。詳細は ページ遷移)。
sessionCapabilitiesRequest の詳細は はじめに。
reattach
Public Function reattach(reattachInfo As ReattachOptions) As BooleanExcel テーブルに記録されたメイン BiDi context へ再接続を試みます。通信経路(Pipe / Port)は、ReattachOptions で指定します。
| 引数 | 意味 |
|---|---|
reattachInfo | 再接続時のオプションをまとめた ReattachOptions。制御経路の指定が必須。新しい BiDi-CDP Mapper が起動されたときに使う Set_BiDiSessionCapabilitiesRequest なども、ここで設定します |
戻り値: 既存 context への再接続成功可否。
ReattachOptions.Set_PipeMode = ShSetting01_StartBrowser.CurrentUserName
Dim t As New WebDriverBiDiContext
If Not t.reattach(ReattachOptions) Then Exit Sub注意
- パイプが生きていない場合は、このメソッドから再開できません。記録中の context が既に閉じている場合は
Falseになります ReattachOptionsは使い切りです。reattachを呼ぶたびに、制御経路を指定し直してください
詳細は 再接続 / WebSocket モード。
ナビ・待機
navigate
Public Sub navigate(strURL As String, Optional till As ReadyState = isComplete)URL を開き、指定の読み込み条件まで待ちます。内部では browsingContext.navigate のあと WaitEvents を呼びます(till:=Nowait なら待ちません)。
| 引数 | 意味 |
|---|---|
strURL | 遷移先 URL |
till | 待機条件。既定は isComplete。Nowait(v3.2.0〜)で待たずに戻る |
ReadyState | BiDi の wait |
|---|---|
isLoading | "none" |
isInteractive | "interactive" |
isComplete | "complete" |
t.navigate "https://example.com" ' 完了まで待つ(既定)
t.navigate "https://example.com/heavy", isInteractive ' interactive で先に進む
t.navigate "https://example.com", Nowait ' 待たずに次へ進む(v3.2.0〜)CDP側との違い
CDP の CDPContext.navigate は v3.2.0 で referrer / transitionType 等の引数が追加されましたが、BiDi の browsingContext.navigate にはそれに相当する概念がないため、こちらの navigate のシグネチャは変わっていません。
詳細は ページ遷移。
Wait
Public Sub Wait(Optional till As ReadyState = isComplete)現在ページの document.readyState をポーリングして、指定状態になるまで待ちます。navigate 後だけでなく、クリック後の再読み込み待ちなどにも使えます。新しいタブなど、いつ遷移が起きたか把握できない場面ではこちらが安全です。
| 引数 | 意味 |
|---|---|
till | 待機する document.readyState。既定は isComplete |
t.Wait ' 完了待ち(既定)
t.Wait isInteractiveTIP
till:=isInteractiveのとき、すでにcompleteまで進んでいればそのまま成功扱いで抜けます- 一般的な読み込みステータスのみ対応です。SPA などの特殊な待機は別途実装が必要です
WaitEvents(v3.2.0〜)
Public Function WaitEvents(Optional WaitMode As ReadyState = isComplete, Optional WaitError As Boolean = True) As BooleanWait のポーリング版に対し、こちらは BiDi イベント(browsingContext.navigationStarted / domContentLoaded / load)を受動的に待つ版です。navigate が内部で使っているのはこちらです。CDP側の CDPContext.WaitEvents と同じ設計・同じ注意点(ResetWaitState を先に呼ぶ必要がある)です。
| 引数 | 意味 |
|---|---|
WaitMode | 待機する ReadyState。既定は isComplete |
WaitError | タイムアウト時に例外を出すか。既定は True |
t.ResetWaitState
t.getElementByQuery("a.next").click ' または UpgradeBiDiPlus 経由のクリック
t.WaitEvents WaitMode:=isCompleteResetWaitState(v3.2.0〜)
Public Sub ResetWaitState()WaitEvents 用の内部状態をリセットします。navigate を経由しない遷移トリガーの直前に呼んでください。
ReadyState
CDPContext と同じ列挙です(Nowait(v3.2.0〜) / isLoading / isInteractive / isComplete)。
JavaScript
jsEval
Public Function jsEval(JavaScriptStr As String, _
Optional scriptHandle As String, _
Optional objectArguments As Variant, _
Optional IFEXCEPTION As Variant, _
Optional RealmTarget As String, _
Optional Ownership As Boolean, _
Optional awaitPromise As Boolean, _
Optional userActivation As Boolean, _
Optional serializationOptions As Dictionary, _
Optional RunAsyncBiDi As Boolean, _
Optional StopException As Boolean, _
Optional StopBiDiError As Boolean = True) As Variantページ上で JavaScript を評価します(script.evaluate / script.callFunction)。利用時は 名前付き引数を推奨します。
| 引数 | 意味 |
|---|---|
JavaScriptStr | 実行する JS(そのまま送る) |
scriptHandle | 基準ハンドル。指定時は script.callFunction(function(){ this... } 形式) |
objectArguments | 引数(Collection / Array(...) / 固定長 Dictionary 型 1 次元配列)。指定時も callFunction 優先。固定長配列の方がパフォーマンスが良い |
IFEXCEPTION | JS 例外時の代替値(IFERROR チック) |
RealmTarget | iframe 等の realm を指定して実行したいとき |
Ownership | True で resultOwnership: "root"(次回の scriptHandle に流用可能な handle を返す) |
awaitPromise | Promise 完了まで待つか |
userActivation | 人間操作として偽装するか(スクレイピング対策向け) |
serializationOptions | 意地でも value で受け取るための細かい調整 |
RunAsyncBiDi | True で結果を待たず実行 id のみ返す |
StopException | JS 例外で停止するか(開発時向け) |
StopBiDiError | BiDi 通信エラーで停止するか。既定は True |
Dim result As Variant
result = t.jsEval("document.title")
Debug.Print result
result = t.jsEval("notDefined.x", IFEXCEPTION:="fallback")
' handle を保持して次の呼び出しに流用
Dim hid As String
hid = t.jsEval("document.body", Ownership:=True)
result = t.jsEval("function () { return this.tagName; }", scriptHandle:=hid)例外時は IsError(result) で判定します。詳細は JavaScript 実行。
BiDi+ への橋渡し
UpgradeBiDiPlus
Public Function UpgradeBiDiPlus() As CDPContext同じタブを CDPContext に変換します。CDPElement によるクリック/入力などが使えます。失敗時は Nothing です。
browsingContext.getTree 等で得られる context が CDP の targetId と一致する仕様を利用した変換術で(内部で Target.attachToTarget により新規 sessionId を発行)、Chromium 独自拡張 BiDi+(chromium-bidi 由来の命名)が担う3コマンドは、実質この変換だけで賄えます。
| BiDi+ | 相当する処理 |
|---|---|
goog:cdp.sendCommand | CDPContext.ExecuteCDP / ExecuteCDPAsync |
goog:cdp.getSession | Target.attachToTarget(本メソッド内部で実行) |
goog:cdp.resolveRealm | Runtime.executionContextCreated / Destroyed / Cleared |
Dim cdp As CDPContext
Set cdp = t.UpgradeBiDiPlus
cdp.getElementByQuery("button").click関連: 要素の取得 / 低レイヤー BiDi / CDP コマンドについて
イベント購読(コンテキスト単位、v3.1.1.1〜)
SubscribeBiDiEvent
Property Set SubscribeBiDiEvent(Optional subscribe As Boolean = True, events As Collection)
Property Let SubscribeBiDiEvent(Optional subscribe As Boolean = True, events)session.subscribe / session.unsubscribe を、このタブ(context)単位で実行します。ExecuteBiDi と同じく params に context が自動付与されるため、他のタブの購読状態には影響しません。
| 引数 | 意味 |
|---|---|
subscribe | True(既定)で購読、False で購読解除 |
events | SET: イベント名の Collection/LET: 1次元配列または文字列1件 |
' このタブだけネットワーク系イベントを購読する例(他のタブは購読しないまま操作を続けられる)
t.SubscribeBiDiEvent = Array("network.beforeRequestSent", "network.responseCompleted")ブラウザ全体の購読との使い分け
全タブ共通で購読したい場合は、これまで通り ThisWebDriverBiDiMode.SubscribeBiDiEvent を使ってください。パフォーマンスを気にするなら、必要なタブだけに絞れるこちらの Context 単位版がおすすめです。
詳細は イベント購読。
プロトコル
ExecuteBiDi / ExecuteBiDiAsync
Public Function ExecuteBiDi(methodName As String, _
Optional params As Dictionary, _
Optional StopBiDiError As Boolean = True) As BiDiCDPJson
Public Function ExecuteBiDiAsync(methodName As String, _
Optional params As Dictionary, _
Optional StopError As Boolean = True) As Longこの context 向け BiDi コマンドです。params に context を自動付与してから親 Mode へ渡します。BiDi+(goog:cdp.*)もここから呼べます。
| 引数 | 意味 |
|---|---|
methodName | メソッド名(例: "browsingContext.navigate") |
params | params の Dictionary。省略時は空 {} に context だけ付く |
StopBiDiError / StopError | 失敗時に停止するか。既定は True |
ExecuteBiDiAsync の結果回収は親の TakeResultBiDi で行います。
Dim params As New Dictionary
params.Add "url", "https://example.com"
params.Add "wait", "complete"
Dim result As BiDiCDPJson
Set result = t.ExecuteBiDi("browsingContext.navigate", params)
' 非同期
Dim cmdId As Long
cmdId = t.ExecuteBiDiAsync("browsingContext.navigate", params)
Do
t.ThisWebDriverBiDiMode.TakeEvents
Dim raw As String
raw = t.ThisWebDriverBiDiMode.TakeResultBiDi(cmdId)
If LenB(raw) Then Exit Do
DoEvents
Loop詳細は 低レイヤー BiDi / CDP コマンドについて。
タブ情報・生存
context
Property Get context() As String
Property Let context(param As String)このタブの browsing context id です。browsingContext.getTree などで得られる値と対応します。日常の読み取りは Get、Mode 側から渡すときは Let が使われます。
Debug.Print t.context再接続 や serializeMainTab で Excel に残る値と対応します。
isContextClosed
Property Get isContextClosed() As Booleanこの context が閉じられたかです。browsingContext.contextDestroyed を受け取ると True になります。True ならこのオブジェクトはもう使えないので破棄してください。
If t.isContextClosed Then
' オブジェクトを捨てて、必要なら getTab / newTab で取り直す
End If親セッション
ThisWebDriverBiDiMode
Property Get ThisWebDriverBiDiMode() As WebDriverBiDiModeWebDriverBiDiContext 上で、セッション/ブラウザ単位の制御もしたいときに使います。親の WebDriverBiDiMode への参照です。
タブ操作(navigate / jsEval など)は Context 側、タブ一覧/終了/イベント購読(CloseBrowser / newTab / BiDiEvents など)はこちら経由、という使い分けになります。
t.ThisWebDriverBiDiMode.newTab
t.ThisWebDriverBiDiMode.TimeOutSecond = 60
t.ThisWebDriverBiDiMode.CloseBrowserExEventCore
Property Get ExEventCore() As WebDriverBiDiCore自作の拡張クラスで、BiDi の非同期イベント(RaiseEvent)を WithEvents で受け取るときに使う、上級者向けの通信コア(WebDriverBiDiCore)への参照です。自作の拡張クラス以外では使いません。
タイムアウト
TimeOutSecond はこのクラス自体にはなく、親の WebDriverBiDiMode.TimeOutSecond で設定します。
t.ThisWebDriverBiDiMode.TimeOutSecond = 60詳細は タイムアウト設定方法について。
デバッグ
printMsg
Public Sub printMsg(LogLevel_ As LogLevelName, strMsg As String, From As String, _
Optional isHeader As Boolean = False, Optional doRaiseError As Boolean)デバッグ/ログ出力です。通常はフレームワーク内部から呼ばれます。

