为什么需要用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的使用和更多关于界面自动化的最佳实践,请联系迪原