导读:本期聚焦于辉辉创作的《如何使用Selenium Wire捕获和分析Selenium自动化中的网络请求?》,敬请观看详情。传统Selenium只能操作页面DOM,无法直接查看浏览器发出的HTTP流量。Selenium Wire在Selenium基础上注入代理,使脚本能拦截请求与响应。本文说明其安装方式、请求过滤写法及响应体提取手段。对比mitmproxy方案,它无需独立进程,适合嵌入现有自动化用例。通过查看请求头、状态码与负载,可定位接口异常、验证前端传参,也能模拟弱网与篡改返回数据,提升调试效率。

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

如何使用Selenium Wire捕获和分析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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。