Skip to content

一、在AirtestIDE编写脚本

1. 准备工作

1)在电脑上安装好AirtestIDE

本文主要讲述如何在AirtstIDE的脚本编辑窗口编写我们的自动化测试脚本,所以我们需要提前在电脑上安装好AirtestIDE,并且能正常打开和使用,如在安装过程遇到问题,可以到 闪退与报错 章节查看对应措施。

2)学习一些Python基础

AirtestIDE内置了 Airtest和Poco 2个自动化测试框架,它们都是Python第三方库,因此同学们在进行脚本的编写时,需要有 一定的Python基础 。若对 Python 语法不熟悉,网络上有不少非常优秀的Python教程可以学习,例如 廖雪峰的Python新手教程

在脚本编写过程中,可以根据需求在里面混合使用AirtestPoco ,也可以自由加入自己想用的其他python第三方库完成更加强大的功能。

但是请注意,可以 混用 AirtestPoco 代码,不代表是在同一条语句中混合使用Airtest的图片与Poco的语句,请各位在编写时注意每个库自己的API和语法。

在开始你的脚本编写工作前,可以先读一读官网提供的 教程 ,可以帮助你更快地上手。

2. 在AirtestIDE上新建脚本

1)新建 .air 脚本

打开你的IDE,点击左上角的 文件--新建脚本--.air Airtest项目 ,即可新建一个.air脚本。

image

当你的.air脚本新建成功时,就能看到默认的初始化代码:

image

我们非常建议新手同学新建 .air 脚本,而不是 .py 纯Python脚本 ,因为在IDE中运行 .air 脚本时,会自动帮我们或者设备窗口当前连接的设备,并且自动保存log内容,方便我们后续一键生成可视化的测试报告。但新建的 .py 纯Python脚本则不会自动帮我们处理这些,我们需要一项项在新建纯Python脚本时配置好,或者手动在脚本里面编写好,最终才能让脚本按照我们的期望跑起来并生成测试报告。

.air 脚本的初始化代码帮助我们从api中引入了airtest的各个接口以及自动初始化设备。实际上,.air 脚本是一个文件夹,里面存放了与 .air 同名的 .py 文件,以及相关的图片文件。在运行脚本时,实际上依然使用了python调用了里面的 .py文件,因为Airtest本质上是一个Python的第三方库。

2)新建 .py 纯Python脚本

点击左上角的 文件--新建脚本--.py 纯Python (高级用户)

image

随后会弹出python文件的设置窗口:

image

里面的配置项有:

  • Save Path: 文件保存路径,必填项,选择好路径后才能继续配置其他选项
  • Log Directory: 脚本运行时的log保存路径,默认为.py文件所在目录下的 log/ 目录
  • Devices: 可以选择自动使用当前已连接的手机设备对devices参数进行初始化,也可以以后再填写
  • Project Root: 项目的父目录,方便未来使用 using 语句引入同一父目录的其他子文件夹

在配置完所需要的选项后,点击ok按钮,将会自动以刚才的配置内容新建一份模板python文件,接下来只需要像编写一个普通 py 文件那样来编写脚本就可以了。当你的.py脚本新建成功时,也同样可以看到设置的一些初始化代码:

image

上图中这段初始化代码的意思是说,当使用 python xxx.py 来运行本文件,不带任何命令行参数时,则自动使用 auto_setup 这个接口来对airtest相关的参数进行初始化。这样只需要在写py脚本时,填写好期望的参数就能直接用 python xx.py 指令来运行脚本。而原先的 airtest run xx.air --devices xx 也不受影响,只要脚本检测到传入了命令行参数,就依然优先使用命令行参数来初始化airtest。

3. 在AirtestIDE编写脚本

这里我们将以在AirtestIDE上新建 .air 脚本来演示如何编写下述各个框架的自动化脚本,下述演示假设默认已经连接好了待测设备

1)编写Airtest脚本

① Airtest脚本的初始化

上文我们有提到,在IDE新建 .air 脚本时,会自动帮我们插入初始化代码:

__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__)

这段代码已经帮我们引入了airtest 的核心API,并且 auto_setup 会帮我们处理一些脚本初始化的内容以及连接设备窗口当前连接的设备,所以一些常用的Airtest接口我们就可以直接开始编写了。

② Airtest的录制脚本功能

不会编写脚本的小白选手,可以使用Airtest辅助窗提供的录制脚本功能,来录制我们期望的操作:

airtest_auto_record

③ Airtest辅助窗的其余功能

录制的脚本并不完全是正确/最优的脚本 ,有时候录制脚本自动生成的截图,并不能很好地回放出来我们想要的操作,这时候我们可以借助Airtest辅助窗的其它快捷键,帮助我们实现更加准确和更加丰富的脚本:

airtest_manual_record

需要注意的是,Airtest辅助窗的API快捷键,只有在IDE的设备窗口连接上设备之后,才是可以使用状态,否是都是置灰的不可用状态 (关于如何在AirtestIDE连接我们的待测设备,可以参考 设备连接章节 的内容,这里不再重复说明)。另外这里仅仅提供了部分的核心API的快捷键:

  • 点击:touch
  • 滑动:swipe
  • 等待截图出现:wait
  • 存在某个截图:exists
  • 文本输入:text
  • 关键词操作:keyevent
  • 截图:snapshot
  • 等待:sleep
  • 断言:assert_existsassert_not_existsassert_equalassert_not_equal

在使用Airtest辅助窗给出的API快捷键之前,我们还可以将鼠标移动到按钮上即可看到每个接口的常用参数与返回值信息,非常方便:

image

④ Airtest API的官方文档

当我们需要实现更多功能、编写更多复杂的Airtest脚本时,我们可以到 Airtest API 的官方文档查询更多我们想要的接口:

image-20210928175956489

2)编写Poco脚本

① Poco脚本的初始化

在IDE上编写poco脚本,我们首先要在IDE的Poco辅助窗内选择对应的poco模式,等待刷出待测设备/待测应用的控件树,然后借助这颗树的内容来找到我们的目标控件,并对目标控件进行定位和操作。

其中,在Poco辅助窗内选择对应的poco模式之后,IDE的脚本编辑窗口上方会出现亮黄色的提示,让我们选择是否插入Poco的初始化脚本,我们选择 Yes 即可自动插入poco的初始化语句:

image-20210929110410146

image-20210929113545659

这里选择Android模式,表示我们需要展示Android原生的控件树,或者是Android原生应用的控件树。其它模式分别对应了不同项目的poco模式:

image-20210929111207031

② 未成功刷出UI树的解决办法

如果在辅助窗选择对应的模式后,等待几秒仍没有成功刷出UI树,可以检查下述问题:

  • 明确待测应用是否为Android/iOS原生应用,非原生应用需接入 pocosdk 才能查看UI树,比如各种引擎渲染的游戏项目就需要接入
  • 检查手机上是否已经自动安装上poco初始化相关的2个apk(pocoservice-debug.apkpocoservice-debug-androidTest.apk),未安装要手动安装上
  • 安装输入法 Yosemite 并设为默认输入法
  • 部分厂商的手机需要额外的设置,请参考设备连接章节的内容

注意

需要注意的,1.2.12版本的IDE ,仅需要安装 1个pocoservice.apk 即可,即 pocoui1.0.84 版本。安装此版本的pocoservice.apk之后,运行环境里面的pocoui也需要更到最新的1.0.84版本!

③ Poco脚本的录制功能

刷新出控件树之后,我们可以利用控件树手动编写脚本,还可以使用辅助窗提供的录制功能,帮助我们一键录制自动化脚本(此处演示的是unity游戏应用的脚本录制,该游戏项目已提前接入了pocosdk):

poco_auto_record

④ Poco控件的检索功能

与Airtest的录制功能相似,Poco录制的脚本也不一定是最优脚本,我们还可以利用辅助窗提供的控件检索功能,来精确定位到每一个控件,查看它的详细属性,依此来编写控件的定位和操作脚本:

poco_manual_record

⑤ Poco API的官方文档

当我们想查找更多关于poco的API时,我们可以到 Poco API 的官网文档,查询更多我们想要的接口,以及各种引擎接入 pocosdk 的教程:

image-20210929142211181

3)编写airtest-selenium脚本

① airtest-selenium的初始化

在设备连接章节中,我们在 浏览器连接 一文中详细介绍了如何在AirtestIDE连接chrome浏览器,也介绍了在selenium window中,有一个按钮可以帮助我们快速插入初始化代码并打开1个chrome浏览器:

image-20210929143104323

image-20210929143151467

这段代码创建了airtest-selenium的 WebChrome 实例,运行完这段初始化代码会打开一个chrome浏览器。

② 录制airtest-selenium脚本

使用selenium window的初始化按钮打开1个chrome浏览器之后,我们可以使用录制功能帮助我们生成selenium脚本:

selenium_aoto

③ selenium window的辅助功能

或者使用辅助窗的快捷键,帮助我们编写airtest-selenium/selenium脚本:

selenium_manul

4. 在AirtestIDE编写脚本的常见问题

1)文件异常恢复

如果突然有一天打开脚本,发现脚本全都变成了红色的点(因未知错误导致的脚本异常):

image-20210929153346255

我们可以在脚本编辑窗里,右键单击脚本名称,然后选择 文件异常恢复 ,看能不能尝试将脚本恢复成正常状态。

image-20210929153637775

2)清理多余图片

在IDE编写Airtest的图片脚本时,我们可能反复截取某一个目标,直到能达到我们的脚本要求,但在脚本编辑窗反复截图、删除截图,截图文件是每次都会保存到我们的 .air 脚本文件夹里,有些脚本里面不需要的图,我们可以右键单击脚本名称,选择 清除多余图片 ,可以帮助我们一键清理掉我们脚本里面已经没有用到的截图:

image-20210929154038226

这样就不需要我们在文件夹里一张张去辨别哪些是脚本已经不用的截图了。

3)快速注释与取消注释

在IDE的脚本编辑窗口,选中1行或者多行脚本,按下 ctrl+/ 键即可快速注释脚本。

同理,选中1行或者多行已经注释的脚本,再次按下 ctrl+/ 键即可快速取消注释。

4)快速缩进与取消缩进

在IDE的脚本编辑窗口,选中1行或者多行脚本,按下 Tab 键即可快速实现缩进,需要多次缩进则按下多次 Tab

选中1行或者多行脚本,按下 shift+Tab 键即可快速实现取消缩进,需要取消多个缩进,则多次按下 shift+Tab 键即可。

5)缩进异常/不能对代码进行缩进

有时候在IDE编写脚本时,同学们可能感觉脚本编辑窗的缩进非常乱,不方便查看;或者在使用 tab 键进行缩进时发现缩进乱跳的情况,其实是因为脚本编辑窗口过小,脚本一行显示不完,换行显示时不够规范导致的。

同学们可以将代码复制到 pycharm 或者 note++ 之类的编辑器上面,查看/修改缩进,再粘贴回IDE运行。后面我们也会尝试改建编辑窗的缩进显示。

6)脚本自动保存与缓存文件找回

在脚本编写工作中,我们十分推荐各位尽可能地利用一些版本管理软件,对编写的脚本进行管理,这样能避免很多脚本的丢失与多人协作的问题。

在使用AirtestIDE编写脚本时,我们将会每隔30秒对当前编辑窗口的脚本进行一次自动保存工作,避免遗忘保存导致的脚本遗失问题。

然而在一些极端情况下(电脑蓝屏、死机等),还有可能出现脚本编辑框显示错乱,导致原先的脚本丢失的问题。因此我们新增了一个脚本缓存找回功能,每当 手动选择保存 或是 运行脚本 时,都认为当前文件是一个完好的脚本文件,因此会自动在系统缓存目录下另存一份脚本的纯文本内容。如果遇到了异常情况,需要找回以前保存过的脚本的话,可以在脚本标题上点击鼠标右键:

image-20210929153637775

随后的弹窗中,有3个可选项:

image-20210929172543228

最左边的按钮是一键自动恢复,能将最近一次的缓存文件内容恢复到当前编辑窗口中。中间的按钮是打开缓存文件夹,打开后将会看到一些纯文本文件,命名规则是将脚本文件的路径中的 :\/ 等符号替换成% ,最后以时间戳进行结尾,可以自行找到编辑中的文件名对应的缓存文件后,用文本编辑器打开,就可以看到自动保存的内容了。

7)MacOS的脚本丢失

第一次打开AirtestIDE时,会默认帮忙在系统temp目录下新建一个空脚本,方便大家熟悉软件功能和上手编写脚本。请在脚本编写的工作中,尽量避免将脚本保存在系统目录、或无权限读写的目录。如果是MacOS,请 不要将脚本保存在AirtestIDE.app的目录里 (例如: /Applications/AirtestIDE.app/Contents/MacOS ),因为一旦重装应用,将会覆盖掉该目录,导致脚本丢失。

请务必选择一个合适的、有存取权限的目录来存放你的脚本。