Airtest基础使用原理和airtest中touch定位说明

Airtest是一款跨平台的UI自动化测试框架,基于图像识别原理,适用于游戏和App。

安装

这部分说明了如何在本地python环境中安装Airtest测试框架。如果你需要使用GUI工具,请从 官网 直接下载AirtestIDE使用。

系统要求

  • 操作系统
    • Windows
    • MacOS X
    • Linux
  • Python2.7 & Python3.3+

安装Python Package

使用 pip 来管理安装包和自动安装所有依赖。

① 安装Airtest库: pip install airtest

② 安装poco库: pip install pocoui

③ 更新Airtest: pip install -U airtest

④ 更新Poco: pip install -U pocoui

⑤ 卸载Airtest库: pip uninstall airtest

你也可以直接从Git仓库安装。

git clone https://github.com/AirtestProject/Airtest.git
pip install -e airtest

因为Airtest还在快速开发中,这里使用 -e 来安装源码。以后你就可以直接使用 git pull 更新代码目录来升级Airtest了。

因为我是用的mac电脑,在写好最简单的脚本后,用pycharm执行,报没有权限

解决办法:

cd {your_python_path}/site-packages/airtest/core/android/static/adb/mac
chmod +x adb

文档

完整的Airtest框架文档请查阅 readthedocs

例子

Airtest提供了简洁而且平台无关的API。这部分介绍了如何使用这些API来编写一个自动化脚本,步骤如下:

  1. 通过ADB连接一台安卓手机
  2. 安装应用APK
  3. 运行应用并截图
  4. 模拟用户输入(点击、滑动、按键)
  5. 卸载应用
from airtest.core.api import *

# connect an android phone with adb
init_device("Android")
# or use connect_device api
# connect_device("Android:///")

install("path/to/your/apk")
start_app("package_name_of_your_apk")
touch(Template("image_of_a_button.png"))
swipe(Template("slide_start.png"), Template("slide_end.png"))
assert_exists(Template("success.png"))
keyevent("BACK")
home()
uninstall("package_name_of_your_apk")

更多API和使用方法,请参考完整的 Airtest Python API reference ,或者直接看看 API code

连接设备

使用 connect_device 来连接任意Android/iOS设备或者Windows窗口。

connect_device("platform://host:port/uuid?param=value&param2=value2")
  • platform: Android/iOS/Windows…
  • host: Android平台是adb host,iOS下是iproxy host,其他平台请留空
  • port: Android下是adb port,iOS下填写iproxy port,其他平台请留空
  • uuid: 目标设备的uuid,例如Android下是序列号,windows下是窗口句柄,iOS是uuid
  • param: 设备初始化的配置字段,例如cap_method/ori_method/…
  • value: 设备初始化字段的值。

查看 connect_devce 获取更多信息。

连接安卓设备

  1. 通过usb将手机与电脑相连
  2. 命令行输入 adb devices 命令,确保手机连接状态是 device
  3. 在Airtest中连接设备
  4. 如果你连接了多个设备,或者有远程设备,那么使用参数来指定要连接的设备
# connect an android phone with adb
init_device("Android")

# or use connect_device api with default params
connect_device("android:///")

# connect a remote device using custom params
connect_device("android://adbhost:adbport/1234566?cap_method=javacap&touch_method=adb")

连接iOS设备

根据 iOS-Tagent 的操作指引来配置环境。

# connect a local ios device
connect_device("ios:///")

 

Airtest截取的单张图片的相关选项

AirtestIDE直接修改截取的图片

AirtestIDE中,可以通过双击脚本中的图片,调出图像设置菜单:

image

可以直接通过修改菜单中的值,来自动改变这张图像的相关属性。

脚本代码修改属性

假如直接使用文本编辑器打开我们所编辑的Airtest脚本目录里的同名py文件,可以看到,每张图片都由类似这样的语句组成:

Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264))

#截取的图片名, record_pos记录坐标, resolution 分辨率

直接在里面加入需要修改的值即可:

Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6, target_pos=5, rgb=False)

图像识别阈值threshold(浮点类型)

threshold是用来判定一张图片识别是否成功的阈值,例如一张图片识别到的匹配度是0.65,而我们设置的threshold为0.7的话,Airtest会认为匹配失败,从而进行下一次匹配。

通常来说,threshold设置得越高,图像识别的精度越高,但成功率也会有所降低,请根据自己的实际情况酌情设置。

取值范围为0~1之间,[0, 1],默认值是0.7

如果希望修改全局所有图片的图像识别阈值THRESHOLD,可以查看下文介绍。

图像点击位置target_pos(整型)

当识别出一张图像后,Airtest将会默认去点击图像的正中心位置,有时我们希望它识别出图片后点击其他位置,可以通过修改target_pos属性来实现。

例如:

image

在上图中,我们希望点击中间选项的“升级”按钮,不希望点到别的选项去,而只截出升级按钮不能满足我们的需求。

此时我们可以考虑将截图范围扩大到红色虚线框选的区域,截图后将这张方形图片视为一个九宫格,方框上的每一个暗色红点都代表一个数字,将希望被点击的位置设置为target_pos的值即可。在这个例子中,我们可以让截图区域的底部正好放在“升级”按钮上,然后设置target_pos=8即可正好点击到该按钮。

target_pos取值范围是1~9,[1, 9],且必须为整数,默认值是5(图像正中心)。

切换彩色与灰度识别rgb

在识别图像时,Airtest会先将图像转为灰度图再进行识别。因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest将认为它们都是相同内容。

通过勾选rgb选项,或在代码中加入rgb=True,可以强制指定使用彩色图像进行识别。

2. 脚本全局设置

Airtest的一些全局设置

Airtest的设置模块详见文档:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.settings.html?highlight=settings#airtest.core.settings.Settings

1)log内容的设置:LOGFILE、LOGDIR

LOGFILE 用于自定义记录log内容的txt文档的名称;LOGDIR 用于自定义log内容的保存路径,示例如下:

from airtest.core.settings import Settings as ST
from airtest.core.helper import set_logdir

ST.LOG_FILE = "log123.txt"
set_logdir(r'D:\test\1234.air\logs')

auto_setup(__file__)

# 此处省略N条用例脚本

image

2)图像识别算法的设置:CVSTRATEGY

CVSTRATEGY 用于设置Airtest的图像识别算法,默认情况下 CVSTRATEGY = ["surf", "tpl", "brisk"] ,每次查找图片的时候,airtest就会按照这个设置好的算法顺序去执行,直到找出一个符合设定阈值的识别结果,或者是一直按照这个算法顺序循环查找,直到超时。

我们可以自定义Airtest的图像识别算法,示例如下:

from airtest.core.settings import Settings as ST

ST.CVSTRATEGY = ["tpl", "sift","brisk"]

airtest.core.settings里,提供了部分全局默认属性,其中我们列举出几个常见属性和它们的默认值:

  • RESIZE_METHOD = staticmethod(cocos_min_strategy)
  • THRESHOLD = 0.7 # [0, 1]
  • THRESHOLD_STRICT = 0.7 # [0, 1]
  • OPDELAY = 0.1
  • FIND_TIMEOUT = 20
  • FIND_TIMEOUT_TMP = 3
  • PROJECT_ROOT = os.environ.get("PROJECT_ROOT", "") # for using other script

全局属性设置方法

想要改变上述的settings里的值,只需要在脚本中这样写:

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))

全局设置中属性值介绍

RESIZE_METHOD

在使用不同分辨率的设备进行图像识别时,可能会导致识别成功率不佳,因此Airtest提供了默认的分辨率适配规则(使用的是Cocos引擎的默认缩放规则),代码在这里

想要提高2d游戏的识别精度,最好的办法就是明确指定你的游戏的分辨率适配规则,例如,直接在.air脚本文件的开头这样写:

from airtest.core.api import *

def custom_resize_method(w, h, sch_resolution, src_resolution):
    return int(w), int(h)

# 替换默认的RESIZE_METHOD
ST.RESIZE_METHOD = custom_resize_method

上面的代码指定了一个自定义的缩放规则:直接return原来的值,不管屏幕分辨率,所有UI都不进行缩放(有的游戏就是这种策略)。

这里的RESIZE_METHOD,即我们定义的custom_resize_method使用的输入参数为:

  • w, h # 录制下来的UI图片的宽高
  • sch_resolution # 录制时的屏幕分辨率
  • src_resolution # 回放时的屏幕分辨率

输出为:
- 回放时的UI图片宽高

若要自定义你的RESIZE_METHOD,只需要知道你测试的游戏的缩放规则,然后在custom_resize_method中用代码实现即可。这样做,能够大大提升不同分辨率设备下的图像识别成功率。

THRESHOLD

THRESHOLD在上文中已经提到过,是图像识别的阈值,我们除了能够设置单张图片的识别THRESHOLD值以外,还可以设置全局的THRESHOLD,让每一张图片都默认生效。

而设置中还有一个THRESHOLD_STRICT,这是一个更加严格的阈值设定,只用于assert_exists(图片)接口。

OPDELAY

在我们的脚本中,每一个步骤的操作之间都会有一小段时间间隔,默认用OPDELAY进行设定。

OPDELAY默认值为0.1,即每一步操作后等待0.1秒,将它适当设置得大一些,可以在每次操作后停顿一小段时间,避免过快进行下一个操作导致不能成功的问题。

FIND_TIMEOUT

在每次进行图像查找时,如果一次查找不成功,将会再次进行截图-查找的循环,直到超时才会停下来,超时时长为FIND_TIMEOUT,默认20秒。

同时,我们还提供了一个FIND_TIMEOUT_TMP,默认只有3秒。在不同的截图接口中分别使用了这2个值:

使用了FIND_TIMEOUT作为图片查找超时时长的接口为:

  • touch
  • double_click
  • swipe(swipe支持从第一张图片滑动到第二张图片,此处只有第一张图片使用了FIND_TIMEOUT
  • wait(wait支持直接传入一个timeout参数,若没有指定timeout,默认使用FIND_TIMEOUT作为超时时长)
  • assert_exists

在另外一些对查找图片的要求较低的接口中,使用了时长较短的FIND_TIMEOUT_TMP

  • swipe(如果第二个参数传入了图片,那么它将使用较短的查找时间)
  • exists
  • assert_not_exists

如果想要修改全局的图片查找超时时长,请务必注意需要修改的是哪个值。

PROJECT_ROOT

可以通过设定一个默认项目根目录PROJECT_ROOT,让使用using接口时能够在当前根目录下寻找别的子脚本,无需填写完整路径,让脚本之间相互调用使用更加方便。

例如,我们建立一个名为test1.air的脚本,实际路径为/User/test/project/test1.air

from airtest.core.api import *

def test():
    touch("tmp.png")

在同一目录下另外一个main.air脚本可以这样引用到它里面的test

from airtest.core.api import *

ST.PROJECT_ROOT = "/User/test/project"
using("test1.air")
from test1 import test

图像识别算法选择CVSTRATEGY

在Airtest中,提供了多种不同的图像识别算法,方法名列表有:["tpl", "kaze", "brisk", "akaze", "orb", "sift", "surf", "brief"]。

具体每个算法的识别效果、内存占用等评估数据,可以参考Airtest/benchmark文档,在实际使用中,由于使用场景、图片分辨率大小以及手机类型的多寡不同,每个算法具体的表现优劣情况也有所不同,因此大家可以用自己的使用案例来进行算法的测试,选择更合适的算法。

在Airtest脚本中,使用以下代码来设定脚本中的图像匹配算法:

from airtest.core.settings import Settings as ST
# 脚本运行时将按照此算法顺序识别,直到“找到符合设定阈值的识别结果”或“识别超时”:
ST.CVSTRATEGY = ["surf", "tpl"]

 

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值