1.在IDE中如何引入第三方库?¶
AirtestIDE内置了一个精简的python环境,缺少很多第三方库;如果需要在IDE中引入各种第三方库,可以先在本地的python环境中装好,再设置IDE使用本地的python环境,具体步骤如下:
① 请自行在你的电脑上安装属于你自己的Python(python<=3.7,3.8暂不支持),然后再安装对应的依赖库。你可以通过一些环境管理方案来管理你的python环境,例如virtualenv
② 在刚才安装好的本地Python环境中,安装airtest相关的依赖库,详细内容请参考文档:https://airtest.doc.io.netease.com/IDEdocs/run_script/1_useCommand_runScript/#python
③ 在本地安装完属于你自己的python环境后,再在IDE的设置里面设置好你本地的 python.exe
的路径,详细内容请参考文档:https://airtest.doc.io.netease.com/IDEdocs/settings/1_ide_settings/#python
2.RuntimeError:minitouch setup timeout¶
出现这个报错,最常见的是以下俩种情况:
① 手机系统是MIUI11,此时我们需要在点击 connect
按钮之前,把 use Javacap
+ use orientation
这两个选项勾选上,再点击 connect
按钮即可正常使用
② 手机的安卓版本是Android10,此时仅需要把IDE更新到最新版本即可;如果IDE使用的是本地的python环境,那还需要把本地python环境的Airtest更新到最新版本。
3.Yosemite等apk在哪里可以下载¶
有些设备可能因为某些权限问题,不能自动安装 Yosemite
、RotationWatcher
等apk,同学们首先需要检查下手机设置里是否没有开启 允许通过USB安装应用
这样的设置。
如果确定手机设置都开启了,但还是不能自动安装的话,再考虑手动进行安装。同学们可以在官网上下载一个最新版版本的IDE,然后在如下目录中找到这些apk,然后自行在设备上安装即可:
4.ADB版本冲突¶
在Windows环境中运行Airtest脚本时,假如运行环境本地已经存在有 adb.exe
(例如装了 android_sdk
, 或者是别的工具带有 adb.exe
),并且ADB版本与Airtest中使用的不同,运行脚本时就可能会出现各种报错。
常见情况下,我们会看到log中包含这样的语句:
adb server version (40) doesn't match this client (39); killing...
* daemon started successfully *
如log所示,我们可以看到环境里面使用了40和39版本,版本冲突导致报错。解决办法是将本地所有的 adb.exe
统一成同样的版本就行。
另外,adb版本冲突,还会容易导致设备断开,出现如下报错:
Airtest自带的ADB工具路径如下:
5.连接模拟器出现黑屏¶
① 先尝试在连接模拟器之前下拉勾选 Use javacap
选项,之后再点击 connect
按钮连接模拟器
② 如果仍然黑屏,断开模拟器,下拉勾选 Use javacap
和 Use ADB orientation
这俩个选项,再次连接即可
③ 如上述方式都不见效,可以上GitHub提一个issue,贴上使用的IDE和模拟器版本详情(GitHub地址:https://github.com/AirtestProject/AirtestIDE/issues)
6.复制IDE中log窗口生成的报告命令在命令行执行报错¶
常见的情况可能有如下几种:
① 复制的命令路径中含有空格,导致程序报错:找不到文件或者路径;只需要将命令中的路径用英文模式下的双引号括起来即可。
② 命令行中包含了 &
这样的符号,可能会导致命令行被中断,常见于一些勾选了 use javacap
这样的选项后连接的设备。但是&这个字符需要转义才能够生效:Windows下改写成^&
,MAC下改写成/&
7.Airtest的报告步骤显示能否自定义¶
当Airtest版本≥1.2.2,或者IDE版本≥1.2.2,支持在报告上自定义断言信息,其余操作在报告上的显示暂不支持自定义。
8.如何在报告中显示报错信息¶
可以使用如下代码:
import traceback
try:
xxxx
except:
log("出错啦", traceback. format_exc())
9.用Airtest测试iOS一定要用macOS吗?¶
① 使用 xcode
部署 iOS-Tagent
需要在macOS完成
② 部署好以后可以在macOS或Windows机器上连接到iOS手机进行测试。
10.本地pip list可以找到airtest,但pycharm里找不到这个库¶
很多同学都遇到过这个问题,明明在本地命令行使用 pip list
可以看到已经安装了Airtest库,但是在自己的pycharm里面却找不到Airtest这个库。 这种情况很有可能就是你的 pycharm使用了虚拟环境的解释器 。
你可以随意运行1个项目,然后查看运行结果窗口显示的解释器是不是你在本地安装的解释器的路径,如果不是,一般会带有 venv
的字样,例如:
D:\test\vene\Scripts\python.exe D:\test\test.py
这种情况只需要将pycharm从虚拟环境切换到安装了Airtest的本地环境即可。
11.报告可以导出发给别人看吗?¶
Airtest的报告是可以打包发给别人看的。
① 想要导出报告发给别人观看,我们需要生成报告的命令中传入 --export
参数,这样就可以将 包含静态资源文件和图片文件的报告 导出到一个指定的文件夹内,之后直接将整个文件夹发送给别人观看即可。
② 如果生成报告时不传入 --export
参数,那么报告中的静态资源文件和图片文件将使用 绝对路径 来访问,此时将整个文件夹发给别人观看,别人也是无法正常观看的。
12.pip install -U airtest 无限超时¶
使用 pip
命令安装Airtest,如果出现无限超时的问题,可以考虑配置 清华源 来解决。
13.如何检查adb是否连接上设备¶
使用AirtestIDE连接安卓设备之前,需要确保ADB已经连接上了设备。
① 我们可以使用 adb devices
来查看设备情况,如果仅仅提示 List of devices attached
,则表明ADB未连接上任何设备;此时需要检查手机上的 USB调试
功能是否已开启,或者换一根USB数据线;
② 如果ADB已连接上设备,那么执行 adb devices
后,会显示已连接设备的列表:
List of devices attached
SJE5T17B17001648 device
SJE5T17B17001650 device
14.poco无限重启的解决办法¶
① 如果开了网络代理的话,需要先 关闭各种代理和VPN ,否则可能会影响到poco通讯
② 检查手机助手内是否对 pocoservice.apk
做了限制,例如在某版本的华为手机中需要开启 允许自启动 和 允许后台活动
https://airtest.doc.io.netease.com/IDEdocs/device_connection/2_android_faq/#_6
③ 不能和uiautomator同时启动,否则会相互冲突
④ 可以尝试 重启手机 看看是否会恢复
15.如何删除iOS输入框的内容¶
① 对于Android平台,我们可以使用多种方法来删除输入框的内容,比如使用 keyevent
接口: keyevent("KEYCODE_DEL")
;或者使用Poco的 set_text()
方法: poco("xxx").set_text("")
;
②但对于iOS平台来说,暂不支持 set_text()
接口,也不支持 keyevent("KEYCODE_DEL")
,所以这俩种方法对于iOS的输入框来说是无效的。iOS支持 text()
方法,所以我们可以用 text("\b",False)
(每次删除1个字符,删除后不执行 enter ),来实现iOS输入框内容的删除
16.备用的连接参数怎么理解¶
IDE提供了3个备用的连接参数: Use javacap
、Use ADB orientation
和 Use ADB touch
;
① 第一个 Use javacap
,是给部分无法正常看到手机画面、minicap初始化失败 的手机或设备用的,所以模拟器看到黑屏、部分特殊的平板等设备可以考虑勾选这个选项
② 第二个 Use ADB orientation
是 屏幕旋转 的,如果在安卓手机屏幕旋转方向检测有问题、或者是部分特殊的平板无法显示正确的屏幕方向时可以勾选
③ 第三个 Use ADB touch
是 发送adb指令来点击屏幕 ,效果很差,速度也很慢,不建议勾选,只有在部分无法点击屏幕的特殊安卓设备上才需要使用(例如智能后视镜、特殊型号的平板等设备上) 正常情况下,手机都可以点击,如果无法被点击(比如小米设备),一般都是因为手机设置有选项漏了打开,特别是小米设备要注意 开启允许模拟点击 的设置
17.ImportError: DLL load failed: 找不到指定模块¶
常见的DLL报错会出现在以下2种情况中:
① 在 cv2
模块报 ImportError: DLL load failed: 找不到指定模块
的错:
根本原因应该是DLL文件的缺失,你可以直接下载一个最新版本的AirtestIDE,在解压后的目录中找到 api-ms-win-downlevel-shlwapi-l1-1-0.dll
和 IEShims.dll
两个DLL文件(或者自行在网上搜索这俩个DLL文件也是可以的),然后将它们复制到 C:\Windows\System32
目录,重新运行代码即可解决。
② 若在 win.py
中 import win32api
时报 DLL load failed
:
<Module>
import win32api
ImportError: DLL load failed: 找不到指定的程序。
建议您运行下列指令,更新为223版本的 pywin32
:
pip uninstall pywin32
pip install pywin32==223
18. 各种常用的pip命令¶
① 安装Airtest库: pip install airtest
② 安装poco库: pip install pocoui
③ 更新Airtest: pip install -U airtest
④ 更新Poco: pip install -U pocoui
⑤ 卸载Airtest库: pip uninstall airtest
特别注意:Poco依赖库是 pocoui
而不是 poco
,如果你发现你的环境里面同时存在 poco
和 pocoui
,请务必把 poco
卸载了,留下 pocoui
即可。
另外,如果你的电脑同时安装了 python3 和 python2 ,在不同python环境里面使用pip命令时可以使用如下方法:
# Python2
pip2 install XXX
python2 -m pip install XXX
# Python3
pip3 install XXX
python3 -m pip install XXX
19.查询Airtest版本号的方法¶
查询本地环境中的Airtest版本可以使用如下俩种方法:
① 使用 pip list
命令,找到 Airtest 那一行查看。
② 使用 airtest version
命令,但注意该命令只对1.1.2以上的 Airtest 版本生效。
20.自定义截图压缩精度¶
当Airtest版本≥1.1.2时,我们可以自定义截图精度:
① 在本地运行脚本时自定义:
# quality取值[1,99],airtest默认取10,希望获得更高精度可以取值75
airtest run xxx --compress quality
② 在脚本中自定义(优先级高于在命令行自定义):
自定义全局的截图压缩精度:
import airtest.core.api import *
ST.SNAPSHOT_QUALITY = xxx
自定义单张截图的压缩精度:
snapshot(quality=my_quality)
21.Airtest支持多设备运行吗¶
Airtest支持 Android 和 iOS 的多设备运行,但是这些目前仅用在我们的收费的小型机柜方案中 https://airlab.163.com/b2b ,外放的开源版本可以自己实现。
另外,Airtest还支持Android设备的 多机协作功能 ,实操案例可以参考往期推文:“多机协作”--微信互加好友案例分析。
22.怎样输入随机数字¶
首先我们要利用python的 random
函数创建出符合要求的随机数;比如想要随机输入20-100的1个整数型随机数:
import random
r = random.randint(20,100)
然后使用 text
接口完成随机数的输入,但要注意的是,text
接口传入的是一个字符串类型,所以把随机数传入 text
接口之前,要把刚才创建的随机数转化为字符串类型:
text(str(random.randint(20,100)))
这样我们就可以完成输入随机数字的需求啦。
23.如何获取节点的text属性并打印¶
Poco提供了 get_text()
和 get_name()
等方法让我们去读取UI的属性值,例如我们可以这样获取并打印下面这个节点的 text
属性和 name
属性:
a = poco(text="联系人")
print(a.get_text()) # 打印出:联系人
print(a.get_name()) # 打印出:android.widget.TextView
24.模拟器勾选上连接参数之后还是连不上¶
之前跟大家强调过,连接模拟器的时候,我们需要勾选上一些备选的连接参数才能连接上模拟器,或者不让模拟器黑屏。
比如连接雷电时需要勾选上 Use javacap
,而连接夜神的时候需要勾选上 Use javacap
和 Use ADB orientation
这俩个选项。
但是在一些版本的模拟器中,即使勾选上了连接参数,仍然可能连接不上模拟器,并出现如下的报错:
这是因为在连接这些版本的模拟器时,不能自动安装上 Yosemite.apk
,我们可以通过手动安装这个 apk
,再重新连接模拟器即可。
25.如何取消脚本执行过程刷新的大量log信息¶
在脚本运行的时候, Airtest 默认会刷新很多log信息,如下图所示:
如果你不想这些log信息干扰你提取有效的报错信息时,你可以在脚本代码开头加上log级别的设定:
# -*- encoding=utf8 -*-
__author__ = "user"
import logging
logger = logging.getLogger("airtest")
logger.setLevel(logging.ERROR)
from airtest.core.api import *
auto_setup(__file__)
这样运行时只会在初始化手机时会有少量log输出,初始化完毕后就能够对logger进行过滤了。
26.IDE自带的查看应用包名的功能¶
大家经常会使用 start_app("包名")
来启动待测应用,而这个包名需要我们用命令去获取。
实际上,我们还可以通过IDE自带的一个 Android助手 ,帮助我们快速获取已连接设备上的应用包名。
连接上待测的安卓设备以后,点击右上角的手机助手,然后再点击 打开Android助手 选项:
之后我们就可以在弹出的窗口中查看到设备上的应用包名:
另外,我们还可以在设备上打开想要获取包名的应用,之后点击安卓助手右下方的 refresh
按钮,即可看到当前打开应用的 package
和 activity
:
27.IDE的脚本编辑和log查看窗口显示空白¶
有些同学在启动IDE后,发现不能够看到脚本编辑窗口和log查看窗口中的文字,就像下图这样:
包含启动后闪退在内,这些问题大概率都是由显卡兼容性问题导致的。我们可以通过双击文件夹中的 兼容性模式启动.bat
脚本就能够正常启动AirtestIDE。
并且,在1.2.3版本的IDE中,我们在设置中新增了一个选项:
默认情况下会选择 default
模式。如果启动有问题的用户,可以尝试选中下拉菜单中的另外三个选项,并且重启AirtestIDE,查看接下来是否能正常显示脚本编辑窗口和log查看窗口。
如果能够生效,未来启动AirtestIDE时都将会以这个配置项来启动,无需每次都手工双击 兼容性模式启动.bat
脚本来启动AirtestIDE了。
28.webdriverAgentRunner报NSInaliArgumentException
¶
出现这个错误的原因大多是使用了11.4.1版本的xcode:
29.Airtest版本为1.1.3,部分手机出现录屏失败¶
使用1.1.3版本的Airtest,部分手机用 --recording
参数对设备进行录屏操作时,会出现如下报错:
这些手机需要点开安装好的 Yosemite.apk
,然后给一个开启录屏的权限。(1.1.3版本的录屏操作由 Yosemite
完成)。
30.输入密码时Airtest不显示密码键盘¶
有同学反馈,脚本运行到输入密码时,手机弹出了安全键盘,但是在Airtest中却不显示这个安全键盘,这是为什么?
其实这个是正常现象,Airtest不会录制有安全键盘的画面,但是各种输入操作还是正常进行的。
31.如何模拟鼠标右键¶
pywinauto.mouse
这个模块给我们提供了各种模拟鼠标操作的方法,例如大家常问的右键操作,就可以使用这个模块的 right_click()
方法:
首先我们需要获取当前连接的窗口,然后再调用 right_click()
方法实施鼠标右键点击操作:
from airtest.core.api import *
auto_setup(__file__)
# 获取当前连接的窗口
dev = device()
# 拿到鼠标,并模拟鼠标的右键点击操作
dev.mouse.right_click(coords=(1920,100))
更多模拟鼠标或者键盘的操作,可以参考我们往期的推文: “如何用python模拟鼠标和键盘的操作” 。
32.局部截图/区域截图¶
局部截图或者说按坐标截图是大家经常会问到的问题,Airtest提供了 crop_image(img, rect)
方法可以帮助我们实现局部截图:
举个例子,我们想要截取手机屏幕中被红框圈中位置的截图:
我们可以这么实现:
# -*- encoding=utf8 -*-
__author__ = "AirtestProject"
from airtest.core.api import *
# crop_image()方法在airtest.aircv中,需要引入
from airtest.aircv import *
auto_setup(__file__)
screen = G.DEVICE.snapshot()
# 局部截图
screen = aircv.crop_image(screen,(0,160,1067,551))
# 保存局部截图到log文件夹中
try_log_screen(screen)
结果如图: