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

能否在Selenium WebDriver中设置请求头?支持单测试用例配置

如何给Selenium WebDriver添加请求头(单测试用例隔离)

Selenium原生确实没有提供直接给WebDriver实例全局设置请求头的方法,但可以通过以下几种方式实现单测试用例的请求头配置,不会影响其他无需请求头的测试:

方法一:使用Chrome DevTools Protocol(CDP)

针对ChromeDriver,可以通过CDP的Network.setExtraHTTPHeaders方法设置请求头,这种方式能在单个测试用例中临时生效,测试结束后重置即可。

示例代码(Python):

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def test_with_custom_header():
    # 初始化Chrome选项和驱动
    options = Options()
    driver = webdriver.Chrome(options=options)
    
    # 配置自定义请求头
    custom_headers = {"Authorization": "Bearer your-token-here", "X-Custom-Header": "test-value"}
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": custom_headers})
    
    # 执行当前测试用例的操作
    driver.get("https://your-target-site.com")
    
    # 测试完成后,清空额外请求头(避免影响后续测试)
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {}})
    
    driver.quit()

# 其他无需请求头的测试用例正常编写即可
def test_without_header():
    driver = webdriver.Chrome()
    driver.get("https://another-site.com")
    driver.quit()

方法二:通过代理注入请求头

可以使用中间代理(如mitmproxy)拦截请求并添加自定义头,这种方式适用于所有浏览器驱动,同样可以针对单个测试用例启用代理,测试后关闭。

示例思路:

  • 启动本地代理服务,配置规则为给目标站点的请求添加指定头
  • 在需要添加请求头的测试用例中,将WebDriver的代理设置为这个本地代理
  • 测试结束后,关闭代理并重置WebDriver的代理配置

示例代码(Python + mitmproxy):

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from mitmproxy import http, proxy
from mitmproxy.tools.dump import DumpMaster
import threading

def add_custom_header(flow: http.HTTPFlow):
    # 仅给目标站点添加请求头
    if "your-target-site.com" in flow.request.pretty_host:
        flow.request.headers["Authorization"] = "Bearer your-token-here"

def run_proxy():
    opts = proxy.ProxyConfig(port=8080)
    m = DumpMaster(opts)
    m.addons.add(add_custom_header)
    m.run()

def test_with_proxy_header():
    # 启动代理线程
    proxy_thread = threading.Thread(target=run_proxy, daemon=True)
    proxy_thread.start()
    
    # 配置Chrome使用代理
    options = Options()
    options.add_argument("--proxy-server=http://localhost:8080")
    options.add_argument("--ignore-certificate-errors")  # 忽略代理证书错误
    
    driver = webdriver.Chrome(options=options)
    driver.get("https://your-target-site.com")
    
    # 测试完成后关闭驱动
    driver.quit()

# 普通测试用例无需配置代理
def test_normal():
    driver = webdriver.Chrome()
    driver.get("https://example.com")
    driver.quit()

方法三:使用execute_script修改页面请求(仅适用于XMLHttpRequest/fetch)

如果目标站点的请求是通过前端JS发起的(如XHR或fetch),可以通过注入JS代码修改请求头,但这种方式无法覆盖页面初始加载的请求(如HTML、CSS等资源请求)。

示例代码:

from selenium import webdriver

def test_with_js_header():
    driver = webdriver.Chrome()
    driver.get("https://your-target-site.com")
    
    # 注入JS修改fetch的请求头
    inject_js = """
    const originalFetch = window.fetch;
    window.fetch = function(resource, options = {}) {
        options.headers = { ...options.headers, Authorization: 'Bearer your-token-here' };
        return originalFetch(resource, options);
    };
    """
    driver.execute_script(inject_js)
    
    # 执行后续需要自定义头的前端请求操作
    # ...
    
    driver.quit()

注意事项

  • 优先使用CDP方法,因为它直接控制浏览器的网络请求,覆盖范围最广,且无需额外依赖
  • 所有方法都要确保在单个测试用例内部完成配置和清理,避免污染其他测试用例的环境
  • 不同浏览器的CDP支持可能略有差异,Firefox可参考其DevTools文档使用对应命令

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:20:08