再接続 (reattach)
認証の手作業など、プロシージャをまたいで同じデバッグブラウザへ戻りたいときに使います。
流れ
- Part1: いつもどおり起動・ナビして処理を中断(ブラウザは開いたまま)
- Part2:
ReattachOptionsで制御経路を指定し、reattachでパイプ情報/コンテキストを復元して続きを実行
reattach に渡す ReattachOptions は、次の3つのうちいずれか1つの制御経路を必ず指定します(指定しないと VBA エラーになります)。
| 制御経路 | 指定の書き方 |
|---|---|
| Pipe | ReattachOptions.Set_PipeMode = UserName |
| Port(WebSocket) | ReattachOptions.Set_WebSocketMode(ws) = UserName |
| WebView2 | ReattachOptions.Set_WebView2Mode(wv) = UserName |
使い切りです
ReattachOptions は reattach を呼ぶと破棄されます。reattach のたびに、制御経路を指定し直してください。
CDP — ブラウザ単位
CDPBrowser.reattach に渡します。ここでは基本の Pipe 版を示します。
' --- Part1 ---
Dim c As CDPContext
Set c = ShSetting01_StartBrowser.StartCDPModeContext
c.navigate "https://google.com"
' --- Part2(別プロシージャ)---
Dim UserName As String
UserName = ShSetting01_StartBrowser.CurrentUserName
ReattachOptions.Set_PipeMode = UserName ' 制御経路を指定
Dim b As New CDPBrowser
b.reattach ReattachOptions ' パイプが死んでいる場合はここで VBA エラー停止
Dim r As CDPContext
Set r = b.getTab(setMain:=True) ' 必須: setMain:=True
r.navigate "https://example.com"注意
CDPBrowser.reattach は戻り値なしの Sub です。接続情報が生きていない場合は Boolean を返さず VBA エラーで停止します。エラーで止めたくない場合は On Error を使ってください。
CDP — タブ(Context)単位
CDPContext.reattach は Function ... As Boolean で、失敗時は例外を投げず False を返します。
Dim UserName As String
UserName = ShSetting01_StartBrowser.CurrentUserName
ReattachOptions.Set_PipeMode = UserName
' 第2引数: Excel に記録した SessionId を再利用するか
Dim c As New CDPContext
If Not c.reattach(ReattachOptions, False) Then
MsgBox "TargetID が無効です"
Exit Sub
End If
c.navigate "https://example.com"SessionID を保持して引き継ぐ場合は、次節を参照してください。
SessionID の引き継ぎについて
基本的には、SessionID は再更新して繋ぎ直すのが CDP のルールです。ただし次のようなシチュエーションでは、SessionID を保持しておくとよいでしょう。
- JavaScript 実行結果の ObjectID を次のプロシージャでも使いまわしたい場合
→ SessionID を更新するとこれらが失われるため
WARNING
この SessionID 引き継ぎは、CDP の CDPContext.reattach からのみ対応します。
Pipe 版
- 処理の最後に
CDPContext.KeepSession = True - 再開したいプロシージャで、
ReattachOptions.Set_PipeModeを指定したうえで、CDPContext.reattach(ReattachOptions, True)として呼ぶ - あとは今まで通り
' --- Part1 ---
Dim c As CDPContext
Set c = ShSetting01_StartBrowser.StartCDPModeContext
' ... JavaScript 実行などで ObjectID を得る ...
c.KeepSession = True
' --- Part2(別プロシージャ)---
Dim UserName As String
UserName = ShSetting01_StartBrowser.CurrentUserName
ReattachOptions.Set_PipeMode = UserName
Dim t As New CDPContext
If Not t.reattach(ReattachOptions, True) Then Exit Sub
' 同じ SessionID 上で ObjectID を引き続き利用可能Port(WebSocket)版
Port は「後付け」で繋ぐ経路のため、既存ブラウザへの接続処理(AutoConnectPageCDP など)を行ってから、その接続を ReattachOptions に渡します。
Dim UserName As String
UserName = ShSetting01_StartBrowser.CurrentUserName
' 1. 既存ブラウザへ WebSocket 接続
Dim ws As CDPCoreViaWebSocket
Set ws = New CDPCoreViaWebSocket ' ※`As New` で宣言しないこと
If Not ws.AutoConnectPageCDP(UserName) Then Exit Sub
' 2. 接続した WebSocket を、制御経路として指定
ReattachOptions.Set_WebSocketMode(ws) = UserName
' 3. reattach
Dim t As New CDPContext
If Not t.reattach(ReattachOptions) Then Exit Sub詳しくは WebSocket モードでできること を参照してください。
WinSock ハンドルの引き継ぎ(接続処理を飛ばす)
- 処理の最後に
CDPContext.KeepSession = Trueにしつつ、DisconnectCDPなどの切断処理をしない - 再開したいプロシージャで、
CDPCoreViaWebSocket.ReConnectCDP(UserName)により、Excel に記録済みの WinSock ハンドルを復元する ReattachOptions.Set_WebSocketMode(ws) = UserNameに加え、ReattachOptions.Set_Destruction = False(古いデータを破棄しない)にして、CDPContext.reattach(ReattachOptions, True)を呼ぶ
' --- Part1 ---
' AutoConnectPageCDP → reattach 後の処理 ...
t.KeepSession = True
' ※ ここでは DisconnectCDP しない
' --- Part2(別プロシージャ)---
Dim UserName As String
UserName = ShSetting01_StartBrowser.CurrentUserName
Dim ws As CDPCoreViaWebSocket
Set ws = New CDPCoreViaWebSocket
ws.ReConnectCDP UserName ' 記録済みの WinSock ハンドルを復元(無ければ VBA エラー)
With ReattachOptions
.Set_WebSocketMode(ws) = UserName
.Set_Destruction = False ' WinSock を使いまわすときは False
End With
Dim t As New CDPContext
If Not t.reattach(ReattachOptions, True) Then Exit Sub今目の前のブラウザへ接続する場合
edge://inspect/#remote-debugging で許可した、今目の前のブラウザへ繋ぐ場合は、ReConnectCDP の代わりに CDPCoreViaWebSocket.AutoConnectDevToolsActivePort(BrowserCapabilities) で接続します(対象のユーザーデータフォルダ名は BrowserCapabilities.Set_UserDataDirName で指定)。詳細は WebSocket モードでできること を参照してください。
WebView2 版
考え方は同じです。接続済みの CDPCoreViaWebView2 を ReattachOptions.Set_WebView2Mode(wv) = UserName で指定し、CDPContext.reattach(ReattachOptions, True) を呼びます。詳細は WebView2モードでできること / UserForm への埋め込み(Lv.99: Excel単体) を参照してください。
BiDi — Mode / Context
' Part1
Dim First As WebDriverBiDiContext
Set First = ShSetting01_StartBrowser.StartBiDiModeContext
First.navigate "https://www.google.com/"
' Part2 — Mode
Dim UserName As String
UserName = ShSetting01_StartBrowser.CurrentUserName
ReattachOptions.Set_PipeMode = UserName
Dim mode As New WebDriverBiDiMode
mode.reattach ReattachOptions ' 失敗時は VBA エラーで停止
Dim tab As WebDriverBiDiContext
Set tab = mode.getTab(setMain:=True)
If tab Is Nothing Then
MsgBox "有効なタブがありません。タブを追加して再試行"
Exit Sub
End If
tab.navigate "https://example.com"
' Part2 — 最後に操作した Context 直接
ReattachOptions.Set_PipeMode = UserName
Dim ctx As New WebDriverBiDiContext
If Not ctx.reattach(ReattachOptions) Then Exit Sub
ctx.navigate "https://w3c.github.io/webdriver-bidi/"注意
- パイプハンドルや Target / BiDi context が死んでいると失敗します。その場合は Part1 からやり直し
WebDriverBiDiMode.reattachは戻り値なしのSub(失敗時は VBA エラー)、WebDriverBiDiContext.reattachはBooleanを返します- BiDi の mapper タブが消えても、
WebDriverBiDiMode.reattachで再始動できる場合があります。このとき、ReattachOptions.Set_BiDiSessionCapabilitiesRequestなどの BiDi 用の設定が使われます - 既存ブラウザ(デバッグポート)への接続は、CDP でも BiDi でも、接続済みの
CDPCoreViaWebSocketをReattachOptions.Set_WebSocketMode(ws)で指定するパターンです(Demo_CDP.AutoConnect*/Demo_WebDriverBiDi.AutoConnect*)。詳しくは WebSocket モード
「BiDiのmapperタブは消えているがブラウザ自体は生きている」ケースで再接続しても、Excel テーブルに記録済みの BiDi-context(メインタブ)情報は保持されます。
関連デモ
Demo_CDP.demoReattachmentPart*Demo_WebDriverBiDi.demoReattachmentPart*

