专栏文章 Airtest 快问快答,你们想问的这里都有!(第 1 期)

fishfish-yu · 2021年01月28日 · 最后由 Kori 回复于 2021年01月28日 · 6607 次阅读

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

前言

本期我们给同学们整理了答疑 Q 群中,26 个同学们最容易问到的问题,后续我们还会持续整理更多常见问题帮助大家避坑哒~

1.如何输入文字?

① 使用 airtest 的 text() 接口:

touch(输入框)
text("文本")

② 使用 poco 的 set_text() 接口:

poco("输入框").click()
poco("输入框").set_text("文本")

另外,airtest 和 poco 脚本可以混用,所以当输入框不支持 text() 接口输入时,可更换成 poco 的 set_text() 接口,同理,不支持 poco 输入时,也可以更换成 airtest 的 text() 接口输入。

2.minicap serve setup time out

屏幕初始化失败,常见于高版本 MIUI 设备或者模拟器等;先检查当前 IDE 是否为最新版本,不是请把 IDE 更新到最新版本;然后再尝试在 connect 设备之前,下拉勾选 use javacap ,再连接设备。

3.minitouch serve setup timeout

点击初始化失败,常见于安卓 10 或者 10 以上的设备,解决办法,检查当前环境的 airtest 版本是否为最新的(IDE 更新到最新版本,使用本地 python 环境把本地环境的 airtest 更新到最新版本)。

4.Javacap server setup timeout

设备不适用于 javacap ,在 IDE 连接设备之前 请勿勾选 use javacap ,脚本连接设备的字符串也不要带 ?cap_method=JAVACAP。最后请确保当前使用的是最新版本的 airtest。

5.如何显示坐标

顶部菜单栏,选项 - 设置,只勾选实时坐标显示,则显示绝对坐标;同时勾选实时坐标和相对坐标,则显示相对坐标。(Airtest 使用绝对坐标系,poco 使用相对坐标系)

# 点击坐标为[100,100]的位置
touch([100,100])

# 点击屏幕中心[0.5,0.5]
poco.click([0.5,0.5])

6.图像识别不准确

请参考官方公众号 “AirtestProject” 的教程推文:

7.设备连接不上

请参考官方文档的相关内容:AirtestIDE 使用文档 -- 设备连接--Android 连接常见问题,然后根据自己的手机型号,查看 1、2 节内容。

不同品牌手机的相关设置名称仅供参考,不是所有的品牌型号相关的设置名称和位置都一样,所以教程中提到的设置仅供同学们参考,如找不到完全相同的设置,请同学们仔细查找类似的设置。

8.模拟器连接不上

9.poco 定位报错找不到

  • 1)有时候 IDE 自动生成的 poco 定位脚本会非常长,层级也非常深,回放时可能出现找不到控件的情况;这时不建议同学们直接使用自动生成的定位脚本,可以根据 UI 树详情,另外编写更精简的定位脚本,推荐使用正则匹配来进行脚本定位会好一些。

  • 2)如果定位脚本是同学们自己编写的,请检查对应的属性或者层级关系,看是否是脚本错误而导致找不到元素。

  • 3)如出现单独选中调试脚本,可以找到控件,但实际运行脚本又容易找不到控件,建议在该条定位脚本之前添加足够的 sleep() ,确保画面跳转稳定后,再来查找控件。

10. no module named 'airtest'、‘poco’、‘airtest-selenium’ 等,找不到模块

在当前使用的 python 环境中,安装上缺失的对应模块:

pip install airtest
pip install pocoui #(不能安装poco,如安装了请卸载pip uninstall poco)
pip install airtest-selenium

11.poco 拿不到控件,poco 的支持情况

目前只有原生应用可以直接使用 poco(无需接入 pocoSDK),非原生应用,比如各种游戏应用、H5 小程序、混合开发的应用等,都不能直接使用 poco 拿取控件,绝大多数的游戏支持接入对应引擎的 pocoSDK 之后,可以获取控件信息。

12.辅助窗没有刷出 UI 树

  • 1)除原生应用之外,其余引擎都需要接入 SDK 才可以查看 UI 树;
  • 2)检查手机上是否已经自动安装上 poco 初始化相关的 2 个 apk(pocoservice-debug.apkpocoservice-debug-androidTest.apk),未安装要手动安装上;
  • 3)安装输入法 Yosemite 并设为默认输入法
  • 部分厂商的手机需要额外的设置,请参考官方文档:AirtestIDE 使用文档 -- 设备连接--Android 连接常见问题。

13.poco 刷新时间

UI 树的默认刷新时间为 2 秒,可以在选项 -- 设置--poco,里面设置,设置完成后记得点击 OK 保存设置。

14.invalid syntax

典型的 python 语法错误,常见于脚本未换行、缩进错误、缺少一边 " 或者 等。

15.mac 上出现很多个 IDE 的图标

尝试在 IDE 顶部菜单栏的选项 -- 设置中,去掉自动补全设置的勾选。

16.record_pos、resolution 表示什么

Template 类里面的参数,record_pos 计算坐标对应的中点偏移值相对于分辨率的百分比,匹配时会优先匹配这附近的画面;resolution 记录了截图时的手机分辨率。

Template(r"tpl1611559272215.png", record_pos=(-0.106, -0.035), resolution=(1080, 1920))

如同学们使用的是自己截取的图片,不填 record_pos 参数也不会对识别效果产生很大影响,如想要计算,可参考如下源码:

17.怎么点击软键盘上面的搜索?输入后回车?

如需点击软键盘上面的 search 按钮,则:

text("文本",enter=False,search=True)

同理,如需输入后回车,则 text("文本",enter=True) ,不需要回车则, text("文本",enter=False)

18.批量运行?多任务运行?多机运行?

目前官方文档上有提供多机协作用 bat 脚本做多机运行的实例,都在 AirtestIDE 使用文档 -- 运行脚本的章节下面,另外利用多线程方法来进行批量运行可以参考网上的教程:

19.判断元素/截图存在

  • airtest 的,判断截图目标是否存在于当前画面上:exists(截图)
  • poco 的,判断元素是否存在:poco("xxx").exists()

20.等待元素/截图出现

  • airtest 的,等待某个截图目标出现在当前画面上:wait(截图)
  • poco 的,等待某个控件元素出现:poco("xxx").wait_for_appearance()

21.assert 断言

  • 断言某个截图目标是否存在于当前画面上:assert_exists(截图)
  • 断言某个 poco 元素是否存在:assert_equal(poco(xxx).exists(),"True","xxx控件存在")

22.报错之后如何继续执行

使用 try-except 捕捉错误,让程序继续运行。

23.不能输入密码?密码界面黑屏?

应用的登录页面或者密码界面一般都不给截屏录屏的,同学们可以检查看看你的测试设备的设置里面,有没有安全键盘、防止恶意截屏录屏之类的设置,关掉就行。

24.怎么调用别的脚本?

airtest 提供 using 接口可以用来调用别的 .air 脚本。详细使用方法和案例可以查看官方公众号的教程推文:一个方法帮你在主脚本里添加 “子脚本” 的运行

如使用 using 调用之后,发现程序仍是找不到脚本,建议检查 using 接口里面的脚本路径是否有误,另外还可以尝试在脚本开头把待引入的脚本路径添加到 sys.path 中:

#将test1.air的路径添加到sys.path里面
sys.path.append(r"D:\test\user\project\test1.air")

25.poco 定位脚本怎么写?

poco 支持用基本选择器、相对选择器和空间选择器来编写定位脚本,另外还支持用正则表达式来匹配控件。详细教程和实例可以查看官方公众号的教程推文:

26.局部截图和局部找图

局部截图:

screen = G.DEVICE.snapshot()

# 局部截图
local = aircv.crop_image(screen,(0,160,1067,551))

局部找图:

screen = G.DEVICE.snapshot()
# 局部截图
local_screen = aircv.crop_image(screen,(0,949,1067,1500))

# 将我们的目标截图设置为一个Template对象
tempalte = Template(r"png_code/设置.png")
# 在局部截图里面查找指定的图片对象
pos = tempalte.match_in(local_screen)

详细教程和实例可以查看官方公众号的教程推文:使用 Airtest 最常遇到的几个需求,都帮你们实现好了


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

官方答疑 Q 群:654700783

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

共收到 7 条回复 时间 点赞

我想问一下,假如页面上有两个相同的图片,怎么准确的获取我想要的那张呢。

Kori 回复

看看局部识图能不能搞定

fishfish-yu 回复

不能,你可以试试,现在很火的合成类游戏。是两个完全相同的图片元素

Kori 回复

如果是完全相同的图片,按照图像识别算法,他们的特征点也会一样,算法会把他们都当成可靠结果的;如果俩个图片在不同位置,倒可以考虑把画面切割了做局部识别,过滤掉你不要的那个结果;或者给你的目标图片增加附近的别的特征点(也就是扩大截图范围),另一张目标没有的,这样也可以过滤掉你不要的那张

fishfish-yu 回复

emmm 完全一样。没有任何区别。我是觉得是否可以获取元素个数,比如返回当前页面相同的元素 list,然后对其指定操作。

Kori 回复

oh ,还有个方法叫 find_all_template,可以返回所有符合要求的图像识别结果,然后再去指定你要的那个

fishfish-yu 回复

好的,感谢,我去试试。

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