Airtest常见问题

本文档列举了Airtest在使用过程中遇到的各种问题,包括设备连接、报错信息显示、库安装、设备状态判断、Poco使用等多个方面的问题及解决方法。例如,设备状态分为device、unauthorized、offline三种,可以通过特定接口初始化设备;对于'no module named'错误,需要正确安装pocoui库。此外,还介绍了如何处理模糊截图、输入文字、设备连接超时等问题。
摘要由CSDN通过智能技术生成

② 在刚才安装好的本地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_project\py_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”的教程推文:

7.设备连接不上

请参考官方文档的相关内容:AirtestIDE使用文档--设备连接--Android连接常见问题,然后根据自己的手机型号,查看1、2节内容。

不同品牌手机的相关设置名称仅供参考,不是所有的品牌型号相关的设置名称和位置都一样,所以教程中提到的设置仅供同学们参考,如找不到完全相同的设置,请同学们仔细查找类似的设置。

8.模拟器连接不上

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.apkpocoservice-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使用文档--运行脚本的章节下面,另外利用多线程方法来进行批量运行可以参考网上的教程:

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:\test\user\project\test1.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值