Skip to content

WebDriverBiDiMode ​

BiDi セッション/ブラウザ相当です。Playwright の Browser に対応します。

vb
Dim mode As WebDriverBiDiMode
Set mode = ShSetting01_StartBrowser.StartBiDiMode
Dim tab As WebDriverBiDiContext
Set tab = mode.getTab(setMain:=True)
tab.navigate "https://example.com"
mode.CloseBrowser

タブからすぐ始めたい場合は設定シートの StartBiDiModeContext → WebDriverBiDiContext が簡単です。

起動・再接続・終了 ​

OpenBrowser ​

vb
Public Function OpenBrowser(caps As BrowserCapabilities) As String

ブラウザを WebDriver BiDi として起動し、session.new まで行います。日常利用では設定シート経由を推奨します(内部でこのメソッドを呼んでいます)。戻り値は初期接続先の URL 文字列です。

引数意味
caps起動時のオプションをまとめた BrowserCapabilities

ユーザーデータフォルダ名・ブラウザの種類・追加の起動引数・初期 URL などは、すべて caps で渡します。session.new に渡す sessionCapabilitiesRequest は、caps.Set_BiDiSessionCapabilitiesRequest で設定します。

vb
Dim caps As New Dictionary
' ... capabilities を組み立て ...
Set BrowserCapabilities.Set_BiDiSessionCapabilitiesRequest = caps

Dim mode As WebDriverBiDiMode
Set mode = New WebDriverBiDiMode
mode.OpenBrowser BrowserCapabilities

sessionCapabilitiesRequest の詳細は はじめに。

reattach ​

vb
Public Sub reattach(reattachInfo As ReattachOptions)

既存の BiDi 接続へ再接続します。通信経路(Pipe / Port)は、ReattachOptions で指定します。

引数意味
reattachInfo再接続時のオプションをまとめた ReattachOptions。制御経路の指定が必須。BiDi-CDP Mapper が再始動されたときに使う Set_BiDiSessionCapabilitiesRequest なども、ここで設定します

戻り値はありません。CDPBrowser.reattach と同じく、再接続に失敗した場合は VBA エラーで停止します(エラーで止めたくない場合は呼び出し側で On Error を使ってください)。

vb
' Pipe 版
ReattachOptions.Set_PipeMode = ShSetting01_StartBrowser.CurrentUserName

Dim mode As New WebDriverBiDiMode
mode.reattach ReattachOptions

' Port(WebSocket)版
Dim ws As CDPCoreViaWebSocket
Set ws = New CDPCoreViaWebSocket
' ... 接続済み ws を用意する ...
ReattachOptions.Set_WebSocketMode(ws) = UserName

Set mode = New WebDriverBiDiMode
mode.reattach ReattachOptions

注意

  • パイプが生きていない場合は、このメソッドから再開できません。Part1 からやり直してください
  • BiDi-CDP Mapper が再始動された場合のほか、デバッグ中の BiDi セッションが無い(session.status の ready が True)場合にも、session.new を行います。このとき Set_BiDiSessionCapabilitiesRequest が適用されます
  • ReattachOptions は使い切りです。reattach を呼ぶたびに、制御経路を指定し直してください

詳細は 再接続 / WebSocket モード。

CloseBrowser ​

vb
Public Sub CloseBrowser()

browser.close を送ってブラウザを終了し、Excel テーブル上のメインタブ情報と接続ハンドルを解放します。

vb
mode.CloseBrowser

sessionEnd ​

vb
Public Function sessionEnd() As BiDiCDPJson

BiDi コマンド session.end を実行し、ブラウザは閉じずに、BiDi による制御(デバッグ)だけを終わらせます。ブラウザを開いたまま後始末をしたいときに使います。WebSocket 経由の場合は、WebSocket の切断も同時に起こります。

vb
mode.sessionEnd   ' ブラウザは開いたまま、BiDi 制御だけ終了

注意

通信の切断が同時に起こるため、エラーは無視する動作になっています(StopBiDiError:=False 相当)。ブラウザごと終了したい場合は CloseBrowser を使ってください。

タブ ​

newTab ​

vb
Public Function newTab( _
    Optional newWindow As Boolean, _
    Optional isBackground As Boolean, _
    Optional setMain As Boolean _
) As WebDriverBiDiContext

新規タブ(またはウィンドウ)を開き WebDriverBiDiContext を返します。BiDi では作成時に URL 直指定はできません。開いたあと navigate してください。

引数意味
newWindowTrue で新しいウィンドウ、False(既定)で既存ウィンドウにタブ
isBackgroundTrue でバックグラウンド(非アクティブ)で開く
setMainTrue で Excel に context を記録(reattach 用)
vb
Dim tab As WebDriverBiDiContext
Set tab = mode.newTab(setMain:=True)
tab.navigate "https://example.com"

Set tab = mode.newTab(newWindow:=True, isBackground:=True)

関連: マルチタブ

getTab ​

vb
Public Function getTab( _
    Optional Url As String, _
    Optional maxDepth As Long, _
    Optional setMain As Boolean, _
    Optional doRetrySecond As Double _
) As WebDriverBiDiContext

既に開いている browsing context を URL 部分一致などで探し、WebDriverBiDiContext として返します。見つからない場合は Nothing になり得ます。

引数意味
UrlURL 部分一致。省略時は見つかった先頭(未接続相当)の context
maxDepthbrowsingContext.getTree の深さ。0(既定)ならトップレベルのみ(iframe 除外)
setMainTrue で Excel に context を記録
doRetrySecond指定秒以内に見つかるまでリトライ。0(既定)なら 1 回のみ
vb
' 直近のタブへ
Dim tab As WebDriverBiDiContext
Set tab = mode.getTab(setMain:=True)

' URL 部分一致
Set tab = mode.getTab(Url:="example.com")

' iframe まで含めて最大 5 秒リトライ
Set tab = mode.getTab(Url:="https://challenges.cloudflare.com/", maxDepth:=2, doRetrySecond:=5)

注意

WebDriver BiDi ではタブ名(タイトル)での検索はできません。URL で探してください。

serializeMainTab ​

vb
Public Property Get serializeMainTab() As String
Public Property Let serializeMainTab(contextId As String)

Excel テーブルにメイン browsing context id を記録/読み取ります。newTab / getTab の setMain:=True が内部でこれを使います。

vb
Debug.Print mode.serializeMainTab
mode.serializeMainTab = tab.context

プロトコル・イベント ​

ExecuteBiDi / ExecuteBiDiAsync ​

vb
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

セッション/ブラウザ向け BiDi コマンドです。結果を待つか(ExecuteBiDi)、待たずに後で確認するか(ExecuteBiDiAsync)の 2 種類があります。

引数意味
methodNameメソッド名(例: "browsingContext.navigate" / "browser.close")
paramsparams の Dictionary。省略時は空の {}
StopBiDiError / StopError失敗時に停止するか。既定は True

ExecuteBiDiAsync はコマンド実行時の id(Long)のみを返し、結果は待ちません。回収は TakeResultBiDi で行います。

vb
Dim params As New Dictionary
params.Add "url", "https://example.com"
params.Add "wait", "complete"
' ※ Context 側の ExecuteBiDi は context を自動付与

Dim result As BiDiCDPJson
Set result = mode.ExecuteBiDi("browser.getUserContexts", New Dictionary)

詳細は 低レイヤー BiDi / CDP コマンドについて。

SetBiDiPlusChannel ​

vb
Public Property Let SetBiDiPlusChannel(ChannelStr As String)

BiDi+ 独自の拡張フィールドである goog:channel(v3.1.1〜)を設定します。以降に送信する全 BiDi コマンドへ、指定した文字列タグが自動付与されます。CDP そのものの動作には影響せず、ログを見返す際の目印として使えます。

引数意味
ChannelStr付与する goog:channel の値。空文字(または vbNullString)でフィールド自体を外す
vb
mode.SetBiDiPlusChannel = "MyTask"   ' 以降のBiDiコマンドすべてに `"goog:channel":"MyTask"` が付与される

WebDriverBiDiContext からは ThisWebDriverBiDiMode.SetBiDiPlusChannel 経由で同じ値を設定します。詳細は 低レイヤー BiDi / CDP コマンドについて(「goog:channelフィールド」節)。

TakeEvents ​

vb
Public Sub TakeEvents(Optional StopApiError As Boolean = True, Optional destruction As Boolean)

非同期応答/イベントの吸い上げです(almighty:受信 → 解析 → 蓄積中の全メッセージについて RaiseEvent までを一括で行う)。TakeResultBiDi の前に呼び出す必要があります。

引数意味
StopApiErrorPipe/WebSocket 障害時に停止するか。既定は True
destructionTrue でストリームに蓄積せず破棄するだけ(RaiseEventは起きない)
vb
mode.TakeEvents

TakeEvent / NewResBiDi / AnalyzeBiDi ​

vb
Public Sub AnalyzeBiDi(Optional StopApiError As Boolean = True, Optional destruction As Boolean)
Property Get NewResBiDi() As Boolean
Public Sub TakeEvent()

TakeEvents を分解した manual な低レベル部品です。特定イベント検出時に即座に割り込んで残りのイベント処理を止めたい、といった上級者向け用途で使います。

メンバー役割
AnalyzeBiDiPipe/WebSocket からバイト配列を受け取り、テキストへ変換して 1 件分取り出せる状態にする
NewResBiDiAnalyzeBiDi 後、取り出せる新規メッセージがあるか(Get 専用)
TakeEvent蓄積済みメッセージを 1 件だけ取り出し RaiseEvent する

TakeResultBiDi ​

vb
Property Get TakeResultBiDi(commandID As Long) As String

ExecuteBiDiAsync が返した id をキーに、蓄積された実行結果(JSON 文字列)を取り出します。取り出し後は Dictionary から削除されます。結果がまだ無い場合は空文字を返します。

vb
Dim cmdId As Long
cmdId = mode.ExecuteBiDiAsync("browsingContext.navigate", params)

Do
    mode.TakeEvents
    Dim raw As String
    raw = mode.TakeResultBiDi(cmdId)
    If LenB(raw) Then Exit Do
    DoEvents
Loop

TIP

コマンド回数が20億を超えると、オーバーフロー対策により蓄積中の結果履歴が すべて削除されます。未回収の ExecuteBiDiAsync 結果も消える点に注意してください。

LastBiDiJsonError ​

vb
Property Get LastBiDiJsonError() As Dictionary

ExecuteBiDi 経由で記録された、最後の BiDi コマンドエラーです。Err.LastDllError と同様、成功しても消えません。

StopBiDiError:=False のとき、戻り値が Nothing なら本プロパティで詳細を確認します。

vb
Dim result As BiDiCDPJson
Set result = mode.ExecuteBiDi("webExtension.install", params, False)

If result Is Nothing Then
    Debug.Print mode.LastBiDiJsonError("message")
    ' 必要なら mode.LastBiDiJsonError.RemoveAll でクリア可
End If

BiDiEvents ​

vb
Property Get BiDiEvents() As Dictionary
Property Set BiDiEvents(ObjDic As Dictionary)

標準モジュール上で BiDi の非同期イベントを受け取るための蓄積口です(CDP の BrowserEvents 相当)。

操作意味
Set … = New Dictionary記録開始
Set … = Nothing記録停止
退避した Dictionary を再代入セーブ/再開
vb
Set mode.BiDiEvents = New Dictionary
' ... SubscribeBiDiEvent 後に操作 ...
mode.TakeEvents
' mode.BiDiEvents を参照
Set mode.BiDiEvents = Nothing

SubscribeBiDiEvent ​

vb
Property Set SubscribeBiDiEvent(Optional subscribe As Boolean = True, Optional params As Dictionary, events As Collection)
Property Let SubscribeBiDiEvent(Optional subscribe As Boolean = True, Optional params As Dictionary, events)

session.subscribe / session.unsubscribe を実行します。どのイベントを購読中かの管理は呼び出し側で行います。

v3.2.0でのリネーム

以前は sessionSubscribe という名称でした。挙動に変更はありません。

引数意味
subscribeTrue(既定)で購読、False で購読解除
paramsWebDriverBiDiContext からタブ単位で呼ぶ際に内部で使用。直接指定は不要
eventsSET: イベント名の Collection/LET: 1次元配列または文字列1件(例: "network.beforeRequestSent")
vb
' Collection版(SET)
Dim events As New Collection
events.Add "network.beforeRequestSent"
events.Add "network.responseCompleted"
events.Add "log.entryAdded"
Set mode.SubscribeBiDiEvent = events

' 配列版(LET、v3.1.1.1〜)
mode.SubscribeBiDiEvent = Array("network.beforeRequestSent", "network.responseCompleted", "log.entryAdded")

' 解除
Set mode.SubscribeBiDiEvent(False) = events

params を省略した場合はブラウザ全体(全タブ共通)での購読になります。タブ単位で購読したい場合は WebDriverBiDiContext.SubscribeBiDiEvent(v3.1.1.1〜)を使ってください。

手順・セーブ/再開は イベント購読 を参照してください。

タイムアウト ​

TimeOutSecond ​

vb
Property Let TimeOutSecond(TimeSec As Double)
Property Get TimeOutSecond() As Double

BiDi コマンド結果待ちの上限です。デフォルトは 30 秒です。

vb
mode.TimeOutSecond = 60
Debug.Print mode.TimeOutSecond   ' 60(v3.2.0〜、読み返し可能に)

v3.2.0での変更

以前は LET 専用(書き込みのみ)で設定中の値を読み返せませんでしたが、v3.2.0 で Property Get が追加され、現在値を読み返せるようになりました。

タブ側(WebDriverBiDiContext)からは ThisWebDriverBiDiMode.TimeOutSecond で同じ値を触れます。

詳細は タイムアウト設定方法について。

ユーティリティ ​

sleep ​

vb
Public Sub sleep(Optional seconds As Double = 0.5)

指定秒待ちます。既定は 0.5 秒です。

vb
mode.sleep 1

TimerCounter ​

vb
Public Function TimerCounter() As Double

単調増加の経過ミリ秒です。VBA の Timer 関数の代わりに、自前ループのタイムアウト判定へ使えます。

vb
Dim startMs As Double
startMs = mode.TimerCounter
Do
    mode.TakeEvents
    If mode.TimerCounter - startMs > 5000 Then Exit Do
    DoEvents
Loop

詳細は タイムアウト設定方法について。

printMsg ​

vb
Public Sub printMsg(LogLevel_ As LogLevelName, strMsg As String, From As String, _
    Optional isHeader As Boolean = False, Optional doRaiseError As Boolean)

デバッグ/ログ出力です。通常はフレームワーク内部から呼ばれます。

高度な/内部寄りの API ​

日常利用では意識不要です。拡張やフレームワーク連携向けです。

RunCollect_InfoList ​

vb
Property Set RunCollect_InfoList(ArgCollect As Collection)

browsingContext.contextCreated で得た InfoList を、渡した Collection に蓄積します。Nothing で収集停止(用が済んだら必ず解放)。

vb
Dim info As New Collection
Set mode.RunCollect_InfoList = info
' ... タブ作成などの操作 ...
Set mode.RunCollect_InfoList = Nothing

EnableDiscoverContexts ​

vb
Property Let EnableDiscoverContexts(Flag As Boolean)

browsingContext.contextCreated / contextDestroyed の購読と、確保中 WebDriverBiDiContext のカウントに使います。Context の生成/破棄時に呼ばれる想定です。

v3.2.0での変更

navigationStarted / domContentLoaded / load の購読も同時に行うようになりました(WaitEvents によるイベント駆動の読み込み待機のため)。

ExEventCore ​

vb
Property Get ExEventCore() As WebDriverBiDiCore

自作の拡張クラスで、BiDi の非同期イベント(RaiseEvent)を WithEvents で受け取るときに使う、上級者向けの通信コア(WebDriverBiDiCore)への参照です。自作の拡張クラス以外では使いません。

関連 ​

Excel VBA × CDP / WebDriver BiDi