能否在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
相关产品推荐
相关产品推荐

