Airtest的报告是可以打包发给别人看的。
① 想要导出报告发给别人观看,我们需要生成报告的命令中传入 --export 参数,这样就可以将 包含静态资源文件和图片文件的报告 导出到一个指定的文件夹内,之后直接将整个文件夹发送给别人观看即可。
② 如果生成报告时不传入 --export 参数,那么报告中的静态资源文件和图片文件将使用 绝对路径 来访问,此时将整个文件夹发给别人观看,别人也是无法正常观看的。
可以使用如下代码:
import traceback
try:
xxxx
except:
log("出错啦", traceback. format_exc())
在脚本运行的时候, 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进行过滤了。
① 使用 xcode 部署 iOS-Tagent或WDA 需要在macOS完成
② 部署好以后可以在macOS或Windows机器上连接到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输入框内容的删除。
① 在本地运行脚本时自定义:
# quality取值[1,99],airtest默认取10,希望获得更高精度可以取值75
airtest run xxx --compress 75
② 在脚本中自定义(优先级高于在命令行自定义):
自定义全局的截图压缩精度:
import airtest.core.api import *
ST.SNAPSHOT_QUALITY = xxx
自定义单张截图的压缩精度:
snapshot(quality=my_quality)
…
脚本运行到输入密码时,手机弹出了安全键盘,但是在Airtest中却不显示这个安全键盘,这是为什么?
其实这个是正常现象,Airtest不会录制有安全键盘的画面,但是各种输入操作还是正常进行的。
Airtest局部截图+找图、截屏另存为
Airtest没有提供专门的API给我们进行多图查找,但是我们可以用简单的语法来实现:
picList = [pic1,pic2,pic3] # 截图的图片对象列表
for pic in picList:
pos = exists(pic)
if pos:
touch(pos)
break # 只要找到图片列表中的任何一张图片,就执行touch
典型的python语法错误,常见于脚本未换行、缩进错误、缺少 " 或者 ( 等。
如需点击软键盘上面的 search 按钮,则:
text("文本",enter=False,search=True)
同理,如需输入后回车,则 text(“文本”,enter=True) ,不需要回车则, text(“文本”,enter=False) 。
应用的登录页面或者密码界面一般都不给截屏录屏的,同学们可以检查看看你的测试设备的设置里面,有没有安全键盘、防止恶意截屏录屏之类的设置,关掉就行。
如果是App本身做的安全机制,需要让开发打一个测试的包看能不能去掉。
这个报错可能出现在不同的方法里面,比如:
AttributeError: 'NoneType' object has no attribute 'snapshot'
AttributeError: 'NoneType' object has no attribute 'start_app'
出现这些报错,基本上都是因为同学们在脚本中没有连接设备,所以只要在脚本开头,补充上连接设备的脚本即可。
如果开了网络代理的话,需要先 关闭各种代理和VPN ,否则可能会影响到poco通讯
检查手机助手内是否对 pocoservice.apk 做了限制,例如在某版本的华为手机中需要开启 允许自启动 和 允许后台活动。
这里我们列举几个常见手机品牌的设置方式:
华为:手机管家-应用启动管理-PocoService.apk-手动管理,允许自启动开启,允许后台活动开启
OPPO:设置-电池-应用耗电管理-PocoService.apk-允许应用自启动,允许完全后台行为
VIVO:电池-后台高耗电-> PocoService 开启
一加:设置-电池优化-PocoService-不优化
当然,不同手机品牌,甚至同品牌不同型号手机的配置方式,都有可能不大一样,同学们要自己查找手机里面与 电池优化 和 后台活跃 相关的设置即可,保证给 pocoservice.apk 足够的活跃权限且不被电池优化行为干掉。
不能和uiautomator同时启动,否则会相互冲突
可以尝试 重启手机 / 重装pocoservice 看看是否会恢复
目前只有原生应用可以直接使用poco(无需接入pocoSDK),非原生应用,比如各种游戏应用、H5小程序、混合开发的应用等,都不能直接使用poco拿取控件,绝大多数的游戏支持接入对应引擎的pocoSDK之后,可以获取控件信息。
有时候IDE自动生成的poco定位脚本会非常长,层级也非常深,回放时可能出现找不到控件的情况;这时不建议同学们直接使用自动生成的定位脚本,可以根据UI树详情,另外编写更精简的定位脚本,推荐使用正则匹配来进行脚本定位会好一些。
如果定位脚本是同学们自己编写的,请检查对应的属性或者层级关系,看是否是脚本错误而导致找不到元素。
如出现单独选中调试脚本,可以找到控件,但实际运行脚本又容易找不到控件,建议在该条定位脚本之前添加足够的 sleep() ,确保画面跳转稳定后,再来查找控件。
很多新手在使用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的时候,千万记住要检查下这几条代码的顺序,避免产生不必要的报错。
在同一个脚本内,支持初始化多个不一样的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,就有可能导致奇奇怪怪的错误出现。
下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】