Erlo

聊聊 Python 自动化截图的一些经验

2020-09-08 19:30:21 发布   556 浏览  
页面报错/反馈
收藏 点赞







前言


今天想先给大家分享 1 个小白用户的 Airtest 从入门到放弃的故事
小 A 是一个自动化的小白,在逛测试论坛的时候,偶然间发现了 Airtest 这个基于图像识别的 UI 自动化框架
出于好奇,小 A 试用了这个框架,发现只需要几条简单的截图脚本,就可以对设备进行各种自动化操作,于是小 A 成功种草了这个框架
但几天之后,随着小 A 的深入使用,他发现截图脚本并不是他想象中那么“完美”; 有时候程序会告诉他  找不到对应的截图  ,有时候程序又会  识别到一些错误的位置  ,又或者他辛苦写好的截图脚本,换了一台手机之后,又都识别不到了......
在经历了第 N 次失败之后,小 A 最终还是放弃了这个框架
看到这里,或许一部分同学会觉得感同身受,因为自己刚开始用 Airtest 这个框架的时候,也是经常踩到上面所说的坑!
Airtest 作为 1 个自研的测试框架,它确实不能做到 “完美” 识别;但是除了期待以后我们的开发小姐姐小哥哥们研究出更精确的图像识别方案之外,我们还有很多技巧可以提高我们截图脚本的兼容性
下文我们将先了解一下  Airtest 图像识别原理相关的知识  ,然后在实际案例中,带大家一起看看 11 个截图技 巧 ,帮助大家提升截图脚本的兼容性。







Airtest截图,你必须知道的几个知识点


1

Airtest 使用的图像识别算法


默认 Airtest 会尝试用  SURFMatching  、 TemplateMatching  和  BRISKMatching  这三种算法来进行图像识别
其中:
TemplateMatching  属于  模板匹配算法
SURFMatching  和  BRISKMatching  则属于  特征点匹配方法
简单点说,模板匹配算法依赖  特征向量  来进行图像匹配,而特征点匹配算法则是依赖于  图像的特征点  
这些算法对于设备画面上唯一的图标、图像,识别效果会比较好,因为它们拥有比较多的特征向量/特征点,而对于像纯文字截图、含有大量空白背景的截图,识别效果则会差一些
我们都知道,纯文字截图中仅仅包含了一些简单的笔划,特征向量/特征点会比较少,相对于图像来说,更容易识别到错误的结果;而空白背景的截图,各个像素点的灰度值基本没有什么变化,所以特征点几乎没有,就更容易找不到匹配结果/匹配到天差地别的结果出来
2

程序如何根据算法结果判定是否找到匹配的截图


那当我们编写好截图脚本,并开始运行的时候,程序是如何用这些图像识别算法来帮助我们判定是否识别到结果的呢?
这里先介绍两个很重要的名词: 阙值  和  可信度  ,他们的取值范围都是 [0,1];在每一条图像识别的脚本中,都会有1个用于结果筛选的阙值,默认值为:0.7
当上述三种算法在执行过程中识别到初始结果时,就会计算出来这个初始结果的可信度,当  可信度>阙值  的时候,程序会认为  找到了最佳的匹配结果  ;而当  可信度<阙值  的时候,程序则会认为  没有找到最佳的匹配结果  。
我们可以在执行截图脚本的时候,查看 log 窗口,观察算法识别结果的可信度:
① 可信度>阙值,程序判定找到匹配结果
② 可信度







11 条截图技巧让你轻松玩遍自动化


了解完截图相关的基础知识之后,终于到了我们截图技巧这部分的内容,不过需要注意的是,不同场景所应用的技巧的大不相同,希望同学们可以灵活使用:
1

截取图标时尽量不要截入过多的背景内容


举个简单的例子,比如我们想通过点击网易云音乐的应用图标来打开网易云音乐的app,为了能在不同设备上都有更好的识别结果,我们应该尽可能选取下图中第一种截图,而不是混入了过多背景的第二种截图:
为了让大家直观地看到差别,我们在设备1上截好了上述俩张图,然后分别在设备 2 中执行,结果如下:
可以看到,没有截入过多背景的截图,识别出来的可信度高达 0.95;而截入了背景的图标截图,可信度下降到了 0.88。所以在截取这些特定图标的时候,尽量减少截入背景,可以有效提高这类截图脚本的兼容性。
2

打开应用尽量使用 start_app 而不是截图脚本


start_app()  支持 Android 和 iOS 设备,相对用截图脚本来启动应用,脚本会更加简洁,兼容性也会更好:
  
  
# 打开网易云音乐
start_app("com.netease.cloudmusic")
3

用 image editor 查看截图识别结果的可信度


我们录制/编写好 1 条截图脚本之后,无需运行,可以直接双击截图,进入图片编辑器,点击左上角的  snapshot+recognition  按钮,即可查看截图在当前页面的识别情况,包含识别出来的位置以及识别结果的可信度:
这个识别情况可以作为一个参考,帮助同学们快速调试自己的截图脚本。
4

巧用 target_pos 点击截图的不同位置


先来了解下什么是  target_pos  
默认情况下,我们的截图脚本都是点击截图的中心位置,即  target_pos=5  。对于一张截图来说,总共有 9 个  target_pos  ,当我们把截图的  target_pos  设置成不同的值时,脚本会点击在截图不同的位置上:
双击 IDE 中的截图即可打开图片编辑器,右侧可以修改  target_pos  的值:
修改完成之后,把截图脚本切换成代码模式,我们就可以看到此时的截图脚本里面多了  target_pos  这个参数:
  
  
touch(Template(r"tpl1598948415043.png", target_pos=6, record_pos=(-0.434, -0.773), resolution=(900, 1600)))
我们在做自动化的时候,经常会遇到某个图标堆叠的情况,比如在网易云音乐的某个歌曲列表中,右侧便罗列了三个完全一样的播放按钮:
如果我们的需求是点击中间那个按钮的,仅仅依靠截 1 个播放按钮来做识别,是很难保证具体识别到三个按钮中的具体哪个按钮的。
此时我们可以有 2 种截图方式来实现,一种是在竖着的方向上,扩大截图范围,让中间那个按钮处于  target_pos=5  的位置上:
另一种是在横着的方向上,扩大截图范围把左侧的歌曲介绍也一起截图了,让中间那个按钮处于  target_pos=6  的位置上:
这 2 种方式都可以确保我们点到的是中间那个按钮(假设列表歌曲不变的情况下)。
所以,当精准截图(仅截取某个按钮/图标)不能满足唯一定位时,我们可以考虑加大截图范围,增加更多的特征点,确保截图定位的准确性。
5

巧用坐标进行点击/滑动


登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认