Playwright 无头浏览器停滞报告:代理浏览器工作进程为何需要主动存活探测

2026 年 9 月 12 日提交的一则 Playwright 问题报告描述了一种间歇性容器 CI 现象:context.newPage() 与 page.goto() 长时间无法结束,而 browser.isConnected() 仍然返回 true。报告者使用的是长期运行的 Bun 进程、Playwright 1.61.1 与 Chromium headless shell 1228;同一进程直接请求相同服务时仍能获得 HTTP 200。
该问题最终以“不计划处理”关闭,没有确认它是 Playwright 缺陷,也没有提供最小复现,更没有证据表明代理是原因。它真正带来的运营信号很具体:传输层仍显示连接,不等于浏览器工作进程还能创建页面、执行脚本或完成导航。
报告说明了什么,又没有说明什么
报告者称,该现象在一项长期运行的 CI 负载中约有 30% 的触发率,并检查过内存压力、CPU 与 I/O 限流、PID 耗尽、共享内存不足、共享用户目录、高风险启动参数和明显崩溃等常见因素。这些是该环境的排错记录,不能当作所有环境的通用排除结论。
由于没有确认根因,团队不应把相似症状直接归责于某个版本或供应商。更稳妥的做法,是把它作为一种故障模式,在自己的受控环境中主动检测。
内部来源说明:Microsoft Playwright 问题“context.newPage() and page.goto never settle while browser.isConnected() stays true (headless_shell 1228, container CI)”,提交于 2026 年 9 月 12 日;以“不计划处理”关闭。
“已连接”只是第一层状态
生产浏览器工作进程至少应区分以下健康状态:
- 进程存活:操作系统进程仍存在且未退出。
- 控制通道连接:自动化客户端仍持有控制连接。
- 运行时响应:现有页面或上下文能在限定时间内执行无副作用表达式。
- 页面创建响应:可以创建并关闭一次性页面。
- 导航响应:能在限定时间内打开自有测试端点。
- 代理路径健康:预期路线上的 DNS、隧道、TLS 与 HTTP 阶段均成功。
把这些状态压缩成一个布尔值会产生错误信心。队列可能不断把新任务交给“仍连接但已无法前进”的工作进程,让局部故障演变成积压。
建立有界探测阶梯
先执行成本最低的检查,并在任一阶段失败时停止。依次确认进程身份与控制连接,使用短时限执行一个无副作用表达式;工作进程空闲时,再创建并关闭一次性页面;最后打开由团队拥有的轻量端点,校验一次性挑战值。
每一步都必须使用单调时钟和独立时限。即使浏览器库内部的 Promise 永远不结束,调用方自己的定时器也必须能终止等待。记录失败阶段、耗时、浏览器构建号、库版本、容器标识和代理路线 ID,但不要记录代理密码、会话 Cookie 或含客户数据的页面正文。
探测端点应位于浏览器工作进程之外,同时属于获准测试范围。主机侧请求成功只能证明网络的一部分;浏览器通过代理完成探测,才更接近真实业务路径。
恢复时避免重试风暴
探测超时后,立即停止向该工作进程分配新任务,将其标记为可疑。只允许已经确认具有幂等性的工作在短暂宽限期内完成,随后回收浏览器进程;若终止动作也卡住,则交由容器监督程序处理。
限制并发替换数量。全量同步重启会同时冲击代理网关、鉴权服务和目标站点。应按浏览器构建与路线池设置熔断器,并使用随机退避。保留第一次超时作为主要结果,不能用自动重试成功掩盖原始故障。
导航超时还存在“完成状态不明确”的风险:目标端可能已经收到请求,只是客户端没有拿到最终事件。涉及状态变更时,应使用幂等键或先查询状态,再决定是否重放。
分离浏览器健康与代理健康
针对自有端点运行四组对照:
- 主机不经代理请求。
- 主机经代理请求。
- 浏览器不经代理导航。
- 浏览器经代理导航。
该矩阵可以区分浏览器运行时停滞,以及 DNS、代理隧道、TLS、源站或容器网络故障。在工具允许时,分别记录解析、连接、隧道、TLS、首字节与完成耗时。HTTP 协商问题可配合代理 ALPN 协商审计排查。
如果重连开始成倍增长,请应用代理重试风暴预防指南中的并发和熔断控制;相邻的连接重置现象可参考Playwright keep-alive ECONNRESET 报告。
上线检查清单
- 每个异步浏览器调用都有调用方掌控的时限。
- 健康检查分别覆盖运行时响应、页面创建与受控导航。
- 直连与代理路径独立测量。
- 可疑工作进程先停止接单,再回收。
- 替换速率与重试并发均设上限。
- 状态变更流程具备幂等或状态核验机制。
- 日志不包含凭据、Cookie 和敏感页面数据。
- 记录构建、库、镜像与路线标识,便于对比。
常见问题
browser.isConnected 返回 true 是否代表浏览器健康?
不是。它只说明客户端仍认为控制连接存在,不能证明运行时还能创建页面、执行任务或完成导航。
这份报告是否证明 Playwright 1.61.1 有缺陷?
不能。问题以“不计划处理”关闭,没有确认根因或最小复现。必须在自己的构建与环境中验证。
工作进程卡住后是否应立即换代理重试?
不应自动这样做。先判断原操作是否可能已经到达目标端,为状态变更请求提供幂等保护,并限制替换和重试速率。
合规说明
浏览器自动化与代理只能用于自有或明确获准测试的系统。请遵守访问控制、站点条款、数据保护义务和速率限制。存活监控用于提升可靠性,不得用于绕过限制。