问题
在编写APP的UI自动化用例的时候,发现使用脚本跳转页面后,APP出现没有响应的问题,但是手工操作却没有这个问题
代码语言:javascript复制with allure.step("点击立即购买,跳转到收银台"):
vip.click(vip.jiaxiang_img, duration=None)
assert vip.has_element(checkstand.pay_page), '跳转到收银台失败'
脚本上也只是操作了两步
- 点击元素
- 查看元素是否存在
使用工具测试时候发现,点击获取元素的时候,APP也会出现奔溃的问题
所以大概率是代码上有问题
发现过程
由于导出奔溃日志给开发和查看Appium的输出日志都没有找到问题的具体原因,所以只能采用逐行注释代码的方式找到出错的位置。
在第一步点击「立即购买」之后,页面会跳转到「收银台」页面
收银台页面会先并行请求7
个接口,然后将数据渲染到页面,然后再请求2
个接口重新渲染一次页面
先将全部操作都去除,只请求1个接口,依次增加,直至请求了7个接口,没有卡死。
将第一次页面数据渲染也恢复,仍没有卡死。
将后2次接口请求也恢复,仍没有卡死。
将最后一次页面渲染添加上去,页面出现了卡死。
从上面的尝试中可以发现,页面卡死是因为最后一次的页面渲染导致的。
所以着重分析这一部分代码
问题原因
页面上显示的是:「购买即视为同意《微医会员协议》」,其中「《微医会员协议》」被标记为了黄色
对应的代码为
代码语言:javascript复制int index = warnInfo.indexOf("n");
if (index <= ){
index = warnInfo.length();
}
代码语言:javascript复制spannable.setSpan(clickableSpanMember,,,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(clickableSpanSource,,index,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
(前后都不包括)。用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果。clickableSpanMember
和clickableSpanSource
是两个点击事件
所以
- 7-15个字符的点击事件是
clickableSpanMember
- 15 后的字符的点击事件是
clickableSpanSource
但是实际上接口没有返回这么多内容,只有「购买即视为同意《微医会员协议》」这15个字符,现在代码中对后面的空字符串也设置了点击事件。
这部分代码编译和运行的时候都不会出错,但是使用Appium进行元素查找的时候就会出错
改为先判断字符长度然后设置点击事件:
代码语言:javascript复制if (warnInfo.length() >){
spannable.setSpan(clickableSpanSource,,index,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
修改之后Appium可以正常查找元素,不会出现APP奔溃现象