AirtestProject浅尝辄止
AirtestProject是什么
AirtestProject是由网易游戏推出的UI自动化测试解决方案,主要包含3部分内容:
1.Airtest框架:跨平台的,基于图像识别的UI自动化测试框架,支持平台有Windows、Android和iOS。
2.Poco框架:基于UI控件识别的自动化测试框架,目前支持Android原生、iOS原生、Unity3D、cocos2dx、UE4和Egret等平台,也可以在其他引擎中自行接入poco-sdk来使用。
3.AirtestIDE:跨平台的UI自动化测试编辑器,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写Airtest和Poco代码。
关于AirtestProject的具体介绍,详见:AirtestProject官方文档。
AirtestProject简单示例
所谓AirtestProject的应用实践,即使用AirtestIDE编写Airtest和Poco代码,实现对APP的自动化操作。
对于一个从未接触过AirtestProject的新人而言,要使用AirtestProject完成对指定APP的自动化操作,实现步骤如下:
第一步:到这里下载最新版的AirtestIDE,解压到指定位置,双击AirtestIDE.exe启动编辑器。

在启动过程中会提示用户注册账户并登录,直接点击Skip跳过即可。
第二步:连接手机到主机,并打开调试选项,此时将会在AirtestIDE的右侧“设备窗”面板中看到已经连接的设备信息,点击“connect”按钮后即可看到手机界面。


第三步:新建Airtest脚本,点击“文件->新建脚本->.air Airtest项目”,此时会弹出一个保存Airtest脚本的对话框,设置好文件名并选择指定目录,点击“保存”按钮。


第四步:开始编写Airtest自动化测试代码。实际上,借助于AirtestIDE编辑器可以直接在通过“Airtest辅助窗”面板中的按钮生成代码。
以打开“设置”APP为例,在“Airtest辅助窗”面板中点击“touch”图标,此时移动光标到右侧的“设备窗”面板中拖动鼠标选取“设置”APP图标,此时就会在脚本文件中自动生成一段代码。


第五步:运行脚本。在AirtestIDE编辑器中点击“运行->运行脚本”,此时从右侧设备窗面板中将看到“设置”APP被点击启动了。
至此,一个非常简单的Airtest脚本就完成了。在这个简单实例中仅仅只是打开了指定APP,并没有实现任何有价值的工作,但这已经足够说明如何编写Airtest代码并实现APP自动化的流程了。
AirtestProject深入实践
通过包名启动APP
启动APP除了可以通过Airtest的图标识别方式启动之外,还可以直接通过api方式指定APP包名启动,示例代码如下:
# -*- encoding=utf8 -*-
__author__ = "zhangsan"
from airtest.core.api import *
auto_setup(__file__)
# 通过api指定包名启动APP
start_app("com.android.settings")
关于如果获取指定APP包名,网络上有很多教程,例如:使用adb 命令获取APP包名 。
引入其他Airtest模块
在一个正式的生产项目中,便于共用相同的逻辑,通常需要将一些公共的操作封装起来,Airtest支持引入外部的模块。
假设已经有一个封装了公共操作的Airtest模块,名称叫做“common.air”,其内容如下:
# -*- encoding=utf8 -*-
__author__ = "zhangsan"
from airtest.core.api import *
auto_setup(__file__)
#
# 启动APP
#
def start_app():
start_app("com.android.settings")
sleep(5.0)
在另外一个Airtest模块中可以引入该公共模块:
# -*- encoding=utf8 -*-
__author__ = "zhangsan"
from airtest.core.api import *
# 引入外部Airtest模块
using("common.air")
# 导入外部Airtest模块中的方法
from common import start_app
# 导入外部Airtest模块中的方法之后可以直接调用
start_app()
使用Poco定位元素
在之前的简单示例中是通过图片识别的方式实现元素定位的,其实还可以直接使用Poco框架使用表达式直接对APP中的元素定位。
需要注意的是:如果需要使用Poco框架定位元素,需要在脚本中加入对应的初始化代码。
# -*- encoding=utf8 -*-
__author__ = "zhangsan"
# 初始化Poco框架的代码
# 这段代码还可以在AirtestIDE编辑器左侧Poco辅助窗面板中选择对应设备类型自动生成
# 如下代码是选择Android设备自动生成的的代码
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
相比起使用Airtest定位元素,使用Poco框架定位元素比较精准,但是在查找元素的定位标识时相对麻烦和困难(可以通过Poco辅助窗中的“Poco Inspector”实现元素查找和定位)。
如下示例展示通过Poco框架定位并打开“设置”APP。
poco("android.widget.FrameLayout").offspring("设置,0条通知").click()
在实际项目中有如下经验:当使用Poco框架定位困难时,可以直接使用Airtest框架的图片识别方式进行定位。
总之,使用最方便的元素定位方式即可。
关于Airtest框架和Poco框架的详见:Airtest介绍,Poco介绍 。
查看测试报告
AirtestProject项目是一个自动化测试解决方案,自然是需要有测试结果的报告说明的。在AirtestIDE编辑器中点击“运行->打开报告目录”即可在浏览器中查看对应的测试报告详情。

运行测试脚本
通常在开发环节时,直接在AirtestIDE编辑器中运行Airtest自动化测试脚本是非常方便和直接的。但是当开发完毕之后,是需要脱离IDE环境运行的。
有2种办法:
第一,根据AirtestIDE的运行脚本命令跑,如:
# 先使用adb连接设备,否则可能无法启动Airtest脚本
adb connect 127.0.0.1:5037
"D:\ProgramFiles\AirtestIDE-win-1.2.14\AirtestIDE\AirtestIDE" runner "D:\python\helloworld.air" --device android://127.0.0.1:5037/14a0332c?cap_method=MINICAP&&ori_method=MINICAPORI&&touch_method=MAXTOUCH --log "C:\Users\zhangsan\AppData\Local\Temp\AirtestIDE\scripts\807aacf1256a64b89f3f7b89ae805c43"
第二,部署本地Python环境跑。
# 安装Airtest框架
pip install airtest
# 安装Poco框架;编写了Poco语句就需要安装
pip install pocoui
# 安装airtest-selenium框架;编写了airtest-selenium语句就需要安装
pip install airtest-selenium
# 运行自动化测试脚本
python -m airtest run "D:\python\helloworld.air" --device android://127.0.0.1:5037/127.0.0.1:7555 --log "C:\Users\zhangsan\AppData\Local\Temp\AirtestIDE\scripts\807aacf1256a64b89f3f7b89ae805c43"
详见:如何脱离AirtestIDE跑自动化脚本 。
【参考】
https://www.jianshu.com/p/3e3ad243f956 Airtest引用其他的.air脚本
https://blog.csdn.net/Py_csdn_/article/details/109023773 【AirTest】引用别的.air脚本中封装好的方法的几种方式
https://blog.csdn.net/laoxi_liu/article/details/104628765 Airtest 常用函数(持续更新)
https://blog.csdn.net/qq_42293487/article/details/102929123 airtest常用按键
https://www.cnblogs.com/songzhenhua/p/15612620.html Airtest API精讲之wait(),exists()
https://blog.csdn.net/George513/article/details/101058574 Airtest-Poco元素定位剖析
https://blog.csdn.net/AirtestProject/article/details/105836667 poco的元素定位搞不定?速来看看这3个选择器
https://blog.csdn.net/qq_48946910/article/details/108640705 airtest有很多同名节点时快速定位到的一个方法
https://blog.csdn.net/AirtestProject/article/details/125999073 Airtest脚本的点击位置与点击偏移
https://cuiqingcai.com/9529.html Airtest 和 Poco 的 API 总结
https://www.cnblogs.com/songzhenhua/p/15970453.html Poco元素定位和脚本编写顺序
https://juejin.cn/post/7028783863102963720 一文打包Airtest干货教程-2021篇
AirtestProject浅尝辄止的更多相关文章
- 浅尝辄止——在C++中调用C#的回调函数——COM方式
这种方式比较简单,给大家分享一下,同时讲一下SafeArray内定义结构体的方法 1. 需求描述 需求是这样的,C++代码和C#代码相互通信(C++一般做服务,C#做客户端),C++一侧准备好数据,然 ...
- 浅尝辄止——使用ActiveX装载WPF控件
1 引言 使用VC编写的容器类编辑器,很多都可以挂接ActiveX控件,因为基于COM的ActiveX控件不仅封装性不错,还可以显示一些不错的界面图元. 但是随着技术不断的进步,已被抛弃的Active ...
- WPF简单布局 浅尝辄止
WPF的窗口只能包含一个元素,为了在WPF窗口中放置多个元素并创建更实用的用户界面,需要在窗口上放置一个容器,然后在容器中放置其它元素. 注意:造成这一限制的原因是window类继承自 ...
- 浅尝辄止WPF自定义用户控件(实现颜色调制器)
主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...
- JSON必知必会,浅尝辄止的整理
在使用JSON时常见的安全漏洞通常发生在JavaScript从服务器获取到一段JSON字符串并将其转化为JavaScript对象时, 在定位JSON安全问题时,应该记住三件事情: 1.不要使用顶级数组 ...
- DM浅尝辄止
都是大佬的笔记啊啊啊啊 dialog management 对话状态维护(dialog state tracking, DST) 生成系统决策(dialog policy) 系统行为(dialog a ...
- 浅尝辄止之MongoDB
1 简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储 解决方案.MongoDB将数据存储为一个文档,数据结构由键 ...
- SQL注入的浅尝辄止
简单的说,SQL注入就是通过在前端页面输入SQL语句,导致系统暴露异常信息在前端页面显示,非法者通过这些异常信息获取数据库的相干信息,为攻击系统做准备.
- Metatable In Lua 浅尝辄止
http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html 什么是Metatable Lua中Metatable这个概念, 国内将他翻译为 ...
- 【狼窝乀野狼】Parallel浅尝辄止
前段时间看到园子里面有同学在用Parallel进行批量插入数据库.后面也有很多同学针对这一事件给出了自己的看法和见解.我在这里不评论内容的好坏,至少能将自己东西总结分享这个是要靠勇气和毅力. 闲话少说 ...
随机推荐
- [转帖]tgz 安装clickhouse
一.什么是clickhouse ClickHouse是开源的列式存储数据库(DBMS),主要用于在线处理查询(OLAP),能够使用SQL查询实时生成数据分析报告. 下面介绍下安装clickhouse. ...
- [转帖] 记一次使用gdb诊断gc问题全过程
记一次使用gdb诊断gc问题全过程 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 上次解决了GC长耗时问题后,系统果然平稳了许多,这是之前的文章<G ...
- [转帖]JVM——内存区域:运行时数据区域详解
https://www.jianshu.com/p/cded765cfd1b 关注:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了 ...
- 三十分钟入门基础Go(Java小子版)
作者:京东科技 韩国凯 前言 Go语言定义 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态.强类型.编 ...
- 你不知道的Promise构造函数Promise(excutor)
Promise构造函数Promise(excutor) // 说明一下:excutor会在Promise内部立刻同步调用:(异步操作在执行器执行) var p = new Promise((resol ...
- 【小测试】rust中的数组越界——好吧,这下证明rust不是零成本抽象了吧
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1.编译期发现的数组越界 在数组下标是常量的情况下,编译期 ...
- Go实现网络代理
使用 Go 语言开发网络代理服务可以通过以下步骤完成.这里,我们将使用 golang.org/x/net/proxy 包来创建一个简单的 SOCKS5 代理服务作为示例. 步骤 1. 安装 golan ...
- Leetcode 98题验证二叉搜索树(Validate Binary Search Tree) Java语言求解
题目链接 https://leetcode-cn.com/problems/validate-binary-search-tree/ 题目内容 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设 ...
- vim 从嫌弃到依赖(10)——缓冲区列表
之前的一系列文章主要介绍了vim文本相关的操作,并且也介绍了vim的几种模式.通过前面的内容,相信各位小伙伴们已经对vim有了一个基本的了解,同时也能够使用vim快速编辑文本,从这篇开始,我们将要介绍 ...
- k8s 中的网络
k8s 中的网络模型 CNI 网络插件 CNI 的设计思想 k8s 中的三层网络 Flannel 的 host-gw Calico 参考 k8s 中的网络模型 CNI 网络插件 docker 容器的网 ...