AirtestProject 【更新公告】Airtest 更新至 1.2.9 版本

fishfish-yu · 2023年02月23日 · 最后由 fishfish-yu 回复于 2024年01月24日 · 8077 次阅读

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

1. 前言

本次更新为 Airtest 库更新,版本提升至 1.2.9,主要新增 对 Android13 的支持新增 Windows 和 iOS 的录屏接口 等。

2. 更新功能

1)新增对 Android13 的支持

Airtest1.2.9 版本新增了对 Android13 设备的支持,有该系统设备连接/自动化需求的同学,请务必把使用的 Airtest 刚更新至 1.2.9 版本。

2)新增 Windows、iOS 录屏接口,优化 Android 录屏

目前录屏功能不仅支持 Android 设备,还支持了 windows、iOS 设备!

函数 start_recording() 的参数修改如下:

  • max_time : 录屏最长时间限制,默认为 1800,单位是秒
  • output : 录像保存文件地址, 默认为 None ,将会自动保存在 log 目录下,自动以当前时间命名

特别注意:原先 output 参数在 stop_recording 中,现在改为在 start_recording 里!

  • fps=10 :输出视频的帧率,目前暂时限定不超过 10fps,默认为 10(仅对 ffmpeg 和 cv2 生效)
  • mode="ffmpeg" : 保存视频的后台,可选 'ffmpeg' 'cv2' 'yosemite',三种模式的区别如下:

ffmpeg :对机型兼容较好,但 cpu 占用较高,第一次运行将会预先下载 ffmpeg,有一定的额外空间占用(几十 M)

cv2 :无需占用额外空间,生成的视频体积比 ffmpeg 更大

yosemite :Android 旧版本的录屏方案,假如当前设备是 Android,默认会使用这个模式录屏,必须要事先安装 Yosemite.apk ,并支持旧的参数,帧率比 ffmpeg 和 cv2 要高,但兼容性差,有一些手机不支持

  • snapshot_sleep=0.001 : 截图间隔
  • orientation=0 : 视频朝向模式 1 为竖屏;模式 2 为横屏;模式 0 为方形填充,默认是 0

其中大部分参数使用默认值即可,最重要的参数有两个:

① 新增参数 orientation
当跑测过程中大部分时间是竖屏时,可以考虑将 orientation=1 ,或 orientation="portrait"

② 当跑测过程中大部分是横屏,可以 orientation=2 ,或 orientation="lanscape" ,适合游戏等横屏应用;

③ 横竖屏都有可能的话,可以不指定参数,默认值为 0,会用一个正方形来容纳视频内容,方便横竖屏转换

output=xxx.mp4,默认将录屏文件存放在 log 目录下,如果有重命名需求的话可以传这个参数,否则直接所有参数用默认值即可

录屏代码示例:

Record 30 seconds of video and export to the current directory test.mp4:

>>> from airtest.core.api import connect_device, sleep
>>> dev = connect_device("Android:///")
>>> save_path = dev.start_recording(output="test.mp4")
>>> sleep(30)
>>> dev.stop_recording()
>>> print(save_path)

>>> # the screen is portrait
>>> portrait_mp4 = dev.start_recording(output="portrait.mp4", orientation=1)  # or orientation="portrait"
>>> sleep(30)
>>> dev.stop_recording()

>>> # the screen is landscape
>>> landscape_mp4 = dev.start_recording(output="landscape.mp4", orientation=2)  # or orientation="landscape"
3)IOS 支持传入 udid 参数

iOS 的初始化字符串中,支持传入名为 serialno/udid/uuid 的字段,用于设置这台 iOS 的设备 udid,示例:

>>> connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100&&udid=00008020-001270842E88002E")  # iOS with mjpeg port and udid
>>> connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100&&uuid=00008020-001270842E88002E")  # udid/uuid/serialno are all ok

该名称无论使用 udid/uuid/serialno 中任何一个名字传入都可以生效,可以在连接后,通过以下方式获取到这个值:

dev = connect_device("iOS:///http://localhost:8100/?udid=00008020-001270842E88002E")
print(dev.uuid)

增加这个参数的主要原因是,在 wda 中获取不到 ios 手机的 udid,但在某些情况下可能需要用到这个值,因此支持主动传入保存。

3. 问题修复

1)修复了部分 windows 下,游戏无法正确截屏的问题

迭代了 windows 的 snapshot ,修复了部分游戏截屏图像重复、黑屏等问题,同时修复了在双屏下的截图区域错误问题。

2)修改了报告中对于运行结果是否成功的判定

原先的逻辑是:只要整个运行过程中出现 traceback ,就认为此次任务运行失败。

【图】1.2.7 版本 Airtest 跑测结果示意

但通常会遇到一种情况是:在运行过程中会出现一些不太重要的脚本异常,我们希望脚本不卡在这里,而是 catch 住异常后继续往下跑,只要能跑到最后就算脚本成功。

【图】1.2.9 版本 Airtest 跑测结果示意

因此将脚本的成功判断改为:当步骤列表的最后一个步骤有 traceback,才认为本次脚本运行失败。

3)对报告中一些显示效果做了一点微调

① 做了一些样式调整,修复了一些显示问题;

② 报告 html 支持上下左右按键切换预览图片。

4. 如何更新

因本次更新仅更新了 Airtest 库,所以同学们目前只能在自己本地 python 环境中,将 Airtest 更新到最新版本:

pip install -U airtest

对于使用 AirtestIDE 的同学,可以等我们发布 1.2.15 版本的 IDE,或者在旧版本 AirtestIDE 中设置使用本地 python 环境,然后将本地 python 环境的 Airtest 库升级到最新版本即可。

5. 其它问题

如同学们在使用新版的 Airtest 时遇到了一些问题无法解决,特别是录屏相关的问题,可以通过此网站向我们的开发者快速提单:https://airtest.netease.com/issue_create

可以在标题中加入 “Airtest1.2.9” 之类的字眼,方便我们快速筛选和排查。


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

官方答疑 Q 群:117973773

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

共收到 14 条回复 时间 点赞

应该是: landscape

bauul 回复

感谢提醒!

请问下 github 上的 pocoservice.apk 的源码有考虑更新吗,不是 python poco 库~~
我看 github 上 pocoservice.apk 的代码还是 2021 年的。
或者说 pocoservice.apk 可以调整 2 个地方吗?
第一个是:Selector.select,这里深度 9999,测试过程中出现该现象了。导致了栈溢出(不确定 999 会不会溢出,后面没遇到过)

第二个是:Node.getAttr 里面的 visible 属性获取的,我在测试某个软件的时候,出现了环状结构,导致死循环在这里了。。。

回复

哇 非常感谢同学的详细建议,我已经转给相关开发评估了,至于后续还是否更新 pocoservice.apk 的源码,我们尽快讨论下,辛苦同学持续关注 airtest 的 git 仓库~

回复

感谢提醒,有相应的复现应用场景吗,第二个建议做了调整

ssssss 回复

https://www.zxx.edu.cn/download_app
国家中小学 App 首页就会出现该问题,这里 AirtestIDE 没有输出,且 poco 一直获取不到控件;
我当时用源码调试打日志后发现是在 visible 那边死循环了

另一个问题请教下,在 App 内的 H5 界面,有时候 poco 能识别到,有时候又识别不到,这种有什么解决方案吗?
比如国家中小学 App 的这个登录界面,有时候能识别到

有时候又识别不到

有参照官网文档修改了 WebView 实现为 google 原生,但是还是有几率出现。

回复

现在 poco 对 h5、小程序、混合开发的应用,识别情况都还不太稳定,目前我们尝试了一些方案,有了一定的效果,后续会放版出来的,现在确实还没有方案可以体验到

@fishfish-yu 请问下 3 楼那边提到的问题 2 这个 后面有啥进度吗?

回复

有的,我们目前都有在更新 pocosevice 的,近期会有一次更新,可以关注一下,我们也会反馈给开发同学去同步到 GitHub 上~

@fishfish-yu 实在不好意思 又来问你了。。我从 poco 里面获取了最新的 pocoservice-debug.apk(2023-12-22),仍然会出现上文提到的栈溢出和死循环问题。

回复

出现栈溢出和死循环问题也是与之前一样的情况导致的吗

fishfish-yu 回复

拿了几个之前出问题的页面测试过,也是都会的,由于没有最新的 pocoservice.apk 的源码,所以没法调试确认;

回复

这边可以麻烦您进一下我们的官方 Q 群 117973773
联系一下 Q 群的冯瑜同学~

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