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

1,909 阅读4分钟

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

最近在我们的答疑群里面,经常遇到这样一类情况:

  • 错把Airtest的API强行用在Poco控件上面
  • 错把Poco的API强加在Airtest的截图脚本上面
  • 不管API的实际用法如何,只按自己的臆想去编写脚本,最终运行脚本时出现各种报错

所以今天我们给大家整理了这几个API用错的常见情况,希望可以让同学们写脚本时少踩一点坑。

容易用错API的情况汇总

1. 混用Airtest和Poco框架的exists()

用错概率超级高的一个方法!!!先上一个错误示范:

image

非常典型的一个把Airtest的API强用在Poco控件上面的情况。这位同学的预期呢,是想要判断下,如果存在这个控件,就进行某些操作。

但是他的问题在于 exists 方法的用法不对。

首先可以明确的是,Airtest和Poco框架都用这个API检测当前页面是否存在某个东西,但不同的是,Airtest的 exists 用于检查当前画面是否存在某个截图目标,用法如下:

image

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 使用的时候,还需要注意下面这种情况:

image

可以看到,在当前页面并不存在“设置”这个截图目标,但是脚本确确实实运行到了 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的误判结果,此时的脚本就会符合我们的预期啦:

image

2. 按自己臆想编写脚本

老样子,先看错误示范:

image

这位同学的预期应该是,存在这个控件的话就点击这个控件,但是上面我们讲过,Poco框架的 exists 方法,返回的是 TrueFalse ,布尔值是没有 click 方法的,只有UI控件才有 click 方法。

这种情况就是典型的不按照语法编写脚本,而是按照自己的臆想去编写脚本。那么正确的写法呢,也很简单:

# 分开写就好啦!!!
poco(text="poco").exists()
poco(text="poco").click()

# 或者
if poco(text="poco").exists():
    poco(text="poco").click()

类似的情况还有下面这种,该同学的预期应该是等待这个控件出现,然后就点击它:

image

但是这里居然报了个空对象的错误,我们翻一下 wait_for_appearance 的API文档:

image

可以看到, wait_for_appearance 是没有任何返回值的,所以后面不可能跟着 click 方法,正确的写法如下:

# 又是这么简单,分开写即可,其实原因就是这俩方法都是UI控件的方法
poco(text="poco").wait_for_appearance()
poco(text="poco").click()
3. 把Poco的API强行用在Airtest的截图脚本上

看下错误示范:

image

其实这位同学的初衷呢,是想要等到某个截图目标出现,但是问题在于, 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()

image

小结

今天的API错用情况就分享到这里啦,希望同学们在编写脚本之前,可以多翻一翻Airtest和Poco的API文档,看看里面的API详情和示例脚本,少踩一些坑。

最后附上这两个框架的API文档链接,有需要的同学自取啦:


AirtestIDE下载:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b

官方答疑 Q 群:654700783

呀,这么认真都看到这里啦,帮忙在文章左侧点一下点赞和收藏,给我一个支持把,灰常感谢~