摘要:的框架是网易团队自己开发的一个图像识别框架,这个框架的祖宗就是一种新颖的图形脚本语言。基本操作方法除了跨平台的还有平台特定的,比如安卓平台苹果平台平台这里我们来详细说说这些模块。
Airtest是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具。Airtest的框架是网易团队自己开发的一个图像识别框架,这个框架的祖宗就是一种新颖的图形脚本语言Sikuli。Sikuli这个框架的原理是这样的,计算机用户不需要一行行的去写代码,而是用屏幕截屏的方式,用截出来的图形摆列组合成神器的程序,这是Airtest的一部分。
另外,Airtest也基于poco这个U控件搜索框架,这个框架也是网易自家的跨平台U测试框架,原理类似于appium,通过控件的名称,id之类的来定位目标控件,然后调用函数方法,例如click(),swip()之类的方法来对目标控件进行点击或者是操作。
概念:自动化测试,就是把繁杂的人工测试用例利用自动化测试工具编写成代码,让机器代替人工自动跑用例的过程。实际上就是把以人为驱动的测试行为转化为机器执行的一种过程。
意义:节省人力、物力、时间、硬件资源等,提升测试效率,特别对于繁琐重复的测试用例,可以使测试人员更专注于新的测试模块的建立和开发,从而提高测试覆盖率。
以上主流工具的优点跟缺点:
相较于以上工具来说,Airtest有以下优点和缺点:
所以其实基于图像识别的Airtest更适合用于游戏测试多一点。
1、AirtestIDE的下载
AirtestIDE已经帮你集成了所有的环境,自带录制脚本栏,自动生成脚本,自带编辑器还自带模拟器,有了一个AirtestIDE就可以轻松简单的录制脚本了。下载地址是Airtest的官网:
http://airtest.netease.com/
AirtestIDE的使用教程跟文档也在下面的连接中:
https://airtest.doc.io.netease.com/
使用AirtestIDE对Android应用进行自动化测试时,第一步就需要连接Android设备。
Android真机连接准备:
如果遇到连接问题,请查阅Android连接常见问题:https://airtest.doc.io.netease.com/IDEdocs/faq/1_common%20problems/
手机连上Airtest之后,会向手机中安装2个app,如下:
pocoservice是支撑poco操作的app,yosemite是airtest的输入法,安装之后,手机的默认输入法会变成这个输入法,如果需要改回来原来的输入法,需要手动到手机设置里面进行修改;
参考:使用adb无线连接手机
当手机与电脑处在同一个wifi下,即可尝试无线连接手机了,但是这种方式受限于网络连接的稳定性,可能会出现连接不够稳定的情况。具体连接操作步骤如下:
点击录制按钮,选择事件进行录制,可以用鼠标操作
介绍一下录制时每一个参数的作用
可以按照需要的参数进行配置
在下载解压 Airtest 脚本的专属 IDE——AirtestIDE 后,点击 “新建脚本” 按钮,默认即可创建一个后缀名为.air
的脚本文件,.air
这是 Airtest 脚本的专属后缀。
让我们打开刚才新建脚本的文件夹,可以看到实际上.air
脚本文件是一个普通的文件夹,里面附带了一个同名的.py
文件,AirtestIDE 在执行脚本时,实际上执行的是里面的.py
文件。也就是说,Airtest 脚本虽然自带一个后缀名,然而本质上依然是 Python 脚本,遵循的是 Python 语法,我们可以根据实际需要自由地import其他 Python 第三方库。
值得注意的是,.air
文件夹中必须要有同名的.py
文件,否则在命令行执行airtest run test.air
这样的运行指令时会导致失败。
首先,就像一个普通的 Python 脚本一样,我们需要在代码文件的最开头部分,写上from airtest.core.api import *
,将 Airtest 的主要 API 都 import 进来,以便在后续脚本中使用这些 API。
auto_setup
是一个用来初始化环境的接口,接口文档在这里,它接受 4 个参数,我们可以设置当前脚本所在的路径、指定运行脚本的设备、设置默认的 log 路径和设置脚本父路径。
auto_setup
不传入任何参数的话,Airtest 将会读取运行时命令行中传入的各项参数,来对环境进行初始化。auto_setup(__file__)
,意思是将脚本文件作为脚本路径传入,其他参数内容将默认读取运行命令行传入的参数。脚本运行命令行有两种形式,命令行中的参数包含device
、log
等:
>airtest run untitled.air --device Android:///手机设备号 --log log/
。"D:/AirtestIDE-path/AirtestIDE" runner "D:/script-path/untitled.air" --device Android://127.0.0.1:5037/5PZTQWQOGES8RWUG --log "C:/Users/username/AppData/Local/Temp/AirtestIDE/scripts/aa8c71acdfa70c3068b862cb42ffb8dc"
--device Android:///
这样的设备参数,那么脚本在初始化时会自动连上对应的设备,不需要再另外写代码连接了。connect_device
接口来连接设备。set_current
接口可以在多个设备中进行切换,device()
接口可以获取到当前使用中的设备。Airtest 作为自动化测试框架,模拟的是人的操作,常见接口主要有:
touch
点击某个位置,可以设定被点击的位置、次数、按住时长等参数swipe
从一个位置滑动到另外一个位置text
调用输入法输入指定内容keyevent
输入某个按键响应,例如回车键、删除键wait
等待某个指定的图片元素出现snapshot
对当前画面截一张图核心 API 请参见这个文档,在这个文档页里出现的 API 都是跨平台 API,由于我们在代码的第一行里将airtest.core.api
里的接口全部import
进来了,因此这些 API 可以在代码里直接进行调用,像这样:
from airtest.core.api import *touch((x, y))
在很多接口中,支持传入Template
图片对象作为参数,在运行时将会去点击图片在画面中的所在位置,类似这样:
# 等价于 touch((x, y)), (x, y)是图片所在的中心点touch(Template(r"tpl1556019871196.png", record_pos=(0.204, -0.153), resolution=(1280, 720)))
其中,Template
对象是一个图片类,Airtest 会先尝试在当前画面中寻找能够匹配这张图片的位置,如果找到了,将对这个坐标进行点击操作,如果找不到,将抛出识别异常。我们将在后文对Template
图片类进行更加详细的介绍。
1)使用 pip 安装Airtest框架 pip install airtest
2)若运行代码时,在cv2模块报 ImportError: DLL load failed: 找不到指定模块 的错,如果使用的python版本低于3.7,请直接运行:
pip uninstall opencv-contrib-python# 若以下安装语句运行失败,可以尝试更新pip到最新版本后重试pip install opencv-contrib-python==3.2.0.7
3)Poco安装
使用 pip 安装poco框架 pip install pocoui
,请注意库的名称为 pocoui
,不要填错。
除了跨平台的API还有平台特定的API,比如:
airtest.core.android #安卓平台airtest.core.ios #苹果平台airtest.core.win #Windows平台
这里我们来详细说说这些模块。
跨平台API模块
这里我们要介绍的第一个就是跨平台模块:
from airtest.core.api import * #导入所有方法
1).初始化设备
这里初始化设备我们也有两种方案,下面请看:
根据设备的UUID来初始化
语法格式:
init_device(platform="Android",uuid="",cap_method=JAVACAP for Android)#平台 – Android,IOS或Windows#uuid –目标设备的uuid,例如,用于Android的serialno,用于Windows的handle,用于iOS的uuid#kwargs –可选的平台特定关键字args,例如cap_method = JAVACAP for Android
下面我们来列举一下实例,如下:
init_device(platform="Android",uuid="127.0.0.1:62001",cap_method="JAVACAP")
根据设备的URL来初始化
语法格式如下:
android:/// 连接当前安卓设备android://adbhost:adbport/serial NO.?cap_method=javacap&touch_method=adbwindows:/// 连接本地桌面程序ios:/// 连接IOS设备
这里我们主要是传入了ADB地址,端口和连接的夜神模拟器的序列号而连接上的。具体例子如下:
connect_device("android://127.0.0.1:5037/127.0.0.1:62001?cap_method=javacap&touch_method=adb")
2).返回当前活动设备
device()
3).设置当前活动设备
有时候如果我们连接了多个设备,我们需要切换的话,就是用这个函数来达到目的,可以使用设备的索引或者设备的序列号来进行切换哦。
set_current(0)set_current("127.0.0.1:62001")
4).运行环境配置
auto_setup(basedir = None,devices = None,logdir = None,project_root = None,compress = 0 )basedir 设置当前脚本的所在位置,__file__也可以。devices 指定运行脚本的设备以列表形式存在logdir 设置脚本运行时的日志保存路径,默认为None,设为True可保存project_root 设置api的项目根目录
5).开启并执行远程Shell命令
shell(cmd) #ls / data / local / tmp
6).在设备上启动程序
start_app("启动的应用程序包名")
7).在设备上停止程序
stop_app("启动的应用程序包名")
8).清除设备上的应用程序数据
clear_app("启动的应用程序包名")
9).在设备上安装应用程序
install(filepath="要在目标设备上安装的文件的路径")
10).在设备上卸载应用程序
uninstall("应用程序包名")
11).截图并保存到文件中
snapshot(filename="1.jpg",msg="hello",quality=3)filename:图片名msg:屏幕截图的简短描述quality:图像质量,范围为[1,99]的整数
12).唤醒并解锁设备
wake("设备")
13).返回目标设备的主屏幕
home("设备")
14).设备屏幕上执行点击,滑动,捏,按键,输入操作
click(v=Template(x,y),times=2) #单击v:触摸目标,可以是Template实例,也可以是绝对坐标(x,y)times:执行多少次触摸double_click() #双击swipe(v1,v2)#滑动起点和终点swipe(v1,vector=(x,y))#沿向量移动,向量可以是坐标也可以是屏幕百分比#返回值:原点位置和目标位置pinch()#捏操作,相当于缩放,参数如下:in_or_out:放大或缩小center:默认为None表示屏幕中心percent:捏动作的屏幕比例,默认值为0.5 keyevent(keyname="Home")#按键操作text("文本")#在设备上输入文本
15).睡眠,等待
sleep(2)#睡眠两秒,延迟两秒wait(v,timeout,interval,intervalfunc)#等待与设备屏幕上的模板匹配v:等待的目标对象timeout:超时时间interval:尝试找到匹配项的时间间隔(秒)intervalfunc:在每次未成功尝试找到相应匹配项后调用返回值:匹配目标的坐标
16).检查给定目标在设备屏幕上是否存在
exists(v)v:检查对象如果找不到目标,则为False,否则返回目标的坐标
17).在设备屏幕上查找所有出现的目标并返回其坐标
find_all(v)v:寻找目标返回坐标列表
18).断言操作
assert_exists(v,msg) #断言目标存在于设备屏幕上assert_not_exists(v,msg) #断言目标在设备屏幕上不存在v:要检查的目标msg:断言的简短描述assert_equal(v1,v2,msg) #断言两个值相等assert_not_equal(v1,v2,msg) #断言两个值不相等v1:第一个值v2:第二个值msg:断言的简短描述
这里基本上我们就把使用方法说完了,下面我们来进行下实际操作,下一篇文章即将奉上。
from airtest.core.api import *# 通过ADB连接本地Android设备connect_device("Android:///")#安装待测软件apk,路径信息。install("path/to/your/apk")#开始运行appstart_app("com.pingan.certicationApp")#点击某个图片,Airtest中基于图像识别语法,图片自己提供。touch(Template("image_of_a_button.png"))#滑动语音,开头图片跟结尾图片swipe(Template("slide_start.png"), Template("slide_end.png"))#添加断言的图片assert_exists(Template("success.png"))#点击Android上的返回键#keyevent("BACK")#点击Android上的Home键返回#home()#uninstall("package_name_of_your_apk")
# -*- encoding=utf8 -*-__author__ = "enmonster"from airtest.core.api import *auto_setup(__file__)from poco.drivers.android.uiautomation import AndroidUiautomationPocopoco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)poco("com.miui.home:id/workspace").offspring("计算器").offspring("com.miui.home:id/icon_icon").click()poco("com.miui.calculator:id/btn_c_s").click()poco("com.miui.calculator:id/digit_7").click()poco("com.miui.calculator:id/op_add").click()poco("com.miui.calculator:id/digit_5").click()poco("com.miui.calculator:id/btn_equal_s").click()
poco辅助窗
poco是通过元素本身的属性来定位元素,常用的API如下:
attr(‘type’):提取指定元素属性为type的值
get_text(): 提取指定元素的文本内容
attr(‘text’): 通过给定的属性名检索ui元素的属性。如果属性不存在,则返回none(属性有visible、text、type、pos、size、name等)
exists():判断指定元素是否在当前屏幕上存在,存在true、不存在false
click(): 点击事件,可使用click(center)、click([0.5,0.5])、focus([0.5,0.5]).click()来点击控件中心位置
rclick():右键点击
double_click():双击操作
long_click():长按操作
swipe:滑动事件,如:swipe([0.2, -0.2], duration=1)以45度角滑动,持续1秒钟
drag:拖拽事件,如:poco(text=‘需要拖动位置’).drag_to(poco(text=‘目标位置’))
focus (local positioning):局部定位,如:poco(‘控件地址’).focus(‘center’).click()点击控件中间位置
wait:等待事件,如:poco(‘控件地址’).wait(2).click() 控件出现就点击,最多等待2秒
如果case中涉及到两个手机交互的,可以在.py文件中连接多个手机,需要在哪个手机上操作,就需要在脚本中使用set_cerrent()借口来切换到相应的手机上;
device1 = "c17a4cb4" #设备1device2 = "RKK0217C15003363" #设备2dev1 = connect_device("android://127.0.0.1:5037/"+device1)#连接设备1dev2 = connect_device("android://127.0.0.1:5037/"+device2)#连接设备2poco1 = AndroidUiautomationPoco(dev1) #初始化设备1poco2 = AndroidUiautomationPoco(dev2) #初始化设备2set_current(device1)#切换到手机1set_current(device2)切换到手机2
初始化设备之后就可以进行相关设备的poco操作了,举个例子:
这个例子是打开微信,点击聊天信息中的一个好友,然后清除好友聊天的例子;
from poco.drivers.android.uiautomation import AndroidUiautomationPocodevice1 = "c17a4cb4" #设备号dev1 = connect_device("android://127.0.0.1:5037/"+device1)#连接师傅手机poco1 = AndroidUiautomationPoco(dev1) #实例化手机auto_setup(__file__) def clear_wechat(poco):#清除微信的聊天记录 start_app("com.tencent.mm")#启动微信 sleep(12)#等待12秒 poco1(text="三星").click()#点击好友“三星”的聊天 poco1("android.support.v7.widget.LinearLayoutCompat").click()#点击更多 poco1(text="清空聊天记录").click()#点击清空聊天记录 poco1(text="清空").click()#点击清空 stop_app("com.tencent.mm")#关闭微信
如果有很多重复的操作,可以将这些重复的操作写到一个公用的air文件里面,然后再在用例里面引用这个公用的air文件的方法就可以:
举例,有一个名叫gongyou.air的文件,里面有一个clear_wechat的方法,这个clear_wechat方法就是一个清除微信聊天记录的用例,如果需要在用例中用到这个clear_wechat,就需要在用例中引用这个文件,然后倒入这个引用文件中的clear_wechat方法,如下:
# -*- encoding=utf8 -*-__author__ = "xhong"from airtest.core.api import *from poco.drivers.android.uiautomation import AndroidUiautomationPocofrom poco.exceptions import PocoNoSuchNodeExceptionfrom poco.exceptions import PocoTargetTimeoutST.PROJECT_ROOT = "D:/code/AirtestCase"#引用公用air的路径using("gongyou.air")from gongyou import clear_wechat
参考:https://www.jianshu.com/p/32d08455e86f
https://blog.csdn.net/sunxitao970324/article/details/105731046
http://testerhome.com/topics/20704
https://cloud.tencent.com/developer/article/1819833
https://zhuanlan.zhihu.com/p/165527546
https://blog.csdn.net/chqj_163/article/details/109242399
AirtestIDE连接安卓真机及常见问题:
https://www.cnblogs.com/songzhenhua/p/14716116.html
airtest连接设备黑屏或者运行报错minicap超时问题:
https://blog.csdn.net/qq_32394351/article/details/112512540
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/122497.html
摘要:首先要打开微信,进入到指定的群聊,识别微信红包执行抢红包的动作。是一款基于控件识别的自动化测试框架,目前支持原生原生微信小程序,也可以在其他引擎中自行接入来使用。 showImg(https://segmentfault.com/img/remote/1460000019438856); 目录:0 引言1 环境2 需求分析3 前置准备4 抢红包流程回顾5 代码梳理6 后记 0 引言 提...
摘要:代码运行完成以后,微信被打开了。能不能像前面打开知乎一样,使用这个属性呢也行,也不行。滑动屏幕使用的命令为,滑动屏幕需要使用坐标信息。单独使用控制手机在 想开发网页爬虫,发现被反爬了?想对 App 抓包,发现数据被加密了?不要担心,使用 Airtest 开发 App 爬虫,只要人眼能看到,你就能抓到,最快只需要2分钟,兼容 Unity3D、Cocos2dx-*、Android 原生 A...
摘要:三性能测试工具官网介绍腾讯开源的的随身调测平台,支持和。官网介绍腾讯游戏部门开发的移动全平台性能测试分析工具平台。百度的服务目前主要为收费服务。 随着移动互联网的高速发展,App 应用非常火,测试工程师也会接触到各种 app 应用。除了人工测试之外,也可以通过一些测试工具来提高我们的测试效率...
摘要:为什么说软件测试绝不是一件容易的事从以下几个方面分析。要学习的软件测试基础理论多,必须要打好扎实的理论基础。 为什么说软件测试绝不是一件容易的事?从以下几个方面分析...
阅读 1343·2023-04-25 23:42
阅读 2813·2021-11-19 09:40
阅读 3522·2021-10-19 11:44
阅读 3533·2021-10-14 09:42
阅读 1861·2021-10-13 09:39
阅读 3822·2021-09-22 15:43
阅读 667·2019-08-30 15:54
阅读 1448·2019-08-26 13:32