You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome无头模式下Selenium测试拦截URL问题及替代方案咨询

问题分析与解决方案

为什么Network.setBlockedURLs在无头模式下无效?

可能有以下几个原因:

  1. 执行时序错误
    你可能是在页面开始加载后才执行CDP命令,此时目标URL的请求已经发起,拦截规则来不及生效。必须在调用driver.get()或任何导航操作之前启用Network并设置拦截规则。

  2. 内部URL的特殊处理
    chrome://和file://属于Chrome内部协议或本地文件请求,这类请求可能不走常规的Network请求流程,CDP的Network拦截对其不生效——即使在无头模式下修复了通用拦截问题,这类特殊URL仍可能不受影响。

  3. 匹配规则问题
    CDP的setBlockedURLs使用的是子串/通配符匹配,但"file://*"或"chrome://*"的写法可能不够精确。实际上,仅使用"file://"或"chrome://"作为匹配串就足够拦截所有以这些前缀开头的请求,多余的*可能反而导致匹配异常。

修复现有代码的方法

调整执行顺序,确保拦截规则在导航前生效:

# 初始化ChromeDriver后立即配置拦截
self.driver.execute_cdp_cmd('Network.enable', {})
# 简化匹配规则,去掉多余的*
self.driver.execute_cdp_cmd('Network.setBlockedURLs', {"urls": ["file://", "chrome://"]})

# 之后再执行页面导航
self.driver.get("你的目标页面URL")

无头模式下的替代拦截方法

方法1:使用Chrome扩展(WebRequest API)

编写一个轻量级扩展,利用Chrome的webRequestAPI拦截请求,这个方法对内部协议和本地文件请求的拦截效果更可靠。

  1. 创建扩展文件夹,包含两个文件:

    • manifest.json(声明权限和后台脚本):
      {
        "manifest_version": 3,
        "name": "URL拦截器",
        "version": "1.0",
        "permissions": ["webRequest", "webRequestBlocking", "<all_urls>"],
        "background": {
          "service_worker": "background.js"
        }
      }
      
    • background.js(拦截逻辑):
      chrome.webRequest.onBeforeRequest.addListener(
        (details) => {
          if (details.url.startsWith("file://") || details.url.startsWith("chrome://")) {
            return { cancel: true };
          }
        },
        { urls: ["<all_urls>"] },
        ["blocking"]
      );
      
  2. 在Selenium中加载扩展:

    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")
    # 替换为你的扩展文件夹路径
    chrome_options.add_argument(r"--load-extension=/path/to/your/extension-folder")
    
    self.driver = webdriver.Chrome(options=chrome_options)
    

方法2:使用代理服务器拦截

通过代理服务器(如mitmproxy)在网络层拦截请求,这种方法不受Chrome内部规则限制,适用性更广。

  1. 安装mitmproxy:

    pip install mitmproxy
    
  2. 编写拦截脚本(block_urls.py):

    from mitmproxy import http
    
    def request(flow: http.HTTPFlow) -> None:
        if flow.request.url.startswith("file://") or flow.request.url.startswith("chrome://"):
            # 返回404响应终止请求
            flow.response = http.Response.make(404, b"Blocked", {"Content-Type": "text/plain"})
    
  3. 启动mitmproxy并加载脚本:

    mitmdump -s block_urls.py
    
  4. 配置Chrome无头模式使用代理:

    chrome_options = Options()
    chrome_options.add_argument("--headless=new")
    chrome_options.add_argument("--proxy-server=http://localhost:8080")
    # 忽略证书错误(mitmproxy使用自签名证书)
    chrome_options.add_argument("--ignore-certificate-errors")
    
    self.driver = webdriver.Chrome(options=chrome_options)
    

内容的提问来源于stack exchange,提问作者PiotrP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:15:30