上期回顾:Airtest之录屏指南
以下基于
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85
Airtest框架我们已经讲了好多期了,今天来总结一下Airtest脚本图片识别编写技巧,以提高运行稳定性。图片识别基础不了解的可以看之前文章,这里不再重复:
Airtest-API精讲之Template
Airtest源码分析--图像识别整体流程
Airtest之3分钟教会你选择合适的图像识别算法
养成截图后查看识别可信度的习惯
在AirtestIDE中截图后,可以双击图片,点击左上角按钮,之后会在左下角显示该图片的可信度,如果值太低,就重新截取。详情可以看AirtestIDE高级功能
不管怎么截,可信度都低,可尝试同时匹配图片色彩
如果你不管怎么截图,其可信度都低,可以尝试在图片编辑器里选中RGB,同时匹配图片色彩,看看可信度是否有提高,方法参考上条。
另外该方法同时也适用于图片一模一样,只有颜色不一样,如下图中的删除按钮
都试了,可信度就是低,那就调整阙值
做了各种尝试,可信度依然很低,实在没办法了,那就在图片编辑器里调整该图的阙值,图片及方法参考第一条。
尽量截取有特点的图片本身
如上图公众号的图标,那我们就只截取图标,不要附带过多背景以及文字。
下面带过多背景和文字的图片,识别可信度是低于上面图片的。
扩大截图范围,设定点击位置
如果你用上条方法只截图目标本身,但导致可信度低或者会识别到多个图片,导致无法定位自己想要的位置,那么也可以反其道而行,扩大截图范围,提高可信度或唯一度,然后设定点击位置
如下图,你想点击中间的升级按钮,单纯截图升级按钮,是不行的,那我们就扩大截图范围:
方法一:将中间升级按钮连同上面部分一同截图,设定点击位置target_pos为8
方法二:将3个升级按钮横向截图,这样你想点的中间的升级仍然在中间,就不用显示的设置target_pos了。
不要只截图文字
单纯截图文字的识别效果是不好的,如果你要点击文字,那就连带文字附近的有特点的图多截一点
如上面的图,如果你本意是要点'测试工程师小站'这几个字,那就连上面的图标一起截上
如按钮,不要只截文字,连按钮轮廓一起截
使用API打开/关闭APP,而不是用截图
打开APP,不用去截图APP的图标,可以用start_app('包名')
关闭APP,不用去截图关闭的图标,可以用stop_app('包名')
更多API请看
Airtest核心API汇总
Airtest之安卓API汇总
Airtest之iOS API汇总
安卓利用返回键替代关闭/退出按钮
如果是安卓手机,可使用keyevent("BACK")来模拟返回键,这样就不用去截图各种返回/退出按钮了
但切记,如果你将来脚本要同时兼容Android和iOS,则不要使用,因为iphone没有返回键(不要问我是怎么知道的,花了好几天重新做所有用例的返回逻辑)
操作之前多wait(),有动画多sleep()
APP上操作后,进入下一步是有计算/网络/界面绘制等延时的,所以在你要进行下一步操作(如click)前,先wait()等待目标出现,不然会导致运行失败。当然,为了方便,你也可以重新封装click()等操作,给个示例代码:
# -*- encoding=utf8 -*-
__author__ = "测试工程师小站"
from airtest.core.api import *
def wait_click(v, comment):
wait(v)
print(f"{comment}"出现了)
click(v)
print(f"点击{comment}")
v = Template(r"tpl1642236428587.png", record_pos=(0.079, -0.682), resolution=(1080, 2340))
wait_click(v, "测试工程师小站图标")
另外,如果2个操作之前有确定的比较长的动画,也可以显示的写sleep(动画时长),再配合上面的wait_click()
截图最好用高分辨率的手机
写脚本截图的时候,一定要用一台高分辨率的手机(不要是奇怪的分辨率比率),这样截出来的图片更容易适配其他分辨率手机
无法适配的手机截取多套图片
以上N条技巧,如果你都使用了,仍出现不能兼容的手机,那就再针对该手机截取一套图片,我们再自己写一个适配多套图片的方法:
# -*- encoding=utf8 -*-
__author__ = "测试工程师小站"
from airtest.core.api import *
from airtest.core.error import TargetNotFoundError
def waits(v_list, times):
"""
v_list:要查找的图片列表
times:查找几轮
"""
for i in range(times):
for v in v_list:
if exists(v):
return v
raise TargetNotFoundError('Picture %s not found in screen' % v)
v1 = Template(r"1.png", record_pos=(0.079, -0.682), resolution=(1080, 2340))
v2 = Template(r"1.png", record_pos=(0.079, -0.682), resolution=(1080, 2340))
v3 = Template(r"1.png", record_pos=(0.079, -0.682), resolution=(1080, 2340))
v = waits([v1,v2,v3], 2) # 查找v1,v2,v3,查找2轮
touch(v)
此方法不仅可以用在适配多套手机上,也可用在多图片的查找上。
上面很多基于图片的技巧或问题,如果用POCO框架,则可以轻易解决,后面我们就要开始学习POCO框架啦!~
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~