Airtest介绍与脚本入门
前言
通过阅读本小节教程,你将了解以下内容:
- 一个Airtest脚本例子的详细解析
- 如何在Python脚本中调用Airtest接口
- 图片语句的参数介绍
Airtest介绍
Airtest是一款基于Python的、跨平台的UI自动化测试框架,基于图像识别原理,适用于游戏和App。
访问Github上的 Airtest源码地址,可以获得更多信息,也欢迎各位帮忙完善项目,提交PR,也可以在issues页面中 提交bug或建议 。
如何快速上手
首先,想要编写Airtest脚本,需要具备基础的Python语法知识。虽然借助我们的AirtestIDE提供的录制功能,也能简单地根据操作步骤录制出可以回放操作的脚本,但是通常来说,熟练掌握Python语法能够帮助我们写出应用更广泛、更不容易出错的脚本。
若对 Python 语法不熟悉,网络上有不少非常优秀的Python教程可以学习,例如 廖雪峰的Python新手教程。
关于Airtest项目的安装、基本使用方法和简单的例子,请查看Airtest文档页的 快速上手 章节。
一、一个简单的.air脚本解析
什么是.air脚本
在下载解压Airtest脚本的专属IDE——AirtestIDE后,点击“新建脚本”按钮,默认即可创建一个后缀名为`.air`的脚本文件,`.air`这是Airtest脚本的专属后缀。
让我们打开刚才新建脚本的文件夹,可以看到实际上`.air`脚本文件是一个普通的文件夹,里面附带了一个同名的`.py`文件,AirtestIDE在执行脚本时,实际上执行的是里面的`.py`文件。也就是说,Airtest脚本虽然自带一个后缀名,然而本质上依然是Python脚本,遵循的是Python语法,我们可以根据实际需要自由地`import`其他Python第三方库。
值得注意的是,`.air`文件夹中必须要有同名的`.py`文件,否则在命令行执行`airtest run test.air` 这样的运行指令时会导致失败。
如何使用AirtestIDE录制Airtest脚本
在观看本篇教程前,如果你已经阅读过我们的快速上手教程的话,应该就知道我们在录制脚本前需要先连上一个设备。这个设备可以是一台Android手机、一个Windows窗口、或是iOS设备等等,请参考我们的设备连接文档,在`AirtestIDE`里根据需要连接一个设备。
成功连接设备后,就可以根据Airtest脚本录制文档中描述的两种功能:手工按键录制与自动录制,来录制你需要的脚本内容了。
同时可以通过使用Python的判断、循环等语法,让脚本实现更加复杂的功能,完成自动化测试的需求。
Airtest脚本示例
这是一个简单的脚本示例内容:(AirtestIDE中会自动将`Template(xxxx)`渲染为图片形式)
# -*- encoding=utf8 -*-
__author__ = "user" # 初始化环境
from airtest.core.api import *
auto_setup(__file__) start_app("org.cocos2d.blackjack") # 模拟点击
touch(Template(r"tpl1556019871196.png", record_pos=(0.204, -0.153), resolution=(1280, 720)))
sleep(2)
swipe(Template(r"tpl1561952588795.png", record_pos=(-0.067, 0.134), resolution=(1280, 720)), vector=[0.2783, 0.0374])
wait(Template(r"tpl1561952704834.png", record_pos=(-0.186, -0.093), resolution=(1280, 720))) keyevent("BACK") # 一些简单的逻辑判断
if exists(Template(r"tpl1559100640980.png", record_pos=(-0.33, -0.105), resolution=(1920, 1080))):
text("test") # 断言
assert_exists(Template(r"tpl1561952631660.png", record_pos=(-0.373, -0.108), resolution=(1280, 720)), "验证内容存在") stop_app("org.cocos2d.blackjack")
初始化环境
首先,就像一个普通的Python脚本一样,我们需要在代码文件的最开头部分,写上`from airtest.core.api import *`,将Airtest的主要API都import进来,以便在后续脚本中使用这些API。
`auto_setup` 是一个用来初始化环境的接口,接口文档在这里,它接受4个参数,我们可以设置当前脚本所在的路径、指定运行脚本的设备、设置默认的log路径和设置脚本父路径。
- 如果`auto_setup`不传入任何参数的话,Airtest将会读取运行时命令行中传入的各项参数,来对环境进行初始化。
- 在AirtestIDE创建脚本时,默认生成的代码里是最简单的初始化代码`auto_setup(__file__)`,意思是将脚本文件作为脚本路径传入,其他参数内容将默认读取运行命令行传入的参数。
脚本运行命令行有两种形式,命令行中的参数包含`device`、`log`等:
- 命令行运行Airtest脚本的示例:`>airtest run untitled.air --device Android:///手机设备号 --log log/`。更多使用命令行运行脚本信息,请参考文档。
- 在使用AirtestIDE运行脚本时,会在“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`接口来连接设备。
- Airtest支持在一个脚本里同时连接多个设备,使用`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`图片类进行更加详细的介绍。
平台相关的接口
刚才提到的`airtest.core.api`中的接口,都是跨平台的,但是每个接口具体支持的平台可能各不相同。例如,install接口在文档中的`支持平台`一栏里,只有`Android`,意味着在连了`Windows`设备(即某个Windows窗口)时,是不能使用这个接口来安装应用程序的。
具体查看某个接口在某个平台下的支持情况,请翻阅文档目录中的`平台相关的API`,根据具体的平台查找对应的接口,同时,还能发现在不同的平台下,有一些独有接口可供调用,例如在Android平台下:
from airtest.core.api import *
# Android平台下的touch接口支持额外的参数duration来控制点击屏幕的时长
# 翻阅airtest.core.android.android中的Android包含的touch方法来获取更多参数信息
touch((600, 500), duration=1) # 在Android中,有一个平台独有的接口list_app可以列出所有安装过的应用
dev = device() # 先获取到当前设备对象,这里的dev即是一个Android对象
print(dev.list_app()) # 然后就可以调用平台独有接口了
断言语句
断言在单元测试代码中非常重要,因此建议在我们的脚本里使用断言语句来判定被测应用当前的状态是否是我们预期中的状态。
Airtest提供了`assert_exists`和`assert_not_exists`两个接口,来断言一张图片存在或不存在于当前画面中。
同时,还提供了`assert_equal`和`assert_not_equal`两个语句,来断言传入的两个值相等或者不相等。
二、如何在Python脚本中使用Airtest
AirtestIDE在新建脚本时,也能够直接创建一个`.py`脚本文件,但是在创建之前会弹出一个设置窗口,要求填写一些指定的参数。
在我们了解过`auto_setup`接口后就会知道,这些参数就是为了传给它,然后初始化Airtest运行环境用的。因此,一个纯`.py`脚本的初始化代码可以是这样的:
from airtest.core.api import *
from airtest.cli.parser import cli_setup if not cli_setup():
auto_setup(__file__, logdir=True, devices=[
"Android:///?cap_method=javacap&ori_method=adbori",
]) # do something
# touch((x, y))
上面这段代码的意思是说,当使用 `python xxx.py` 来运行本文件,且不带任何命令行参数时,则自动使用 `auto_setup` 这个接口来对airtest相关的参数进行初始化。这样只需要在写py脚本时,填写好指定的参数就能直接用 `python xx.py` 指令来运行脚本。
同时,原先传统的 `airtest run xx.air –-devices Android:///` 命令行运行方式也不受影响,只要脚本检测到传入了命令行参数(即代码中的`if not cli_setup()`判断),就依然优先使用命令行参数来初始化Airtest环境。
当然,熟练掌握API的各位,也可以根据实际需求在自己的Python脚本中调用Airtest API,与使用正常的Python第三方库方法相同。
三、图片类`Template`的参数介绍
在AirtestIDE中,带有截图的语句是能够展示出对应的图片的,方便大家知道这个语句使用的是什么截图。在编辑器中点击鼠标右键菜单的`图片/代码模式切换`,可以将当前编辑窗口中的代码切换成纯文本代码,那么我们将会看到,一个`touch(图片)`这样的语句,可能会变成这样的格式:
touch(Template(r"tpl1556019871196.png", record_pos=(0.204, -0.153), resolution=(1280, 720)))
`Template`即Airtest封装的图片类,运行时会先去读取这张图片,然后在当前画面中找到最符合这张图片的坐标点,最后才执行`touch`点击。
在AirtestIDE中截的图,默认会自带3个参数,第一个参数是图片名,第二个`record_pos`记录了截取这张图片时,它所在的位置,第三个`resolution`记录的是截取图片时,当前画面的分辨率。
- `record_pos`的作用是,可以让Airtest在回放脚本时优先在录制时的位置附近查找,如果找不到符合条件的图片,再扩大寻找范围到整个画面。这样能够提升查找图片的速度和精确度。
- `resolution`记录的是画面的分辨率,如果在不同设备上回放脚本,Airtest将会对当前画面的分辨率按照比例进行一定的缩放,方便图片的跨分辨率匹配。
- 虽然直接使用图片路径来初始化一个`Template`类,也同样能够运行代码,但是为了能够适配更多分辨率的设备,以及提升图像查找速率,建议各位尽量填写参数。AirtestIDE截取的图片将会自动生成对应的参数,如果对截取的图片不满意,可以使用图片编辑器功能对图片进一步修改。
除了以上三个参数之外,图片还支持更多参数,对运行过程中的图像识别阈值、点击位置和是否灰度进行修改。其中,图像匹配的阈值`threshold`值与图像识别的成功率息息相关,请阅读文档获得更多细节。
#### 图像识别的全局配置项
在上一小节中,我们介绍了图像模板类`Template`的各项参数,当我们修改那些参数时,只有对应的那张图片会生效,举个例子:
touch(Template(r"tpl1556019871196.png", threshold=0.9)
在这行代码中,我们将一张图片的识别阈值`threshold`设置为0.9,意思是当识别结果的可信度大于等于90%时,我们才认为这次图像识别匹配成功,是一个相当严格的设置了。
假如我们希望能够将这个设置扩展到整个脚本中的所有图片,又不希望挨个修改每张图片的代码时,我们可以考虑修改Airtest的全局配置来实现这个需求:
from airtest.core.api import *
# airtest.core.api中包含了一个名为ST的变量,即为全局设置
ST.THRESHOLD = 0.8 # 未指定图片threshold,默认使用ST.THRESHOLD中的0.8
touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264))) # 手工指定图片threshold,以图片设置的0.6为准
touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6))
还有更多可定制的全局配置项,请各位查看脚本全局配置文档页来获取更多配置项的介绍。
总结
通过阅读本节教程,希望大家能够对Airtest脚本有更加深入的印象,它不仅仅能够在AirtestIDE上通过几次鼠标点击来生成录制脚本,还可以结合Python、运用编程技巧编写代码实现更多复杂需求。
因此,使用Airtest与使用其他Python第三方库一样,需要多加阅读Airtest API文档,而Github上的源码也清晰易懂,欢迎各位阅读源码或与我们交流。
Airtest介绍与脚本入门的更多相关文章
- aFlex脚本入门
aFlex脚本入门 来源:http://blog.51cto.com/virtualadc/599194 来源:http://blog.51cto.com/virtualadc/624219 对于A1 ...
- Web安全之Web 安全介绍与基础入门知识
web安全介绍与基础入门知识 安全与安全圈 甲方与乙方 甲方:如腾讯,阿里等需要安全服务的公司 乙方:提供安全服务产品的服务型安全公司 web与二进制 web,研究web安全 二进制,研究如客户端安全 ...
- Linux Shell脚本入门--cut命令
Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...
- linux的shell脚本入门
Linux shell脚本入门教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活 的工具.Shell不仅仅是命令的收集,而且是一门非常 ...
- mxgraph进阶(二)mxgraph的初步介绍与开发入门
mxgraph的初步介绍与开发入门 前言 由于小论文实验需求,需要实现根据用户日志提取出行为序列,然后根据行为序列生成有向图的形式,并且连接相邻动作的弧上标有执行此次相邻动作的频次.为此,在大师兄徐凯 ...
- (一)shell脚本入门
shell脚本入门 1.脚本格式 脚本以#!/bin/bash 开头(指定解析器) 2.第一个shell脚本:helloworld (1)需求:创建一个shell脚本,输出helloworld 运行: ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)
博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...
- BAT脚本入门
BAT脚本入门 echo:显示命令后的字符 chcp 65001: 就是换成UTF-8代码页 echo off: 此语句后的所有运行命令都不显示命令行语句 @:与echo off相似,但它加在每个命令 ...
随机推荐
- 在docker中创建使用MySQL,并实现远程连接navicat
在 docker 中使用 mysql 安装完docker之后,在命令行中输入docker images可以查看自己创建的image(安装下载docker的教程很多了,大家需要可以去查一下就可以了)这里 ...
- 【Java必修课】HashMap性能很好?问过我EnumMap没
1 简介 我们知道Map只是一个接口,它有多种实现,Java中最常用的是HashMap了.而本文想讲述的是另一个实现:EnumMap.它是枚举类型的Map,要求它的Key值都必须是枚举型的. 2 创建 ...
- 学习笔记51_MongoDB使用
MongoDB的包: 例如:设置Mongodb端口 在命令行: F:\MongoDB>mongod.exe --port:3306 做集群: 安装和使用: 1.在服务中添加MongoDB ( 指 ...
- 设计模式之代理模式(Java)
简介 代理模式出场率真的相当的高,几乎所有框架中无一例外都用到了代理模式,所以了解一下收益还是很高的. 代理模式是什么 如果用一句话来描述代理模式: 代理模式就是为其他对象提供一种代理以控制对被代理对 ...
- JAVA Rest High Level Client如何取聚合后得数据
对于刚刚学习es的童鞋来说,很容易不清楚怎么获取客户端对es文档的聚合结果,下面就演示一下模仿DSL写聚合,然后获取到聚合对结果. 一, 对于下面这个简单的聚合,目的是对于文档全文匹配,聚合颜色字段. ...
- 关于数论分块里r=sum/(sum/l)的证明!
今天的模拟赛里T2要使用到数论分块,里面有一个重要的坎就是关于r=sum/(sum/l)的证明,网上关于这道题的题解里都没有关于这个的证明,那么我就来填补一下: 在以下的文章里,我都会使用lo(x)表 ...
- Python基础学习(一)之Python的概述与环境安装
Python介绍 Python语言介绍 Python是一门高级的.面向对象的.解释性.脚本语言. 高级语言:贴近开发者,对应底层语言,底层语言贴近机器:java.C#.php .ruby 面向对象对应 ...
- php [poolwww] seemsbusy (youmayneedto increasepm.start_servers, or pm.min/max_spare_servers)错误解决方法
php [poolwww] seemsbusy (youmayneedto increasepm.start_servers, or pm.min/max_spare_servers)错误解决方法修改 ...
- Geotools求shapefile路网中任意两点之间最短路径的距离
前言:之前在博问求助过这个问题.经过几天的思考,算是解决了(但仍有不足),另一方面对Geotools不是很熟,有些描述可能不正确,希望大家批评指正. 问题:作为一个新手,我并没有发现Geotools中 ...
- WIN7安装Docker Toolbox、制作镜像并发到阿里云
一.安装Docker Toolbox,并配置国内源加速 WIndows7不支持Hyper-v,所以只能采用Docker Toolbox的方式使用Docker.传送门:http://mirrors.al ...