AirtestProject 新手 “超级” 容易用错的几个 Airtest 和 Poco 的 API,看看你有没有遇到过!

fishfish-yu · 2021年06月04日 · 3505 次阅读

此文章来源于项目官方公众号:“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 方法,返回的是 TrueFalse ,布尔值是没有 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 官网http://airtest.netease.com/
Airtest 教程官网https://airtest.doc.io.netease.com/
搭建企业私有云服务https://airlab.163.com/b2b

官方答疑 Q 群:654700783

呀~这么认真都看到这里啦,帮忙点击左下角的爱心,给我点个赞支持一下把,灰常感谢~

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