在编写Web自动化脚本时,很多团队只关注页面元素的交互结果,却忽略了背后接口通信的细节。Selenium Wire是一个基于Selenium的扩展库,它在启动浏览器时自动配置本地代理,将每一次网络交互记录下来,供Python脚本随时读取和修改。与单纯用Selenium截图或取文本不同,这种能力让我们能直接看到前端到底发了什么请求、后端回了什么内容。

Selenium Wire的运行原理与基础配置
Selenium Wire的核心思路是在Selenium驱动浏览器时,向浏览器注入一个HTTP/HTTPS代理。这个代理由库内部启动,默认监听本地某个端口。浏览器所有请求先经过代理,代理把请求对象和响应对象暂存到内存队列,同时放行真实流量。因此在代码里,我们可以通过driver.requests拿到全部记录,而不需要额外启动抓包工具。
安装方式非常轻量,使用pip即可完成。需要注意的是,它依赖底层Selenium,因此应当先确保Selenium版本兼容。在初始化时,除了普通Options,还可以传入seleniumwire_options来设定代理端口、证书校验开关等。例如禁用证书警告可避免HTTPS站点拦截失败。下面是一段最小可运行示例:
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
chrome_opts = Options()
chrome_opts.add_argument('--headless')
sw_opts = {
'disable_certs': True,
'port': 12345
}
driver = webdriver.Chrome(options=chrome_opts, seleniumwire_options=sw_opts)
driver.get('https://ipipp.com')
for req in driver.requests:
if req.response:
print(req.url, req.response.status_code)
driver.quit()
上述代码在访问示例站点后,遍历driver.requests并打印URL与状态码。可以看到,请求对象包含method、headers、body等属性,响应对象则有status_code、headers、body。这种结构让我们能像调试后端服务一样审查前端行为,而不必借助浏览器开发者工具手动翻看。
精准过滤与提取目标接口数据
实际项目中,页面往往附带大量静态资源请求,如果全部处理会拖慢脚本且干扰分析。Selenium Wire允许我们在访问后按条件筛选,也可以利用driver.wait_for_request阻塞等待某个特定接口出现。比如只关心包含api字样的接口,可以直接用字符串匹配过滤,从而忽略图片和样式文件。
提取响应体时需注意编码问题。响应对象的body属性是字节类型,通常要用decode('utf-8')转成字符串再解析JSON。若接口返回被压缩,Selenium Wire默认会解压,因此一般无需手动处理gzip。以下示例展示等待登录接口并返回解析结果:
from seleniumwire import webdriver
import json
driver = webdriver.Chrome()
driver.get('https://ipipp.com/login')
req = driver.wait_for_request('api/login')
if req.response:
text = req.response.body.decode('utf-8')
data = json.loads(text)
print('user_id:', data.get('user_id'))
driver.quit()
除了读取,还能在请求发出前动态修改。通过遍历driver.requests虽然能看历史,但若要拦截并重写,应使用driver.interceptor注册函数。在拦截器里可以改请求头、改POST体,甚至直接返回伪造响应。这样就能模拟后端异常、测试前端容错,而不必真的搭建mock服务。
与独立代理方案的对比及常见坑点
有些人习惯用mitmproxy或Fiddler配合Selenium,那种方式功能更强但运维复杂。mitmproxy需要单独跑进程,还要在代码中指定代理地址,且证书安装步骤容易出错。Selenium Wire把代理生命周期绑定到driver,用例结束自动清理,对CI环境更友好。不过它不支持HTTP2多路复用的一些高级特性,面对极端高并发页面可能漏记少量请求。
常见坑点之一是headless模式下的证书信任。如果不开disable_certs,部分站点会报SSL错误导致空白页。另一个问题是内存占用,长时间运行的脚本若不清理driver.requests,列表会一直增长。可以定期赋值为空列表释放,或在seleniumwire_options里设置request_storage上限。以下代码演示限制存储条数:
sw_opts = {
'request_storage': '100',
'disable_certs': True
}
driver = webdriver.Chrome(seleniumwire_options=sw_opts)
从架构角度看,Selenium Wire适合嵌入既有Selenium用例做轻量排查,不建议作为永久流量网关。若团队需要全量录制的接口回归,还是应结合服务端日志或网关层追踪。理清工具边界,才能让它真正提升自动化调试效率,而不是引入新的不稳定因素。
Selenium_Wire网络请求拦截自动化测试修改时间:2026-08-18 18:08:36