概述
② 在刚才安装好的本地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
如何在报告中显示报错信息
可以使用如下代码:
import traceback
try:
xxxx
except:
log("出错啦", traceback. format_exc())
airtest执行测试脚本的时候,断言失败的情况,是否可以不中断执行?
用try,except把断言包起来就行
try:
assert_equal(value, "8", "按钮值为8")
except AssertionError:
print("按钮值断言失败")
if G.DEVICE.display_info['orientation'] in [1,3]:
height = G.DEVICE.display_info['width']
width = G.DEVICE.display_info['height']
else:
height = G.DEVICE.display_info['height']
width = G.DEVICE.display_info['width']
1行代码搞定自动化测试的设备连接问题
用于初始化设备的URI字符串
1.连接Android手机
# 什么都不填写,默认取当前连接中的第一台手机
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
2.连接iOS手机
iOS:///127.0.0.1:8100
3.连接Windows窗口
# 连接一个窗口句柄为123456的Windows窗口
Windows:///123456
# 连接一个Windows窗口,窗口名称匹配某个正则表达式
Windows:///?title_re=Unity.*
# 连接windows桌面,不指定任何窗口
Windows:///
4.使用了备选连接参数的设备
# 夜神模拟器(127.0.0.1:62001为夜神模拟器的端口号)
Android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP&&ori_method=ADBORI
# 设备号为79d03fa的 MIUI11 设备
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI
在脚本中添加连接设备的参数
1.使用 auto_setup
接口
auto_setup
是一个用来 初始化环境 的接口,它接受5个参数。我们可以设置当前脚本所在的路径、 指定运行脚本的设备 、设置默认的log路径、设置脚本父路径和指定截图精度:
其中第二个参数就是指定运行脚本的设备,我们可以在这里 传入待连接设备的URI字符串 ,例如:
# 连接本机默认端口连的一台设备号为SJE5T17B17的手机
auto_setup(__file__,devices=["Android://127.0.0.1:5037/SJE5T17B17"])
注意:devices
传入的是一个字符串列表,所以如果需要 连接多台设备 ,直接用 ,
隔开多个URI字符串即可:
# 连接本机默认端口连的设备号为123和456的两台手机
auto_setup(__file__,devices=["Android://127.0.0.1:5037/123","Android://127.0.0.1:5037/456"])
2.使用 connect_device
接口
在 connect_device 接口中传入设备的URI字符串即可连接1台设备:
dev = connect_device("Android://127.0.0.1:5037/SJE5T17B17")
3.用脚本执行多个文件
@echo off
F:
#D:
#cd D:test
cd F:AI_Test_projectpy_airtest_project01
title 第一个脚本
airtest run newsLogin.air
title 第二个脚本
airtest run newsUsing.air
title 第三个脚本
airtest run newsExit.air
exit
.bat 文件, title XXX 用来制定命令提示窗口的标题
27.如何清空输入框的文本
Airtest的方式:
for i in range(10):
keyevent("67")
# 或者
for i in range(10):
keyevent("KEYCODE_DEL")
Poco的方式:
# 将输入框内容设置为空字符串,poco("xxx")为输入框的元素定位语句
poco("xxx").set_text("")
28.设备的3种状态:device、unauthorized、offline
1)DEVICE:设备在线可连接¶
通常情况下,我们使用 adb devices
命令在命令行查看与本机连接的设备详情,或者在Airtest IDE的设备连接窗口查看当前设备列表时,只有设备状态为 device
的设备,才是与本机正常连接且可通讯的设备:
2)UNAUTHORIZED:未允许USB调试¶
如果开启了手机的 USB调试
选项并且用USB线连接好了设备和电脑,却发现设备状态为 unauthorized
,则表示未处理 允许USB调试
的弹窗,允许该弹窗即可
3)OFFLINE:设备掉线不可用¶
常见于2种设备连接情况:
一种是连接模拟器设备,模拟器未启动完全就使用 adb connect
命令连接或者使用过程中模拟器挂了,都会出现模拟器的状态为 offline
的情况。这时候只要重新使用 adb connect
命令再次连接模拟器即可。
另外,也可能是模拟器自带的adb版本与Airtest自带的adb版本不一致,发生了冲突,导致adb连接出现问题,也会造成模拟器的状态为 offline
。这时需要将2个不一样版本的adb统一成一个相同的版本即可。
第二种情况常见于真机的无线连接。WiFi波动导致设备断连,出现 offline
状态,则需要重新执行 adb connect ip:port
。如还不能解决,则需要将无线连接的所有步骤重来一次,真机无线连接的教程可以参考:https://airtest.doc.io.netease.com/IDEdocs/device_connection/1_android_phone_connection/#3
29. no moudle named 'poco.drivers'
如在运行脚本过程中出现 no moudle named 'poco.drivers'
的报错,则表示当前python环境误装了poco库,未安装pocoui库。
需要注意的是,poco框架的库名为pocoui ,并不是poco,此时需要卸载掉poco库,安装正确的pocoui库即可:
pip uninstall poco
pip install pocoui
30.安装指定版本的库
命令如下:
pip install -U airtest==1.1.6
31.使用IDE截图特别模糊如何处理¶
如果同学们发现使用IDE截出来的图片非常模糊,可以尝试在AirtestIDE的 选项--设置
中,把 手机设备显示分辨率
调成2000,之后再重新连接设备,查看截图清晰度是否有所改善。
如未改善,还可以查看设备连接窗口的设备画面是否清晰,如还是非常模糊的话,可以先断开连接,然后在 conncet
之前勾选 use javacap
,之后再尝试截图。
32.如何判断当前该选用哪种poco模式
IDE的poco辅助窗内,给同学们提供了多种poco模式:
其中,如果我们测试的是安卓原生应用,则选取其中的Android模式即可,安卓的微信小程序也是选择此模式,且该模式不需要应用额外接入poco-sdk;
如果我们测试的是iOS原生应用,则选取其中的iOS模式即可,但目前不支持测试iOS微信小程序,所以iOS模式仅适用于测试iOS原生应用的情况,应用也无需额外接入poco-sdk;
其余模式,如unity、UE4、Cocos-lua等,指的是所测游戏项目的引擎类型,使用这些模式时,要求在游戏项目中接入对应的poco-sdk,并且打出项目包安装在设备上之后,才能使用,比如使用unity模式获取unity游戏项目的控件树:
33.如何安排脚本初始化、poco初始化和启动应用的顺序
很多新手在使用poco的时候,都容易把连接设备、初始化poco和打开应用的脚本顺序搞乱,导致出现一大堆奇妙的报错。
比如大家最常见的:“远程主机强迫关闭了一个现有的连接”、“socket connection broken” 等等。
最正确的顺序是:先连接设备(一般在 auto_setup 接口里面连接)--> 再打开应用(一般用 start_app 接口)--> 等应用开启完毕,最后才初始化 poco 。
# -*- encoding=utf8 -*-
__author__ = "Airtest"
from airtest.core.api import *
# 连接设备
auto_setup(__file__,logdir=True,devices=["Android://127.0.0.1:5037/emulator-5554?cap_method=JAVACAP"])
#启动应用
start_app("com.NetEase")
sleep(6.0)
# 初始化poco
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
poco("btn_start").click()
所以同学们在初始化poco的时候,千万记住要检查下这几条代码的顺序,避免产生不必要的报错。
34.同一个脚本初始化多个poco¶
在同一个脚本内,支持初始化多个不一样的poco,比如 Android poco 和 unity poco,就是可以共存的:
from airtest.core.api import *
auto_setup(__file__,devices=["android://127.0.0.1:5037/emulator-5554?cap_method=MINICAP_STREAM&&ori_method=MINICAPORI&&touch_method=MINITOUCH"])
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
A_poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
sleep(1.0)
A_poco("poco").click()
sleep(2.0)
from poco.drivers.unity3d import UnityPoco
U_poco = UnityPoco()
U_poco("btn_start").click()
但是我们不能在同一个脚本内,反复初始化相同的poco,比如多次初始化Android poco,就有可能导致奇奇怪怪的错误出现。
35.指定python环境安装第三方库¶
很多情况下,同学们的电脑里面可能安装了不止一个python环境,比如同时存在python2和python3,要在指定的python环境下安装第三方库,可使用如下命令:
python3 -m pip install airtest # 在python3环境下安装airtest库
python2 -m pip install airtest # 在python2环境下安装airtest库
除了从命令层面来区分以外,更直接的办法是同学们自己去对应的python目录下,用那个目录下的pip.exe来安装。
36.三个备选的连接参数
1)备选参数在哪里选择¶
在AirtestIDE的设备连接窗口中,点击connect连接设备之前,单击connect右侧的下拉按钮,即可找到3个连接设备的备选参数:
2)3个备选参数分别代表什么意思¶
① 第一个 Use javacap
,是给部分无法正常看到手机画面、minicap初始化失败 的手机或设备用的,所以模拟器看到黑屏、部分特殊的平板等设备可以考虑勾选这个选项
② 第二个 Use ADB orientation
是用于 屏幕旋转 的,如果在安卓手机屏幕旋转方向检测有问题、或者是部分特殊的平板无法显示正确的屏幕方向时可以勾选
③ 第三个 Use ADB touch
是 发送adb指令来点击屏幕 ,效果很差,速度也很慢,不建议勾选,只有在 部分无法点击屏幕的特殊安卓设备 上才需要使用(例如智能后视镜、特殊型号的平板等设备上) 正常情况下,手机都可以点击,如果无法被点击(比如小米设备),一般都是因为手机设置有选项漏了打开,特别是小米设备要注意 开启允许模拟点击 的设置
3)是不是把备选参数全带上就能适配所有设备¶
正常情况下,同学们连接设备是不需要勾选任何备选参数的,我们也不建议大家主动把所有备选参数都勾选上,因为这些备选参数会影响设备连接和使用的效果。
除非是上述提到的特殊情况,比如无法使用minicap的设备,可以通过勾选 use javacap
来连接;常见的需要勾选备选参数的设备,MIUI12的小部分型号,部分模拟器,部分特殊安卓设备等。
4)如何在脚本中添加备选参数¶
如在IDE连接设备时,勾选了一些备选参数,则同学们在脚本中连接该设备,也要添加对应的备选参数。特别是使用此类设备在命令行运行脚本时,千万要记得将参数加在设备连接字符串上:
# 添加了3个备选参数的1个安卓设备
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI&&touch_method=ADBTOUCH
37.Airtest的多图查找¶
Airtest没有提供专门的API给我们进行多图查找,但是我们可以用简单的语法来实现:
picList = [pic1,pic2,pic3] # 截图的图片对象列表
for pic in picList:
pos = exists(pic)
if pos:
touch(pos)
break # 只要找到图片列表中的任何一张图片,就执行touch
38.poco的多元素查找¶
poco有专门的API实现了多元素等待:
# 等待多元素其中的任意一个元素出现
bomb = poco("bomb")
yellow = poco("yellow")
blue = poco("blue")
while True:
fish = poco.wait_for_any([bomb,yellow,blue])
print(fish.get_name())
# 等待多元素的所有元素都出现
poco.wait_for_all([yellow,blue,black])
39.'NoneType' object has no attribute xxxx¶
这个报错可能出现在不同的方法里面,比如:
AttributeError: 'NoneType' object has no attribute 'snapshot'
AttributeError: 'NoneType' object has no attribute 'start_app'
出现这些报错,基本上都是因为同学们在脚本中没有连接设备,所以只要在脚本开头,补充上连接设备的脚本即可。
40.怎么获取Windows窗口的句柄¶
1)在IDE的LOG窗口查看¶
在IDE中连接上该Windows窗口,然后随便运行1个自动化脚本,我们可以在log查看窗的最上面,看到运行该脚本的命令,其中包含Windows窗口的句柄:
2)使用网上的工具查看¶
使用VC或者VS里面tool中的SPY++,也可以查看窗口的句柄、名字、类、类型、大小和位置等。还有其它的一些方法和工具可以自行百度。
41.UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)¶
编码报错,一般情况下我们可以通过在脚本开头声明编码来规避这个问题:
# -*- encoding=utf8 -*-
如该声明无效,脚本运行到某些 print
中文的语句中,还是会报这个错误,可以单独指定这个中文的编码:
s = '中文'
print(s.decode('utf-8'))
1.如何输入文字?¶
① 使用airtest的 text()
接口:
touch(输入框)
text("文本")
② 使用poco的 set_text()
接口:
poco("输入框").click()
poco("输入框").set_text("文本")
另外,airtest和poco脚本可以混用,所以当输入框不支持 text()
接口输入时,可更换成poco的 set_text()
接口,同理,不支持poco输入时,也可以更换成airtest的 text()
接口输入。
2.minicap serve setup time out¶
屏幕初始化失败,常见于高版本MIUI设备或者模拟器等;先检查当前IDE是否为最新版本,不是请把IDE更新到最新版本;然后再尝试在connect设备之前,下拉勾选 use javacap
,再连接设备。
3.minitouch serve setup timeout¶
点击初始化失败,常见于安卓10或者10以上的设备,解决办法,检查当前环境的airtest版本是否为最新的(IDE更新到最新版本,使用本地python环境把本地环境的airtest更新到最新版本)。
4.Javacap server setup timeout¶
设备不适用于 javacap
,在IDE连接设备之前 请勿勾选 use javacap
,脚本连接设备的字符串也不要带 ?cap_method=JAVACAP
。最后请确保当前使用的是最新版本的airtest。
5.如何显示坐标¶
顶部菜单栏,选项-设置,只勾选实时坐标显示,则显示绝对坐标;同时勾选实时坐标和相对坐标,则显示相对坐标。(Airtest使用绝对坐标系,poco使用相对坐标系)
# 点击坐标为[100,100]的位置
touch([100,100])
# 点击屏幕中心[0.5,0.5]
poco.click([0.5,0.5])
6.图像识别不准确¶
请参考官方公众号“AirtestProject”的教程推文:
- 了解图像识别原理与算法:3分钟教会你选择合适的图像识别算法
- 提高图像识别的兼容性①:写了10000条Airtest截图脚本总结出来的截图经验,赶紧收藏!
- 提高图像识别的兼容性②:截图识别成功率太低,究竟该如何补救
7.设备连接不上¶
请参考官方文档的相关内容:AirtestIDE使用文档--设备连接--Android连接常见问题,然后根据自己的手机型号,查看1、2节内容。
不同品牌手机的相关设置名称仅供参考,不是所有的品牌型号相关的设置名称和位置都一样,所以教程中提到的设置仅供同学们参考,如找不到完全相同的设置,请同学们仔细查找类似的设置。
8.模拟器连接不上¶
- 1)检查是否安装上了输入法Yosemite,没安装手动安装上
- 2)连接后黑屏或者画面模糊等,connect之前下拉勾选
use javacap
再连接 - 3)模拟器连接更多详情和答疑,请参考公众号文章: 测试了5款最常见的模拟器,发现与Airtest自动化最配的竟然是...
9.poco定位报错找不到¶
-
1)有时候IDE自动生成的poco定位脚本会非常长,层级也非常深,回放时可能出现找不到控件的情况;这时不建议同学们直接使用自动生成的定位脚本,可以根据UI树详情,另外编写更精简的定位脚本,推荐使用正则匹配来进行脚本定位会好一些。
-
2)如果定位脚本是同学们自己编写的,请检查对应的属性或者层级关系,看是否是脚本错误而导致找不到元素。
-
3)如出现单独选中调试脚本,可以找到控件,但实际运行脚本又容易找不到控件,建议在该条定位脚本之前添加足够的
sleep()
,确保画面跳转稳定后,再来查找控件。
10. no module named 'airtest'、‘poco’、‘airtest-selenium’等,找不到模块¶
在当前使用的python环境中,安装上缺失的对应模块:
pip install airtest
pip install pocoui #(不能安装poco,如安装了请卸载pip uninstall poco)
pip install airtest-selenium
11.poco拿不到控件,poco的支持情况¶
目前只有原生应用可以直接使用poco(无需接入pocoSDK),非原生应用,比如各种游戏应用、H5小程序、混合开发的应用等,都不能直接使用poco拿取控件,绝大多数的游戏支持接入对应引擎的pocoSDK之后,可以获取控件信息。
12.辅助窗没有刷出UI树¶
- 1)除原生应用之外,其余引擎都需要接入SDK才可以查看UI树;
- 2)检查手机上是否已经自动安装上poco初始化相关的2个apk(
pocoservice-debug.apk
、pocoservice-debug-androidTest.apk
),未安装要手动安装上; - 3)安装输入法
Yosemite
并设为默认输入法 - 部分厂商的手机需要额外的设置,请参考官方文档:AirtestIDE使用文档--设备连接--Android连接常见问题
13.poco刷新时间¶
UI树的默认刷新时间为2秒,可以在选项--设置--poco,里面设置,设置完成后记得点击OK保存设置。
14.invalid syntax¶
典型的python语法错误,常见于脚本未换行、缩进错误、缺少一边 "
或者 (
等。
15.mac上出现很多个IDE的图标¶
尝试在IDE顶部菜单栏的选项--设置中,去掉自动补全设置的勾选。
16.record_pos、resolution表示什么¶
Template
类里面的参数,record_pos
计算坐标对应的中点偏移值相对于分辨率的百分比,匹配时会优先匹配这附近的画面;resolution
记录了截图时的手机分辨率。
Template(r"tpl1611559272215.png", record_pos=(-0.106, -0.035), resolution=(1080, 1920))
如同学们使用的是自己截取的图片,不填 record_pos
参数也不会对识别效果产生很大影响,如想要计算,可参考如下源码:
17.怎么点击软键盘上面的搜索?输入后回车?¶
如需点击软键盘上面的 search
按钮,则:
text("文本",enter=False,search=True)
同理,如需输入后回车,则 text("文本",enter=True)
,不需要回车则, text("文本",enter=False)
。
18.批量运行?多任务运行?多机运行?¶
目前官方文档上有提供多机协作和用bat脚本做多机运行的实例,都在AirtestIDE使用文档--运行脚本的章节下面,另外利用多线程方法来进行批量运行可以参考网上的教程:
- 多机协作的实操案例:“多机协作”--微信互加好友案例分析
- 用bat脚本实现批量执行的实操案例:巧用bat文件做Airtest脚本的“批量运行”
19.判断元素/截图存在¶
- airtest的,判断截图目标是否存在于当前画面上:
exists(截图)
- poco的,判断元素是否存在:
poco("xxx").exists()
20.等待元素/截图出现¶
- airtest的,等待某个截图目标出现在当前画面上:
wait(截图)
- poco的,等待某个控件元素出现:
poco("xxx").wait_for_appearance()
22.报错之后如何继续执行¶
使用 try-except
捕捉错误,让程序继续运行。
23.不能输入密码?密码界面黑屏?¶
应用的登录页面或者密码界面一般都不给截屏录屏的,同学们可以检查看看你的测试设备的设置里面,有没有安全键盘、防止恶意截屏录屏之类的设置,关掉就行。
24.怎么调用别的脚本?¶
airtest提供 using
接口可以用来调用别的 .air
脚本。详细使用方法和案例可以查看官方公众号的教程推文:一个方法帮你在主脚本里添加“子脚本”的运行。
如使用 using
调用之后,发现程序仍是找不到脚本,建议检查 using
接口里面的脚本路径是否有误,另外还可以尝试在脚本开头把待引入的脚本路径添加到 sys.path
中:
#将test1.air的路径添加到sys.path里面
sys.path.append(r"D:testuserprojecttest1.air")
25.poco定位脚本怎么写?¶
poco支持用基本选择器、相对选择器和空间选择器来编写定位脚本,另外还支持用正则表达式来匹配控件。详细教程和实例可以查看官方公众号的教程推文: - poco的元素定位搞不定?速来看看这3个选择器;真香系列! - 用正则表达式匹配poco控件,学会了秒杀各种定位选择器
26.局部截图和局部找图¶
局部截图:
screen = G.DEVICE.snapshot()
# 局部截图
local = aircv.crop_image(screen,(0,160,1067,551))
局部找图:
screen = G.DEVICE.snapshot()
# 局部截图
local_screen = aircv.crop_image(screen,(0,949,1067,1500))
# 将我们的目标截图设置为一个Template对象
tempalte = Template(r"png_code/设置.png")
# 在局部截图里面查找指定的图片对象
pos = tempalte.match_in(local_screen)
详细教程和实例可以查看官方公众号的教程推文:使用Airtest最常遇到的几个需求,都帮你们实现好了。
#第一种写法
# try:
# assert_exists(Template(r"tpl1626956541047.png", record_pos=(-0.314, -0.046), resolution=(1000, 571)), "这是白极剑仙")
# touch(Template(r"tpl1626956644815.png", record_pos=(-0.31, -0.034), resolution=(1000, 571)))
# except:
# assert_exists(Template(r"tpl1626690601767.png", record_pos=(-0.31, -0.053), resolution=(1008, 586)), "这是孛子善")
# touch(Template(r"tpl1626690601767.png", record_pos=(-0.31, -0.053), resolution=(1008, 586)))
# sleep(5.0)
# try:
# assert_exists(Template(r"tpl1627129653727.png", record_pos=(-0.316, -0.036), resolution=(1000, 571)), "这是孟婆")
# touch(Template(r"tpl1627129700407.png", record_pos=(-0.316, -0.04), resolution=(1000, 571)))
# except:
# assert_exists(Template(r"tpl1627180793339.png", record_pos=(-0.375, 0.249), resolution=(987, 571)), "请填写测试点")
#第二种写法
pic1 =Template(r"tpl1626956541047.png", record_pos=(-0.314, -0.046), resolution=(1000, 571))
pic2 =Template(r"tpl1626690601767.png", record_pos=(-0.31, -0.053), resolution=(1008, 586))
pic3 =Template(r"tpl1627129653727.png", record_pos=(-0.316, -0.036), resolution=(1000, 571))
#pic4 =Template(r"tpl1627180793339.png", record_pos=(-0.375, 0.249), resolution=(987, 571))
picList =[pic1,pic2,pic3]#截图的图片对象列表
for pic in picList:
pos = exists(pic)
if pos:
touch(pos)
break #只要找到图片列表中的任何一张图片,执行touch
sleep(15.0)
#判断阵营的改版
piczy1 =Template(r"tpl1628153727880.png", record_pos=(-0.289, 0.248), resolution=(634, 364))
piczy2 =Template(r"tpl1626690609095.png", record_pos=(-0.279, 0.248), resolution=(1008, 586))
picZy = [piczy1,piczy2]
for piczy in picZy:
poszy = exists(piczy)
if poszy:
touch(poszy)
break
最后
以上就是懦弱心锁为你收集整理的Airtest常见问题的全部内容,希望文章能够帮你解决Airtest常见问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复