为什么需要用Selenium操作捕获接口行为?
正如大家所知Selenium是目前使用最为广泛的Web应用程序自动化测试的开源框架,由Selenium编写的测试脚本可以像真正的用户去操作页面控件及浏览器。但是,有些时候我们需要获取后台接口返回给前端的数据,用于测试、数据绑定校验、记录日志、调试等,对于以上这种行为Selenium则无能为力。
谈到捕获HTTP请求,我们可能会想到通过启动代理服务器从而截获所有HTTP请求和响应,去使用像Fiddler、Wireshark、Badboy 这样的工具。但是这类工具缺乏开放的接口或CLI工具进行集成。
这篇文章我将为你展示如何使用Selenium捕获页面接口行为。
Selenium Wire
如前文所述,若想捕获HTTP请求或者网络流量,我们就需要HTTP代理服务器,然后通过配置浏览器指向该代理服务器来实现。而Selenium Wire就是一个很好的解决方案,它是Python Selenium WebDriver的拓展库,能够直接访问浏览器发出的底层请求,同时也是一个轻量级的库,其设计的目的是减少外部依赖性,易于使用。
Selenium Wire可以与使用Selenium相同的方式编写测试脚本,并额外提供简单易用的接口行为,用于访问请求/响应头、状态代码和报文内容。
操作过程
安装:
使用Python pip安装
Copy to Clipboard
实例化浏览器:
Copy to Clipboard
访问HTTP请求对象:
Selenium Wire 可以在测试时捕获所有HTTP/HTTPS 请求,你可以通过driver.requests属性来访问对象,该对象将所有HTTP请求存储为一个列表变量:
Copy to Clipboard
请求对象属性:
请求对象包含以下属性:
- method: HTTP 请求方法类型,例如:GET,POST
- url: 请求URL地址
- path: 请求路径
- querystring: 请求URL参数, 例如:foo=bar
- params: 请求参数作为字典返回
- headers: 请求头信息作为字典返回
- body: 请求内容以字节返回
- response: 该请求对应的响应对象
响应对象属性:
响应对象可以通过requests对象的response属性获取,响应对象包含以下属性:
- status_code: 响应状态码
- reason: 响应结果, 例如:OK 或Not Found
- headers: 响应头信息作为字典返回
- body: 响应体内容以字节返回
演示用例:
Copy to Clipboard
控制台输出:
Copy to Clipboard
限制和额外功能
- Selenium Wire 只能在本机执行,目前不支持Selenium Grid的分布式模式执行脚本。
- Selenium Wire目前不支持使用NTLM 验证的网站。
如果想了解更多关于Selenium Wire的使用和更多关于界面自动化的最佳实践,请联系迪原