AirtestProject 新手 “超级” 容易用错的几个 Airtest 和 Poco 的 API,看看你有没有遇到过!
此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
前言
最近在我们的答疑群里面,经常遇到这样一类情况:
- 错把 Airtest 的 API 强行用在 Poco 控件上面
- 错把 Poco 的 API 强加在 Airtest 的截图脚本上面
- 不管 API 的实际用法如何,只按自己的臆想去编写脚本,最终运行脚本时出现各种报错
所以今天我们给大家整理了这几个 API 用错的常见情况,希望可以让同学们写脚本时少踩一点坑。
容易用错 API 的情况汇总
1. 混用 Airtest 和 Poco 框架的 exists()
用错概率超级高的一个方法!!!先上一个错误示范:
非常典型的一个把 Airtest 的 API 强用在 Poco 控件上面的情况。这位同学的预期呢,是想要判断下,如果存在这个控件,就进行某些操作。
但是他的问题在于 exists
方法的用法不对。
首先可以明确的是,Airtest 和 Poco 框架都用这个 API 检测当前页面是否存在某个东西,但不同的是,Airtest 的 exists
用于检查当前画面是否存在某个截图目标,用法如下:
exists(Template(r"tpl1622704594490.png", record_pos=(-0.185, -0.211), resolution=(810, 1440)))
Poco 框架的 exists
用于检测当前页面是否存在某个控件,用法如下:
poco(text="poco").exists()
所以该同学的正确写法应该是:
if poco(text="poco").exists():
pass
其次还需要注意的是,这俩个 API 的返回值有一点点不一样:
# 控件存在返回True,不存在返回False
poco(text="poco").exists()
# 图片目标存在返回坐标,不存在返回False
exists(Template(r"tpl1622704594490.png", record_pos=(-0.185, -0.211), resolution=(810, 1440)))
Airtest 的 exists
搭配条件语句 if
使用的时候,还需要注意下面这种情况:
可以看到,在当前页面并不存在 “设置” 这个截图目标,但是脚本确确实实运行到了 if
里面,这说明这条 if
是通过的。这是为什么呢?
我们仔细看下 log,在脚本运行到 exists
方法的时候,其中 1 个图像识别算法找到了 1 个可信度为 0.7039xx 的结果,大于默认的图像阙值 0.7,所以这条 exists
的结果是返回了该结果的坐标,导致 if
语句通过。
这种情况也非常常见,同学们常常会怀疑为什么我写的 if
语句不生效呢?其实不是,解决办法呢,也非常简单,提高该图像的阙值,过滤掉可能会被误判的结果即可:
if exists(Template(r"tpl1622705519946.png", threshold=0.8, record_pos=(0.143, -0.342), resolution=(810, 1440))):
print("找到了")
将阙值提高到 0.8,过滤掉那个大于 0.7 的误判结果,此时的脚本就会符合我们的预期啦:
2. 按自己臆想编写脚本
老样子,先看错误示范:
这位同学的预期应该是,存在这个控件的话就点击这个控件,但是上面我们讲过,Poco 框架的 exists
方法,返回的是 True
和 False
,布尔值是没有 click
方法的,只有 UI 控件才有 click
方法。
这种情况就是典型的不按照语法编写脚本,而是按照自己的臆想去编写脚本。那么正确的写法呢,也很简单:
# 分开写就好啦!!!
poco(text="poco").exists()
poco(text="poco").click()
# 或者
if poco(text="poco").exists():
poco(text="poco").click()
类似的情况还有下面这种,该同学的预期应该是等待这个控件出现,然后就点击它:
但是这里居然报了个空对象的错误,我们翻一下 wait_for_appearance
的 API 文档:
可以看到, wait_for_appearance
是没有任何返回值的,所以后面不可能跟着 click
方法,正确的写法如下:
# 又是这么简单,分开写即可,其实原因就是这俩方法都是UI控件的方法
poco(text="poco").wait_for_appearance()
poco(text="poco").click()
3. 把 Poco 的 API 强行用在 Airtest 的截图脚本上
看下错误示范:
其实这位同学的初衷呢,是想要等到某个截图目标出现,但是问题在于, wait_for_appearance()
是 UI 控件的方法(Poco 框架),等待截图出现,需要用 Airtest 框架的 wait()
方法:
# 等待截图目标出现
wait(imgTemplate(r"tpl1622713460444.png", record_pos=(0.148, -0.346), resolution=(810, 1440)))
# 等待UI控件出现
poco(text="poco").wait_for_appearance()
小结
今天的 API 错用情况就分享到这里啦,希望同学们在编写脚本之前,可以多翻一翻 Airtest 和 Poco 的 API 文档,看看里面的 API 详情和示例脚本,少踩一些坑。
最后附上这两个框架的 API 文档链接,有需要的同学自取啦:
- Airtest 的 API 文档:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.api.html#
- Poco 的 API 文档:https://poco.readthedocs.io/zh_CN/latest/source/poco.proxy.html
Airtest 官网:http://airtest.netease.com/
Airtest 教程官网:https://airtest.doc.io.netease.com/
搭建企业私有云服务:https://airlab.163.com/b2b
官方答疑 Q 群:654700783
呀~这么认真都看到这里啦,帮忙点击左下角的爱心,给我点个赞支持一下把,灰常感谢~