题干与适用场景
团队要把浏览器端网络拦截从私有调试协议迁移到 WebDriver BiDi。请说明会话建立、事件订阅、拦截生命周期、并发隔离与失败恢复如何设计。
面试官考察点
- 是否理解 BiDi 是 WebDriver 的双向、事件驱动协议,仍处于 W3C Working Draft 阶段。
- 是否能区分 session、context、intercept id、request id 和事件订阅的职责。
- 是否按 URL pattern、phase、context 限定拦截,避免跨测试污染。
- 是否设计超时、取消、断线重连和敏感数据脱敏,而不是只展示一段脚本。
回答前需要澄清的问题
- 测试需要观察请求,还是要在 request/response 阶段修改或阻断?
- 运行环境、浏览器实现和驱动是否都支持所需 BiDi 模块?
- 每个测试是否独占浏览器 context,拦截规则和事件日志保存多久?
- 失败时应恢复真实网络,还是让测试立即失败并保留诊断证据?
30 秒回答框架
我会为每个测试创建独立 BiDi session 与 browsing context,先协商能力,再订阅必要事件。拦截规则限定 URL、phase 和 context,收到 beforeRequestSent 等事件后按 request id 做一次性决策,放行、阻断或提供模拟响应。所有规则有超时和清理钩子;断线时停止测试并恢复浏览器,日志只保存脱敏元数据。生产流量不接入这套拦截器。
分步骤深入解答
1. 先确认协议与实现边界
WebDriver BiDi 通过 WebSocket 提供双向、事件驱动通信;W3C 2026-06-01 版本仍是 Working Draft。客户端应读取驱动与浏览器能力,不能把草案字段当作所有实现都稳定支持的契约。经典 WebDriver 的 HTTP 命令与 BiDi 事件可以共存,但要明确由哪个通道负责状态。
2. 建立隔离的会话和上下文
测试启动时创建 session,建立独立 browsing context,并记录 session、context 和测试 run id 的映射。每条拦截规则产生唯一 intercept id,规则只绑定所需 URL pattern、phase 和 context。测试结束按逆序取消订阅、移除拦截并关闭 context,防止规则泄漏到下一用例。
3. 设计事件与拦截决策
先用 session.subscribe 订阅 network 事件,再根据事件携带的 request id 查找测试状态。拦截命中后只能执行一次明确动作:继续请求、阻断,或在实现支持的阶段提供响应。决策器要有幂等键和超时;未知 request id、重复事件或不支持的 phase 进入可观测错误路径,而不是静默放行。
4. 处理并发、断线与安全
并发测试不得共享可变拦截表;每个 context 维护规则和事件缓冲区。WebSocket 断线时停止继续修改网络,标记测试为基础设施失败,保留脱敏 URL、状态和时间线后清理资源。请求头、Cookie、正文和令牌默认打码。拦截器只运行在测试浏览器,凭据使用短期测试数据,禁止连接生产域名。
高质量示范回答
我会把 BiDi 当作协议边界来设计,而不是把某个自动化库的 route API 搬过来。每个测试建立独立 session 和 browsing context,先读取能力,再订阅需要的 network 事件。拦截规则以唯一 id 管理,并限定 URL pattern、phase 和 context;事件按 request id 查找状态,执行一次性的放行、阻断或模拟响应。测试结束逆序取消订阅、移除规则和关闭 context。所有动作都有超时、幂等和诊断日志;WebSocket 断线直接标记基础设施失败并清理,不在不确定状态下继续改包。日志脱敏,测试浏览器与生产网络隔离,兼容性差异通过能力矩阵显式管理。
常见错误
- 把 Working Draft 字段当成所有浏览器和驱动的稳定 API。
- 只按 URL 全局拦截,没有绑定 context、phase 和测试 run id。
- 未先订阅事件,或把事件 id 与 intercept id、context id 混用。
- 断线后继续发送修改请求,造成测试结果不可解释。
- 测试结束不移除拦截规则,导致后续用例被污染。
- 把 Cookie、Authorization 或响应正文原样写入日志。
- 在生产浏览器或真实用户流量上启用测试拦截器。
追问及应对
BiDi 与经典 WebDriver 如何共存?
经典 WebDriver 适合命令式控制,BiDi 适合持续事件和网络观察。可以共用浏览器会话,但必须规定状态来源与关闭顺序,避免两个通道同时修改同一上下文。
为什么拦截规则需要 phase?
请求发送前、响应开始和响应完成时可获得的数据不同。按 phase 选择能力,才能判断哪些修改可行,并对不支持的阶段提前失败,而不是运行中猜测。
如何证明测试没有跨用例污染?
为每个用例创建独立 context 和 intercept id,结束时查询并清空该 context 的规则,再运行隔离性检查;同时记录订阅、取消和关闭事件,失败时保留时间线。