Airtest学习(一)

简单了解

工具下载安装

连接设备

  • Android
  • Windows窗口
  • 模拟器连接
  • 无线连接
  • IOS

简单熟悉

  • airtest工具使用
  • 基于图像识别(airtest)
  • 基于UI控件搜索(poco)
  • Selenium Window

语法与使用

  • touch
  • swipe
  • text
  • keyevent
  • 断言

其他了解

  • 使用本地python环境运行脚本
  • 命令参数
  • 怎么样不通过IDE使用命令行去生成和导出报告
  • airtest使用PYTHON代码生成报告

 

 

 

一:简单了解

Airtest:是一个跨平台的、基于图像识别的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS。

Poco:是一款基于UI控件识别的自动化测试框架,目前支持Unity3D/cocos2dx-*/Android原生app/iOS原生app/微信小程序,也可以在其他引擎中自行接入poco-sdk来使用。

AirtestIDE:跨平台的UI自动化测试编辑器,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写AirtestPoco代码。

 

二:工具下载安装

Airtest的官网:http://airtest.netease.com/

目前有Windows和Mac两个版本的客户端

下载最新版本

Airtest学习(一)_第1张图片

下载其他版本

Airtest学习(一)_第2张图片

 

安装python环境,最好是3.6的,3.8还不支持。

帮助文档:http://airtest.netease.com/docs/docs_AirtestIDE-zh_CN/index.html

 

 

三:连接设备

(1)Android

refresh ADB刷新状态,点击Connect初始化;如果没有显示出设备,用restart ADB重启看看

Airtest学习(一)_第3张图片

如果不行看https://airtest.doc.io.netease.com/IDEdocs/device_connection/2_android_faq/

 

(2)Windows窗口

Airtest学习(一)_第4张图片

方法一:嵌入式

点击Windows-框选游戏窗口,选中被测程序即可,也可以拖出去

注意:在选择状态下,点击键盘的 esc 按键、鼠标右键均可退出状态

方法二:非嵌入式

Airtest学习(一)_第5张图片

如果不行看https://airtest.doc.io.netease.com/IDEdocs/device_connection/5_windows_connection/#id2

 

(3)模拟器连接

如夜神模拟器,点击连接能看到多了一条数据

Airtest学习(一)_第6张图片

点击connect后面的下拉箭头,选择Use javacap,再点击connect

在部分版本的模拟器上,可能勾选了 use javacap 后依然连接失败,此时可以尝试再勾选 use adb orientation 选项后再重新连接即可

Airtest学习(一)_第7张图片

 

在搞夜神模拟器时候,上面的操作报错了

Airtest学习(一)_第8张图片

检查了sdk的adb版本

Airtest学习(一)_第9张图片

检查了夜神模拟器adb版本

Airtest学习(一)_第10张图片

解决方法:

1:将sdk安装目录下的platform-tools中的adb.exe替换夜神中的adb.exe,然后在将sdk中的adb复制一份改名为nox_adb.exe,放入夜神的Nox的bin目录下

2:将airtest目录里的yosemite.apk直接安装到夜神中

当然懒的搞直接换模拟器也行,木木不错

 

 

(4)无线连接

在cmd输入adb tcpip 5555

在这输入手机的那个wifi的ip(手机的wifi和电脑的一样),然后上面就出现设备了,点击连接即可

 

(5)IOS

要有安装了Xcode的Mac电脑,可惜我没有,跳过。。。

https://airtest.doc.io.netease.com/IDEdocs/device_connection/4_ios_connection/

 

 

四:简单熟悉

(1)工具使用

1)实时坐标、相对坐标

两个都勾选就是开了相对坐标(格式是(0, 0) 到 (1, 1)),以避免跨分辨率的操作点超出屏幕的问题

 

2)手机屏幕显示效果

数字越大,清晰度越高。默认为800

 

3)兼容模式

 

4)代码补全

用本地的会更好

 

5)安卓小助手

连接设备后

Airtest学习(一)_第11张图片

  • 安卓apk

Airtest学习(一)_第12张图片

  • 操作包

Airtest学习(一)_第13张图片

  • 切换输入法(Yosemite和本地输入法)

Airtest学习(一)_第14张图片

  •  调节手机音量(一键静音,或者加大、减小音量)

  • 打开网址/输入内容

Airtest学习(一)_第15张图片

 

 

6)生成报告

脚本运行完毕后,点击查看报告按钮(快捷键Ctrl+L)

 

 

 

 

(2)基于图像识别(airtest)

自动录制脚本,点击AirtestIDE左侧的Airtest辅助窗上的录制按钮,不过这种录制生成的图片不精准,可以自己选择那些按钮,拖动生成自己想要的

Airtest学习(一)_第16张图片

touch()通过截图来 点击某个位置(截图后图片会存储在当前跟目录下)

wait ()等待某个指定的图片元素出现

swipe() 从一个位置滑动到另外一个位置

exists()执行之前,提前判断对应图片是否存在

text ()调用输入法输入指定内容

keyevent ()输入某个系统按钮键的操作,如(HOME/BACK/MENU等)

snapshot ()当前画面截图

sleep()延迟时间(s),也可以用python内的“time.sleep(10)”

assert_exists()来断言一张图片存在当前画面中

assert_not_exists()来断言不存在于当前画面中

assert_equal()断言传入的两个值相等

assert_not_equal()断言传入的两个值不相等

 

(2)基于UI控件搜索(poco)

目前Poco直接支持Unity3d、Cocos2d、白鹭引擎等多种游戏引擎,以及Android/iOS原生App。

如果是Android/iOS原生应用,是即插即用的,无需接入SDK。但由于游戏引擎使用OpenGL等图形接口直接渲染,而没有使用Android原生的UI系统,我们需要与游戏的Runtime进行通信获取整个UI结构。

sdk接入需要程序帮忙搞,这里我使用原生应用来学习

Airtest学习(一)_第17张图片

需要安装这2个应用

Airtest学习(一)_第18张图片

 

出现下方两行代码,然后就可以在UI渲染树看到UI的结构了

#安卓实例
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
#poco实例化
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)

但是我这是没有的

Airtest学习(一)_第19张图片

(1)从左到右分别是锁定,定位,录制

Airtest学习(一)_第20张图片

(2)当前页面的UI层级

我这是原生应用,如果是其他的要接入SDK:https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integration.html

安装poco:(可以通过pip list看安装了什么版本)

然后报错了,输入第二个命令更新pip版本后,再试一次,不过后面还是失败,就换了个地址

Airtest学习(一)_第21张图片

pip3 install pocoui -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

 

但是我发现UI渲染树还是没有,原因是我用的是oppo手机,没有弹出安装PocoService

解决方法:在开发者选项->直接拉到最后->禁止权限监控,会立刻弹出PocoService,安装后就会出现渲染树了。

Airtest学习(一)_第22张图片

Airtest学习(一)_第23张图片

 

 

 

(3)Selenium Window

比如谷歌浏览器(属性可以看路径,找不到文件夹是因为路径隐藏了,开了就行)

Airtest学习(一)_第24张图片

这个忽略,有缘再见

 

 

 

五:语法与使用

(1)touch

Airtest学习(一)_第25张图片

 

(2)swipe

Airtest学习(一)_第26张图片

Airtest学习(一)_第27张图片

Airtest学习(一)_第28张图片

Airtest学习(一)_第29张图片

Airtest学习(一)_第30张图片

 

(3)text

Airtest学习(一)_第31张图片

 

(4)keyevent

Airtest学习(一)_第32张图片

Airtest学习(一)_第33张图片

 

 

(5)断言

Airtest学习(一)_第34张图片

# assert_exists和assert_not_exists接口的超时时间和阙值
# 这2接口查找图片的超时时间和阙值都是全局变量,timeout为20s,threasold为0.7
# 所以脚本只有在20s内找到置信度>0.7的结果,断言才会成功

如果是图片,双击可以查看识别精度

Airtest学习(一)_第35张图片

 

 

 

六:其他了解

注:学习的时候看到路径都是/,但我用\也可以

(1)使用本地python环境运行脚本

本地没有安装python环境,或是没有安装 airtest 与 poco,也可以通过airtest的命令行运行

Airtest学习(一)_第36张图片

也可以使用本地的python,但是这样也是无法脱离airtest的使用

通过添加PYTHONPATH设置,可以使用本地的python.exe来运行脚本

Airtest学习(一)_第37张图片

 

想使用其他python第三方库,使用在本地python环境中安装airtest和pocoui,然后用命令行运行脚本更好

#使用 pip 安装Airtest框架 
pip install airtest
#使用 pip 安装poco框架 
pip install pocoui

Pip指令运行失败
国内用户请在pip install 指令后面加上 -i https://pypi.tuna.tsinghua.edu.cn/simple后重试
参考:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
环境部署完成后,我们就能够脱离AirtestIDE,在不同的宿主机器和被测平台上运行脚本了

报错,adb版本不一致(通过adb version查),airtest的版本是40,于是我将41的覆盖掉它(airtest\core\android\static\adb\windows\)

Airtest学习(一)_第38张图片

但是又很尴尬,这样又导致,在IDE运行脚本的时候,不显示模拟器,而且会报错,于是就还是保留40版本,将40的改名字nox_adb.exe,覆盖夜神里面的,虽然会报错,但是能用

在命令行运行又报错,这里是没有识别图片,纳尼,我文件夹有该图片呀

Airtest学习(一)_第39张图片

后面在命令行带了参数?cap_method=JAVACAP^&^&ori_method=ADBORI^&^&touch_method=MINITOUCH(注意:特殊字符没转义,命令行被截断)

参考:https://airtest.doc.io.netease.com/IDEdocs/run_script/1_useCommand_runScript/#id4

Airtest学习(一)_第40张图片

运行的时候还是会识别不到图片,可能是设备太卡了,于是将wait的时间设置到60秒,然后就可以了

 

 

 

(2)命令参数(更多参考:https://airtest.readthedocs.io/zh_CN/latest/README_MORE.html#running-air-from-cli)

1)--device,指定连接的被测设备

# 什么都不填写,会默认取当前连接中的第一台手机
Android:///
# 连接本机默认端口连的一台设备号为79d03fa的手机
Android://127.0.0.1:5037/79d03fa
android://127.0.0.1:5037/127.0.0.1:62001      #连接夜神模拟器
# 连接一个Windows窗口,窗口句柄为123456
Windows:///123456
# 连接一个Windows窗口,窗口名称匹配某个正则表达式
Windows:///?title_re=Unity.*
# 连接iOS手机
iOS:///127.0.0.1:8100

参考:https://www.cnblogs.com/CincentHuang/p/11766026.html

 

2)--log,指定 log 内容和截图存放的目录

1:没传入参数--log
不保存 log 内容和截图
命令行会提示do not save log


2:传入的参数为--log log/
生成的 log 内容放到当前命令行执行目录下的 log 目录里面


3:指定目录
log 内容与截图将会放在指定目录里
--log E:/aritest/log

eg:
夜神:
airtest run C:\Users\Administrator\Desktop\chyairtest.air --device android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP^&^&ori_method=ADBORI^&^&touch_method=MINITOUCH --log F:\Airtest\log


android设备:
airtest run C:\Users\Administrator\Desktop\chyairtest.air --device android://127.0.0.1:5037/FIFIMFFEPVAIWCU8?cap_method=MINICAP_STREAM^&^&ori_method=MINICAPORI^&^&touch_method=MINITOUCH --log F:\Airtest\log --recording

注意:在这里,--log log/,我刚开始以为是我脚本文件的目录下,其实应该是C:\Users\Administrator下的log目录(C:\Users\Administrator>脚本命令)

Airtest学习(一)_第41张图片

 

3)--recording,运行脚本时进行录屏操作

以 MP4 格式保存在 log 内容所在的目录里面

用夜神的时候录制不了,要用android设备,于是跑的时候又报错了,点击事件没生效

Airtest学习(一)_第42张图片

这个问题是我使用了py2,后面换了py3就可以了(2和3的环境变量可以一起配,在前面的先使用)

Airtest学习(一)_第43张图片

 

4)生成报告(更多参数:https://airtest.readthedocs.io/zh_CN/latest/README_MORE.html#generate-html-report)

通过airtest report + 脚本文件路径指令,下面是可用参数:

  • --log_root,指定log内容和截图文件所在的目录

  • --outfile,指定生成报告的目录

  • --lang,指定报告语言,可以是中文/英文

  • --export,导出一个包含所有资源的报告文件

  • --static_root,指定静态资源文件的路径

注意:如果使用report 没有传入参数,会去脚本文件所在目录下寻找log/log.txt生成html报告,如果不存在该目录会报错

Airtest学习(一)_第44张图片

成功生成报告(在运行生成报告命令前,要运行一次脚本)

--log_root:指定log和图片目录
--outfile:指定输出报告的目录
--lang:指定语言,默认是英文(zh中文en英文)

C:\Users\Administrator>airtest report C:\Users\Administrator\Desktop\chyairtest.air --log_root F:\Airtest\log --outfile F:\Airtest\log\log.html --lang zh
[07:38:28][INFO] F:\Airtest\log\log.html

 

读取报告中静态资源文件和图片文件

-- export:不使用该参数,是绝对路径来访问里面的图片文件;同时HTML报告中访问的静态css与js资源文件,也是硬盘上的绝对路径(默认在airtest的安装目录下的report文件夹里)

注意:使用了export参数,outfile参数会失效

airtest report C:\Users\Administrator\Desktop\chyairtest.air --log_root F:\Airtest\log --lang zh --export F:\Airtest\log\cs\

--static_root

# 每次导出报告,都有static目录。一般来说,除非报告的样式做了某些更新,否则这些静态资源文件都是固定不变的。

# 将这些资源文件部署到静态资源文件服务器上,用例如 https://host:port/static/css/ 的路径来访问它。然后在生成报告时,将这个部署出来的服务器地址作为 --static_root的参数传过去:
--static_root https://host:port,可以避免导出报告时重复拷贝这些资源文件造成的磁盘空间占用

 

注意:

1:使用了POCO语句的报告,在你的报告命令行最末尾添加指令--plugin poco.utils.airtest.report

2:使用SELENIUM插件的报告指令,加入--plugin airtest_selenium.report

 

 

(3)怎么样不通过IDE使用命令行去生成和导出报告

参考:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.report.report.html#airtest.report.report.simple_report

可以借助simple_report() 接口或者 LogToHtml() 类来实现

1) simple_report生成报告(在本地看)

  • filepath,脚本文件的路径,可以直接传入变量 __file__(应该是表示使用默认的参数意思吧)
  • logpath ,log内容所在路径,如为 True ,则默认去当前脚本所在路径找log内容
  • logfile ,log.txt的文件路径
  • output ,报告的到处路径,必须以 .html 结尾

简化版的生成报告的接口,如果不指定参数,该接口会使用默认的参数生成1份HTML格式的报告,output='log.html' 表示在当前脚本路径下生成名为 log.html 的airtest报告

from airtest.report.report import simple_report
simple_report(__file__)

Airtest学习(一)_第45张图片

指定output 参数,则按指定路径生成报告

simple_report(__file__,output="F:\Airtest\log\log.html")

如果生成报告的路径和脚本的路径不同,比如我脚本在C盘,报告想放F盘,就会报下面这个错,虽然没影响

备注:刚刚开始学习的时候,有点懵logpath和logfile这两个参数(这2个参数好像没啥用),我在我脚本下新建了log目录,运行脚本后没看到log.txt生成,那报告是通过哪里的log.txt生成的,我在airtest设置看到log的路径(临时文件)

后面问了大佬,我才知道,我代码中的auto_setup(__file__),使用了默认的参数,不生成log文件

可以使用auto_setup(__file__,logdir=True),就能在脚本目录下的log目录生成log文件这些,如下:

  • basedir:设置当前脚本的路径,也可以直接传入__file__变量
  • logdir:脚本运行时log保存路径,如果设置是True,则保存在/log目录中

刚开始我以为我运行运行后生成了log,我就可以通过logpath和logfile去生成报告(不需要再次运行脚本代码),但是发现报告要不是空的就是图片显示不了,于是我就不纠结了

直接运行脚本,在脚本后使用simple_report(__file__,logpath=True,output="C:\\Users\Administrator\Desktop\chyairtest.air\log.html")即可

 

2)ogToHtml导出报告(通过脚本的形式)

from airtest.report.report import LogToHtml
脚本内容(省略)

# 脚本路径/log文件路径/log.txt路径/存放报告路径/语言/插件
chyR = LogToHtml(script_root="C:\\Users\Administrator\Desktop\chyairtest.air", log_root="C:\\Users\Administrator\Desktop\chyairtest.air\log",logfile="C:\\Users\Administrator\Desktop\chyairtest.air\log\log.txt",export_dir="F:\\Airtest\log",lang='zh',plugins=None)
chyR.report()

Airtest学习(一)_第46张图片

3)在运行脚本的时候,不免会出现报错,导致执行不下去,然后无法生成报告,可以这样

# try:
#     用例...
#     会导致失败的语句
#     用例...
# finally:
#     报告语句

注:在airtest要注意缩进,要不报错:expected an indented block

 

 

 

(4)airtest使用PYTHON代码生成报告

由于Airtest是python第三方库,所以当然也可以简单地调用接口来生成报告,首先,我们需要先新建脚本-选择纯.py文件,然后在创建时需要勾选生成log

Airtest学习(一)_第47张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(自动化测试,airtest)