Skip to content

4.2 使用命令行运行脚本

我们的脚本在编写完成后,除了使用 AirtestIDE 可以运行之外,也支持用脚本运行。

1. 使用AirtestIDE命令行运行

即使本地没有安装python环境,或是没有安装 airtestpoco ,我们也一样能够使用命令行来运行脚本,诀窍就是复制刚才在 AirtestIDE 里运行脚本时log窗口里显示出来的命令行:

image

将运行脚本时 AirtestIDE 生成的这段命令行代码复制到你的命令行终端里,回车运行就可以了。

注意 , 这种使用AirtestIDE命令行来运行脚本的方式,是一个简单快速的方式,假如想要批量执行、同时执行的话,可能会遇到效率不佳的问题。若有长时间或批量执行脚本的需求,请尽量在本地Python环境安装airtest和poco来执行脚本,详情见下一节。

2. 使用本地python环境运行脚本

方法1中介绍的使用AirtestIDE命令行来运行脚本,虽然很方便,但是不适合更复杂的操作(例如想同时用多个命令行运行多台手机、多个脚本等情况),以及对于一些Python开发者来说,可能需要在脚本中使用其他功能强大的Python第三方库。因此我们更加推荐在本地python环境中安装airtest和pocoui,然后用命令行运行脚本。

部署Python环境

想要使用本地python环境来运行脚本,需要配置本地的运行环境:

Python版本选择

支持Python2.7或<=3.9,我们更推荐使用 Python3 ,如果你愿意的话我们也同样建议使用 virtualenv 等虚拟环境新建一个干净的python环境。

注意:python3.9如果安装完毕还不能使用airtest,报错 ImportError: numpy.core.multiarray failed to import ,可以手工将 numpy 版本号降级至1.19.3就能使用了。

pip install -U numpy==1.19.3

Airtest安装:

  • 使用 pip 安装Airtest框架 pip install airtest

  • 注意:在Mac/Linux系统下,需要手动赋予adb可执行权限,否则可能在执行脚本时遇到 Permission denied 的报错:

# mac系统
> cd {your_python_path}/site-packages/airtest/core/android/static/adb/mac
# linux系统
> cd {your_python_path}/site-packages/airtest/core/android/static/adb/linux
> chmod +x adb
  • 若运行代码时,在cv2模块报 ImportError: DLL load failed: 找不到指定模块 的错,有几种解决方案:

    • 本问题的根本原因应该是DLL文件的缺失,我们将它们放入了IDE的目录中,可以直接下载一个最新版本的AirtestIDE,在解压后的目录中找到api-ms-win-downlevel-shlwapi-l1-1-0.dllIEShims.dll两个DLL文件,将他们复制到C:\Windows\System32目录,重新运行代码即可解决
    • 如果使用了python3.7,请安装 Visual C++ redistributable 2015 , 参考 文档
    • 如果使用的python版本低于3.7,请直接运行:
> pip uninstall opencv-contrib-python   
# 若以下安装语句运行失败,可以尝试更新pip到最新版本后重试   
> install opencv-contrib-python==3.2.0.7  
  • 若在win.pyimport win32api时报DLL load failed,可以尝试重新安装pywin32模块:
pip uninstall pywin32
pip install pywin32==223

Poco安装

使用 pip 安装poco框架 pip install pocoui,请注意库的名称为 pocoui,不要填错

Pip指令运行失败

国内用户请在pip install 指令后面加上 -i https://pypi.tuna.tsinghua.edu.cn/simple后重试,参考链接

环境部署完成后,我们就能够脱离AirtestIDE,在不同的宿主机器和被测平台上运行脚本了。

使用python命令行运行脚本

以下是一个使用命令行运行的例子:

>airtest run untitled.air --device Android:///手机设备号 --log log/
>python -m airtest run untitled.air --device Android:///手机设备号 --log log/

这两个命令行的效果是相同的,我们用airtest运行了一个叫做 untitled.air 的脚本,传入了 --device--log 两个参数,分别是我们的手机设备和log输出目录。

airtest run 命令必须传入的参数是指定脚本的路径,其他可选参数有 --device 指定 设备字符串--log指定 log输出目录 ,其他参数请查阅 Airtest-running-air-from-cli 文档。

特别注意,Airtest1.1.7版本起,airtest run 指令新增了1个参数 --no-image用于设置在任务运行过程中不再保存截图

> airtest run test.air --device Android:/// --log logs/ --no-image

关于设备字符串

在刚才的命令行中使用的 --device 参数,传入的是一个设备字符串,以安卓设备为例,字串完整定义如下:

Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>

其中,adbhost是adb server所在主机的ip,默认是本机127.0.0.1,adb port默认是5037,serialno是android手机的序列号。更多adb的方面的内容请参考文档 ADB

在平时的脚本运行中,我们一般可以这样写:

# 什么都不填写,会默认取当前连接中的第一台手机
Android:///
# 连接本机默认端口连的一台设备号为79d03fa的手机
Android://127.0.0.1:5037/79d03fa
# 用本机的adb连接一台adb connect过的远程设备,注意10.254.60.1:5555其实是serialno
Android://127.0.0.1:5037/10.254.60.1:5555
# 连接一个Windows窗口,窗口句柄为123456
Windows:///123456
# 连接一个Windows窗口,窗口名称匹配某个正则表达式
Windows:///?title_re=Unity.*
# 连接windows桌面,不指定任何窗口
Windows:///
# 连接iOS手机
iOS:///127.0.0.1:8100

值得一提的是,windows窗口的连接使用了 pywinauto 库,在AirtestIDE中默认是使用当前已连接到IDE里的窗口句柄来连接的。可以预想到,假如窗口关闭了,下一次再开启时,句柄就可能发生变化。因此我们的连接字符串支持了 pywinautoconnect 接口去连接窗口,查阅 参考文档 里的几种参数填写方式来写连接字符串的参数部分:Windows:///?name=value

注意: 如果自己拼写的设备字符串无法正确连接设备,但是在AirtestIDE中可以正常连接的话,可以考虑先在AirtestIDE中运行一次脚本,然后将运行时自动生成的命令行里 --device Android:/// 参数复制出来,即可在代码中使用了,这种做法可以极大程度避免设备字符串编写错误的问题。

部分安卓设备的特殊参数

2.2 Android连接常见问题 中,我们提到了部分设备由于较为特殊,需要在连接时勾选 use ADB orientation 或是 use javacap 等特殊连接选项后才能连接手机,这些设备在使用命令行运行脚本时,也同样需要将这些参数附加在设备字符串后面::

# 连接了模拟器,勾选了`Use javacap`模式
Android://127.0.0.1:5037/127.0.0.1:7555?cap_method=JAVACAP
# 所有的选项都勾选上之后连接的设备,用&&来连接多个参数字符串
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI&&touch_method=ADBTOUCH

注意:命令行中如果有出现 ^ < > | & 这些字符,可能都需要转义才能生效,因此如果连接字符串中需要写 && 时,在windows下需要改写成 ^&^& ,添加一个 ^ 符号进行转义,即:

# --device Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI 在windows下不可用
--device Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP^&^&ori_method=ADBORI  # windows命令行添加^转义后效果
--device Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP\&\&ori_method=ADBORI  # mac命令行添加\转义

对脚本运行过程进行录屏

在Android手机上运行脚本时,我们可以在运行脚本的命令行中,通过添加一个 --recording 参数,让airtest自动对脚本执行过程中的手机屏幕进行录制操作。录制完成后,将自动生成一个命令格式类似于 recording_0.mp4 的文件到脚本生成的log目录中。在最后生成报告时,这个mp4文件会默认显示在HTML报告页面里。

设置本地Python.exe为AirtestIDE默认环境

AirtestIDE中使用的Python,是一个默认的Python环境,里面内置了Airtest和Poco,虽然使用起来很方便,但是假如需要使用一些其他的第三方库就无法支持了。此时我们可以通过设置本地的Python.exe路径到AirtestIDE的设置里,使AirtestIDE可以方便地使用本地Python环境来执行脚本,这样哪怕是Python2也都是支持的,详细的设置方法请参见 选项配置-使用本地Python环境运行脚本

3. 生成运行结果报告

报告的相关内容,可以查看生成报告章节.