fix(browser): 同 profile 的浏览器还活着时不再必然启动超时
真机复现(我做的):同 profile 再起一次 chrome.exe ⇒ Chrome **把命令委托给已有 实例并 exit 0**,stderr 逐字「正在现有的浏览器会话中打开。」⇒ **不产生新的 DevToolsActivePort** ⇒ 我们的等待只能超时 ⇒ 浏览器降级档整体不可用。 修法:启动前加一跳**探测**,三档各自出路 —— - 端口记录缺席 / 端口没人听 ⇒ 正常启动(后者先把**陈记录**清掉:那是启动时写下 的记录、不是锁,删一条指向死端口的记录不会伤到任何活实例); - 端口在听 + `/json/version` 有合法响应 ⇒ **复用它**(INFO `browser debug endpoint reused`),**不再起第二个**; - 端口在听但握不上手 ⇒ **如实报错**(保留现场,既不起进程也不删记录); - 真被占用且拿不到端点 ⇒ 报错带 **Chrome 原话**(`withChromeOutput`)+ 可操作处置。 🔴 红线(写进错误文案与注释):**绝不杀别人的浏览器**、不发信号抢 profile、 不新开监听端口;`ErrLaunch` / `errors.Is` 口径未破。 验收(主会话复跑 + 亲自变异):browser 包与 plugins/tools/io 两包 build/vet/test 全绿;我用 -overlay 摘掉「复用」那一支 ⇒ TestLocalChromeAdoptsLiveEndpoint 与 TestDial_ReusesLiveEndpointAndDoesNotSpawnSecondProcess 变红。子代理另跑了真机 端到端(临时 profile):会话 1 拿端口 51732 → 裸起第二次 chrome(exit 0)→ 会话 2 **复用同一端口、未起第二个实例**。 ⚠️ 已知未修(如实):Chrome 那句委托提示是**控制台代码页(GBK)字节**,我们的 UTF-8 日志里会显示成乱码(字节保真、人看不了);彻底解决要引编码转换,另定。 ⚠️ 判据③的取舍:陈记录 +端口恰被别的程序复用时,会持续报错直到人工删 `DevToolsActivePort`(错误文案已写明处置);**未加"报错后自动清理重试"**。
This commit is contained in:
1 parent
93c5a4c46f
commit
7f63c5bec4
4 files changed
+470
-43
No files matched your search
@@ -152,7 +152,8 @@ func TestLocalChromeAdoptsLiveEndpoint(t *testing.T) {
|
||||
}
|
||||
|
||||
// TestLocalChromeDoesNotAdoptDeadEndpoint 钉住反面:端口文件在、但没人听 ⇒ **不认领**
|
||||
// (否则会连到一个死端口,比启动失败更难排查)。
|
||||
// (否则会连到一个死端口,比启动失败更难排查)。它同时钉住「没人听」的**分类**:
|
||||
// 探测要给出 ("", nil) 而不是错误 —— 这是「陈文件,可以清掉后照常启动」的那一条出路。
|
||||
func TestLocalChromeDoesNotAdoptDeadEndpoint(t *testing.T) {
|
||||
t.Parallel()
|
||||
dir := t.TempDir()
|
||||
@@ -160,9 +161,13 @@ func TestLocalChromeDoesNotAdoptDeadEndpoint(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
l := &localChrome{exe: "x", profileDir: dir, timeout: time.Second, log: discardLog()}
|
||||
if endpoint, ok := l.adoptExisting(context.Background()); ok {
|
||||
endpoint, err := l.probeExistingEndpoint(context.Background())
|
||||
if endpoint != "" {
|
||||
t.Fatalf("死端口不该被认领(endpoint=%q)", endpoint)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("死端口是「陈文件」而不是「坏端点」,探测不该报错: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// TestWaitDevToolsPort_ReportsEarlyExit 钉住「进程立刻退出」要**立刻**如实报,并把
|
||||
|
||||
Reference in new issue
Block a user