Selenium UI 自动化获取接口数据

kisom · 2020年12月18日 · 最后由 cmetl 回复于 2021年02月22日 · 328 次阅读

感觉这个标题就能吸引不少人过来😈
论坛里求助 UI 自动化如何捕获接口内容的同学不少,但是真正给出解决方案的回答好像基本没有。而更多的是大家关于 UI 自动化为何要去捕获接口内容的讨论,干嘛不直接搞接口自动化。
但鄙人认为 UI 自动化去捕获接口内容做校验,有 2 个方面是接口自动化完全无法替代的 (欢迎就这方面大家进行讨论):
1.前端向接口的传参;
2.捕获到接口返回的内容后,判断前端是否有按照接口返回的内容进行展示
针对第一点,我上家公司是做旅游的,旅客预订完人数、房间数后前端是需要向接口传拼房情况的,这里面大概有 10 几种情况,你如果每次都手工回归真的挺花时间的;针对第二点,上家公司应用在火车票退改签上了,根据上一个接口返回的退改签标志字段属性,检查后面页面的退改签标志是否正确,也是提升了不少效率。
好了,废话不多说,咱开始上干货~
这里给大家介绍 Slenium 的一个基友:browsermob-proxy,大家可以把它当做是一层代理,用来捕获 UI 传参和接口响应。
论坛里虽然也能搜到一两篇 browsermob-proxy 的帖子,但貌似都没讲到点子上,接下来我说说具体怎么做:
首先下载 python 依赖包

pip install browsermob-proxy

然后去 browsermob-proxy 的 github 官网下载对应 release 版本下的压缩包,官网地址:https://github.com/lightbody/browsermob-proxy

先启动 browsermob-proxy 的服务:

from browsermobproxy import Server

    BMPserver = Server("D:/browsermob-proxy/browsermob-proxy-2.1.3/bin/browsermob-proxy.bat")
    BMPserver.start()

把这个代理加到 driver 启动的配置中,这里要着重提一下,因为启动 browsermob-proxy 再用浏览器访问时,会出现让你加载证书,所以配置里面我们要加上忽略证书错误:

BMPproxy = BMPserver.create_proxy()
options = webdriver.ChromeOptions()
#忽略证书报错
options.add_argument('--ignore-certificate-errors')
options.add_argument('--proxy-server={}'.format(BMPproxy.proxy))
chromedriver_dir = 'D:/chormedriver/chromedriver'
driver = webdriver.Chrome(options=options, executable_path=chromedriver_dir)

用 browsermobproxy 捕获接口的内容:

BMPproxy.new_har(BMPurl,options={'captureHeaders': True,'captureContent': True})

这里 url 一定要传你接口的具体链接,不然会把所有请求的内容都取下来。
然而就算这样,捕获的 har 文件内容还是很多,它真是啥玩意儿都给你记下来
通过打断点调试看到 har 文件里这茫茫一大片的内容:

一开始我还傻乎乎字典去定位,反手就是给自己一巴掌;这不直接正则匹配就完事儿了

import re

    result = str(BMPproxy.har)
    res ='("mobile":".*?")'
    mobile = re.findall(res,result)

虽然这个解决方案不算优秀,但也希望对大家有点帮助

共收到 5 条回复 时间 点赞

前端向接口的传参这个是怎么做校验呢?

小酷 回复

举个例子,登录时点击获取验证调接口,这个接口传参会传 mobile。我通过 browsermob-proxy 获取到点击验证码按钮时的.har 文件,然后匹配到此时传的 mobile 是多少,然后判断获取到 mobile 与我 UI 自动化在页面填的手机号是否一致,或者写断言。具体用例具体分析吧,校验传参也挺考验测试人员用例设计能力的

kisom 回复

每条用例去写参数校验是很费劲的,接口参数一般就有限的几种类型,是不是也可以根据接口与 refer 请求头做个分类

小酷 回复

是的,所以拿来做传参校验的用例要仔细筛选一下,去找那种传的内容比较重要且能通过自动化节省你大量手工验证时间的;自动化是为了提升效率,你为了一个没什么必要的传参校验浪费大量时间去写代码得不偿失,然后如果要用 browsermobproxy,建议把通过 har 校验接口内容的方法封装起来。

很认同题主的说法,接口自动化只是验证接口是 OK 的,只能证明后台的接口 OK。不能证明前端调用接口都正确。纯 UI 自动化只是验证界面的前端的数据,一些隐藏的接口调用没有提现出来。而 UI 加上接口的混合验证是用来证明每一个 UI 操作后,验证调用接口是否正确。每一个 UI 操作通过接口获取返回值是否正确的在界面上展示。这条路理论上很合理,但是所需要的代码量不会少。成本会非常高。说不定这里是一个新的测试方向或则测试职业的诞生。想好好研究下可行性。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册