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_chromedriverselenium-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 进一步增强协议层控制能力

添加微信