Selenium 4 开始支持调用 Chrome DevTools Protocol(CDP)接口,使我们能实现更高级的自动化控制,例如:
- 捕捉请求和响应头
- 屏蔽某些资源加载
- 模拟设备和网络环境
- 动态设置 LocalStorage、Cookie、Headers 等
本篇介绍如何在 Selenium 中使用 CDP 接口提升调试与控制能力。
🔌 什么是 CDP?
CDP(Chrome DevTools Protocol)是 Chrome 浏览器对外暴露的一套调试协议,原本用于 DevTools(F12)调试器。Selenium 4 起,官方将 CDP 接入,使开发者能通过 Python 代码直接调用这些接口。
✅ 一、获取 DevTools 接口(Selenium 4)
from selenium import webdriver
driver = webdriver.Chrome()
driver.execute_cdp_cmd("Network.enable", {})
📌 所有 CDP 命令通过 driver.execute_cdp_cmd("命令", 参数)
发送。
🧪 示例 1:获取请求头 / 响应头
from selenium.webdriver.chrome.webdriver import WebDriver
def capture_headers(driver: WebDriver):
driver.execute_cdp_cmd("Network.enable", {})
def log_response(params):
print("Response Headers:", params.get("response", {}).get("headers"))
driver.request_interceptor = log_response
❗注意:Selenium 自身不直接支持监听回调函数,你可以使用
undetected_chromedriver
或selenium-wire
等扩展增强监听能力。
🧪 示例 2:阻止加载图片、字体等资源
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setBlockedURLs", {
"urls": ["*.png", "*.jpg", "*.woff2"]
})
📌 适用于加速加载、绕过图片验证码等场景。
🧪 示例 3:设置 LocalStorage(无需登录)
driver.get("https://example.com")
driver.execute_script("localStorage.setItem('token', 'abc123');")
driver.refresh()
可配合 token 登录策略使用,绕过验证码、模拟登录状态。
🧪 示例 4:模拟设备与网络环境
driver.execute_cdp_cmd("Emulation.setUserAgentOverride", {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)...",
"platform": "iOS"
})
也可以模拟网络状况:
driver.execute_cdp_cmd("Network.emulateNetworkConditions", {
"offline": False,
"latency": 100, # 延迟 100ms
"downloadThroughput": 500 * 1024 / 8, # 500kbps
"uploadThroughput": 500 * 1024 / 8
})
🔐 示例 5:注入自定义请求头(如 auth-token)
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
"headers": {
"Authorization": "Bearer your_token_here"
}
})
适用于接口保护、身份鉴权等场景。
🧨 踩坑提醒
问题 | 原因 |
---|---|
execute_cdp_cmd 无效 |
仅支持 Chrome,需用 ChromeDriver |
请求监听失败 | Selenium 本身不支持拦截请求体,需用 selenium-wire |
多 CDP 命令冲突 | 注意调用顺序,Network.enable 要在前 |
🧼 小结
- CDP 是高级调试能力的接口桥梁
- 可实现资源屏蔽、请求监听、UA/Token 模拟等功能
- 在复杂自动化项目中大大提升控制精度和运行效率
📌 延伸建议
selenium-wire
(完整请求/响应拦截 + 请求体修改)undetected-chromedriver
(反爬策略绕过 + CDP 支持)- 使用
playwright
进一步增强协议层控制能力