
本文详解如何在 seleniumbase 中启用并使用 response_interceptor 实现请求级拦截,解决因未正确配置 wire 模式导致的请求捕获不全问题,并提供可直接运行的示例代码与关键注意事项。
本文详解如何在 seleniumbase 中启用并使用 response_interceptor 实现请求级拦截,解决因未正确配置 wire 模式导致的请求捕获不全问题,并提供可直接运行的示例代码与关键注意事项。
SeleniumBase 自 v4.18.0 起原生集成了 Selenium Wire 的能力,支持对 http 请求与响应进行实时拦截、修改和审计——但必须显式启用 wire=True 且在调用 driver.get() 之前设置拦截器,否则 driver.requests 仅记录初始导航请求(如首屏 GET),无法捕获后续异步 XHR、Fetch 或资源加载请求。
以下为推荐的标准用法:
from seleniumbase import Driver def intercept_response(request, response): """拦截每个响应,打印请求头(可扩展为日志记录、断言或请求改写)""" print(f"[{request.method}] {request.url}") if request.headers.get("Authorization"): print("→ 包含认证头") if response: print(f"← 状态码: {response.status_code}") # 关键:必须启用 wire 模式 driver = Driver( browser="chrome", wire=True, # ✅ 必须开启,否则拦截器无效 headed=True, # 推荐开启以观察页面行为 uc=False, # 若需无头模式,可设为 True,但注意部分拦截逻辑依赖渲染上下文 ) # ✅ 必须在 driver.get() 之前设置拦截器 driver.response_interceptor = intercept_response try: driver.get("https://www.wikipedia.org") # 可选:等待动态内容加载完成,确保异步请求被触发 driver.sleep(3) finally: driver.quit()
⚠️ 重要注意事项:
- driver.response_interceptor 是函数引用,不可在 get() 后赋值,否则仅对后续手动发起的请求生效(如 driver.execute_script(“fetch(…)”));
- wire=True 是底层启用 Selenium Wire 的开关,缺失则所有拦截逻辑静默失效;
- 若需访问请求体(request.body)或修改响应(如 mock API 返回),需额外配置 driver.request_interceptor 或使用 response.stream = False(见 Selenium Wire 文档);
- LinkedIn 等 SPA 站点大量依赖前端路由与 Fetch/XHR,务必确保页面充分加载(建议配合 driver.wait_for_ready_state_complete() 或显式等待关键元素)后再结束会话,避免遗漏后台请求。
此外,若需批量分析所有捕获请求(而非仅实时打印),可在测试结束后统一处理:
# 获取完整请求历史(包含已拦截的全部 request/response 对) for req in driver.requests: if req.response: print(f"{req.method} {req.url} → {req.response.status_code}")
综上,SeleniumBase 的请求拦截能力强大且与 Selenium Wire 高度兼容,但其行为严格依赖初始化时的 wire=True 和拦截器注册时机。掌握这两项核心配置,即可稳定实现网络层可观测性,为自动化测试中的接口验证、性能分析与反爬调试提供坚实基础。