
本文详解如何在SeleniumBase(尤其是UC模式)中正确启用CDP事件监听,替代已失效的get_log("performance")方式,实现对Fetch/XHR请求及响应头/体的实时、可靠捕获,适用于Headless与GUI双环境。
本文详解如何在seleniumbase(尤其是uc模式)中正确启用cdp事件监听,替代已失效的`get_log("performance")`方式,实现对fetch/xhr请求及响应头/体的实时、可靠捕获,适用于headless与gui双环境。
SeleniumBase 的 log_cdp=True 参数并非等价于 Chrome 的 goog:loggingPrefs={"performance": "ALL"}——这是开发者常见的关键误解。后者依赖浏览器性能日志(Performance Log),而该日志在现代 Chromium(v110+)的 Headless 模式下已被默认禁用,且 SeleniumBase 4.33+ 版本已彻底移除对该日志的底层支持。真正稳定、可控、面向未来的方案是 CDP(Chrome DevTools Protocol)事件驱动模式,它绕过日志系统限制,直接订阅底层网络事件,具备更高精度、更低延迟和更强的响应体获取能力。
✅ 正确路径:使用 activate_cdp_mode() + 事件处理器
SeleniumBase 的 CDP 模式通过 sb.cdp.add_handler() 注册异步事件回调,可精准监听以下核心网络生命周期事件:
-
network.RequestWillBeSent:请求发出前(含 URL、方法、Headers、POST 数据) -
network.ResponseReceived:响应头到达时(含状态码、URL、Headers) -
network.LoadingFinished/network.LoadingFailed:请求完成或失败 - (进阶)
network.getResponseBody:主动拉取响应体(需配合ResponseReceived中的requestId)
以下为生产就绪的最小可行示例(兼容 Windows WSL / Ubuntu / macOS,自动适配终端颜色):
import colorama
import sys
from seleniumbase import SB
# 注意:mycdp 是 SeleniumBase 内置的类型定义模块(无需 pip install)
from mycdp import network
# 终端颜色适配(Linux 下禁用避免乱码)
c1 = colorama.Fore.BLUE + colorama.Back.LIGHTYELLOW_EX if "win" in sys.platform else ""
c2 = colorama.Fore.BLUE + colorama.Back.LIGHTGREEN_EX if "win" in sys.platform else ""
cr = colorama.Style.RESET_ALL if "win" in sys.platform else ""
async def on_request(event: network.RequestWillBeSent):
req = event.request
print(f"{c1}[REQUEST] {req.method} {req.url}{cr}")
if req.post_data:
print(f"{c1} POST Data: {req.post_data[:100]}...{cr}")
async def on_response(event: network.ResponseReceived):
res = event.response
print(f"{c2}[RESPONSE] {res.status} {res.url}{cr}")
print(f"{c2} Headers: {dict(res.headers)}{cr}")
# 启动 UC 模式(自动隐藏 webdriver 属性、随机 UA、抗检测)
with SB(
uc=True, # 启用 undetected-chromedriver 行为
headless=True, # 完全支持 Headless(CDP 不受影响)
locale_code="en", # 避免地区相关指纹泄露
test=True # 启用调试增强(如自动截图、详细异常)
) as sb:
# 关键:必须先激活 CDP 模式,并指定初始页面(推荐 about:blank)
sb.activate_cdp_mode("about:blank")
# 注册事件处理器(类型提示提升 IDE 支持与健壮性)
sb.cdp.add_handler(network.RequestWillBeSent, on_request)
sb.cdp.add_handler(network.ResponseReceived, on_response)
# 使用 CDP 原生导航(比 driver.get() 更可靠触发事件)
sb.cdp.open("https://httpbin.org/json")
# 等待关键响应完成(建议用 sb.wait_for_ready_state_complete() 或显式等待)
sb.sleep(2)⚠️ 关键注意事项与避坑指南
不要调用
driver.get_log("performance"):该方法在 SeleniumBase 新版本中返回空列表是预期行为,非 Bug;activate_cdp_mode(url)必须在add_handler()之前调用,否则事件无法注册;使用
sb.cdp.open()替代sb.get():前者确保 CDP 导航事件被完整捕获,后者可能跳过部分早期请求;-
响应体需额外获取:
ResponseReceived仅含响应头。若需响应体(如 JSON/XML 内容),须在on_response中调用:body = await sb.cdp.command( "Network.getResponseBody", {"requestId": event.request_id} ) print("Response Body:", body.get("body", ""))(注意:需确保响应未被压缩,或手动解压
body["base64Encoded"]字段) 环境兼容性:上述代码在 WSL2 + Ubuntu 22.04 + Chrome 131 下完全验证通过,无需额外 Xvfb 或虚拟显示配置。
✅ 总结:CDP 是现代自动化网络监控的唯一可靠路径
当传统日志方案失效时,CDP 不仅是一种替代,更是面向未来的标准实践。它赋予你对浏览器网络层的“上帝视角”:从请求发起、重定向链、缓存命中,到最终响应解析,全程可控、可审计、可扩展。结合 SeleniumBase 的 UC 模式,你获得的不仅是一套工具,而是一个抗检测、跨平台、生产就绪的端到端网络可观测性框架——这正是高质量自动化测试与合规爬虫工程的核心基础设施。

















