备注:未经博主允许禁止转载
个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力)
笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-程序员宅基地
个人随笔:工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-程序员宅基地
参考官方博客:网易AirtestProject 的个人主页 - 动态 - 掘金
参考官方文档:欢迎使用 - Airtest Project Docs
目录
七:其他了解(注:学习的时候看到路径都是/,但我用\也可以)
3)命令参数(更多参考:Airtest — airtest 文档)
4)生成报告(更多参数:Airtest — airtest 文档)
Airtest:是一个跨平台的、基于图像识别的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS。
Poco:是一款基于UI控件识别的自动化测试框架,目前支持Unity3D/cocos2dx-*/Android原生app/iOS原生app/微信小程序,也可以在其他引擎中自行接入poco-sdk来使用。
AirtestIDE:跨平台的UI自动化测试编辑器,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写Airtest
和Poco
代码。
Airtest的官网:http://airtest.netease.com/
目前有Windows和Mac两个版本的客户端
下载最新版本
下载其他版本
安装python环境,我用的是3.6,当时学的时候3.8还未支持。
帮助文档:欢迎使用 - Airtest Project Docs
两个都勾选就是开了相对坐标(格式是(0, 0) 到 (1, 1)),以避免跨分辨率的操作点超出屏幕的问题
数字越大,清晰度越高。默认为800
用本地的会更好
连接设备后
unlock
解锁、power
电源键 、snapshot 截图
脚本运行完毕后,点击查看报告
按钮(快捷键Ctrl+L)
refresh ADB刷新状态,点击Connect初始化;如果没有显示出设备,用restart ADB重启看看
如果不行看
2.2 Android连接常见问题 - Airtest Project Docs
方法一:嵌入式
点击Windows-框选游戏窗口,选中被测程序即可,也可以拖出去
注意:
在选择状态下,点击键盘的 esc
按键、鼠标右键均可退出状态
方法二:非嵌入式
如果不行看
2.5 Windows窗口连接 - Airtest Project Docs
支持原生模拟器AVD( Android Studio里面的那个)和常见模拟器如夜神
如夜神模拟器,点击连接能看到多了一条数据
点击connect后面的下拉箭头,选择Use javacap,再点击connect
在部分版本的模拟器上,可能勾选了 use javacap
后依然连接失败,此时可以尝试再勾选 use adb orientation
选项后再重新连接即可
模拟器 | adb连接代码 |
---|---|
网易Mumu | adb connect 127.0.0.1:7555 |
夜神 | adb connect 127.0.0.1:62001 |
逍遥 | adb connect 127.0.0.1:21503 |
iTools | adb connect 127.0.0.1:54001 |
天天 | adb connect 127.0.0.1:6555 |
海马玩 | adb connect 127.0.0.1:26744 |
BlueStacks | adb connect 127.0.0.1:5555 |
在搞夜神模拟器时候,上面的操作报错了(其中一个是包没有安装的问题,一个是adb版本不一致)
通过这种方式,分别检查了sdk的adb版本、夜神的版本、airtest的版本
解决方法:
1:将sdk安装目录下的platform-tools中的adb.exe替换夜神中的adb.exe,然后在将sdk中的adb复制一份改名为nox_adb.exe,放入夜神的Nox的bin目录下
2:将airtest目录里的yosemite.apk手动安装到夜神中
当然懒的搞直接换模拟器也行,木木不错
在cmd输入adb tcpip 5555
在红色这块输入手机的那个wifi的ip(手机的wifi和电脑的网络一样),然后上面就出现设备了,点击连接即可
C:\Users\AUSU>adb shell ip -f inet addr|findstr wlan0
33: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet XXX.XXX.XXX.XX........
要有安装了Xcode的Mac电脑,可惜我没有,跳过。。。
4 ios connection - Airtest Project Docs
自动录制脚本,点击AirtestIDE左侧的Airtest辅助窗上的录制
按钮,不过这种录制生成的图片不精准,可以自己选择那些按钮,拖动生成自己想要的
touch()通过截图来 点击某个位置(截图后图片会存储在当前跟目录下)
wait ()等待某个指定的图片元素出现
swipe() 从一个位置滑动到另外一个位置
exists()执行之前,提前判断对应图片是否存在
text ()调用输入法输入指定内容
keyevent ()输入某个系统按钮键的操作,如(HOME/BACK/MENU等)
snapshot ()当前画面截图
sleep()延迟时间(s),也可以用python内的“time.sleep(10)”
assert_exists()来断言一张图片存在当前画面中
assert_not_exists()来断言不存在于当前画面中
assert_equal()断言传入的两个值相等
assert_not_equal()断言传入的两个值不相等
目前Poco
直接支持Unity3d、Cocos2d、白鹭引擎等多种游戏引擎,以及Android/iOS原生App。
如果是Android/iOS原生应用,是即插即用的,无需接入SDK。但由于游戏引擎使用OpenGL等图形接口直接渲染,而没有使用Android原生的UI系统,我们需要与游戏的Runtime进行通信获取整个UI结构。
sdk接入需要程序帮忙搞,这里我使用原生应用来学习
需要安装这2个应用
出现下方两行代码,然后就可以在UI渲染树看到UI的结构了
#安卓实例
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
#poco实例化
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
但是我这是没有的
1)从左到右分别是锁定(冻结模式),定位(检视器),录制
2)当前页面的UI层级
我这是原生应用,如果是其他的要接入SDK:如何嵌入PocoSDK(Integration Guide) — poco 1.0 文档
安装poco:(可以通过pip list看安装了什么版本)
然后报错了,输入第二个命令更新pip版本后,再试一次,不过后面还是失败,就换了个地址
pip3 install pocoui -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
但是我发现UI渲染树还是没有,原因是我用的是oppo手机,没有弹出安装PocoService
解决方法:在开发者选项->直接拉到最后->禁止权限监控,会立刻弹出PocoService,安装后就会出现渲染树了。
3)编写
生成UI节点的poco代码:
双击UI树中的目标条目,即可插入对应UI节点的poco代码。
生成UI节点的x-path代码:
UI树中的目标条目上,点击右键菜单-'UI path-code'
,即可生成完整父子链的poco代码
(3)Selenium Window
比如谷歌浏览器(属性可以看路径,找不到文件夹是因为路径隐藏了,开了就行)
这个忽略,有缘再见
# assert_exists和assert_not_exists接口的超时时间和阙值
# 这2接口查找图片的超时时间和阙值都是全局变量,timeout为20s,threasold为0.7
# 所以脚本只有在20s内找到置信度>0.7的结果,断言才会成功
如果是图片,双击可以查看识别精度
airtest自带python插件,但是精简版的,本地没有安装python
环境,或是没有安装 airtest
与 poco,也可以通过airtest的命令行在cmd里运行
通过添加PYTHONPATH设置,可以使用本地的python.exe
来运行脚本
上面还是未脱离airtest工具,想使用其他python第三方库,使用
在本地python环境中安装airtest和pocoui,然后用命令行运行脚本更好
#使用 pip 安装Airtest框架
pip install airtest
#使用 pip 安装poco框架
pip install pocoui
Pip指令运行失败
国内用户请在pip install 指令后面加上 -i https://pypi.tuna.tsinghua.edu.cn/simple后重试
参考:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
环境部署完成后,我们就能够脱离AirtestIDE,在不同的宿主机器和被测平台上运行脚本了
报错,adb版本不一致(通过adb version查),airtest的版本是40,于是我将41的覆盖掉它(airtest\core\android\static\adb\windows\)
但是又很尴尬,这样又导致,在IDE运行脚本的时候,不显示模拟器,而且会报错,于是就还是保留40版本,将40的改名字nox_adb.exe,覆盖夜神里面的,虽然会报错,但是能用
(注:后面其实用airtest40版本去覆盖sdk里面的41版本,将40也覆盖夜神的adb,同时将40改名nox_adb.exe,覆盖夜神的nox_adb.exe,这样就能真正解决了)
(如果是使用了本地的python,那需要看看python目录下的 Lib\site-packages\airtest的adb版本是否一致
)
在命令行运行又报错,这里是没有识别图片,纳尼,我文件夹有该图片呀
而且我这时候运行命令带了参数--log log/,但是显示了do not save log
后面在命令行带了参数?cap_method=JAVACAP^&^&ori_method=ADBORI^&^&touch_method=MINITOUCH(注意:特殊字符没转义,命令行被截断,所以log没有)
参考:https://airtest.doc.io.netease.com/IDEdocs/run_script/1_useCommand_runScript/#id4
运行的时候还是会识别不到图片,可能是设备太卡了,于是将wait的时间设置到60秒,然后就可以了
1)--device,指定连接的被测设备
# 什么都不填写,会默认取当前连接中的第一台手机
Android:///
# 连接本机默认端口连的一台设备号为79d03fa的手机
Android://127.0.0.1:5037/79d03fa
android://127.0.0.1:5037/127.0.0.1:62001 #连接夜神模拟器
# 连接一个Windows窗口,窗口句柄为123456
Windows:///123456
# 连接一个Windows窗口,窗口名称匹配某个正则表达式
Windows:///?title_re=Unity.*
# 连接iOS手机
iOS:///127.0.0.1:8100
参考:https://www.cnblogs.com/CincentHuang/p/11766026.html
备注:模拟器设备字符串的定义:Android://<adbhost[localhost]>:<adbport[5037]>/模拟器端口号
adbhost
是adb server
所在主机的ip,默认是本机127.0.0.1
,adb port
默认是5037
。
也可以这样:
1:在脚本编写模拟器的connect_device语句
dev = connect_device("Android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP^&^&ori_method=ADBORI")
auto_setup(__file__)
2:在纯.py脚本传入模拟器设备参数
from airtest.cli.parser import cli_setup
if not cli_setup():
auto_setup(__file__, logdir=True, devices=[
"Android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP^&^&ori_method=ADBORI",
])
2)--log,指定 log 内容和截图存放的目录
1:没传入参数--log
不保存 log 内容和截图
命令行会提示do not save log
2:传入的参数为--log log/
生成的 log 内容放到当前命令行执行目录下的 log 目录里面
3:指定目录
log 内容与截图将会放在指定目录里
--log E:/aritest/log
eg:
夜神:
airtest run C:\Users\Administrator\Desktop\chyairtest.air --device android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP^&^&ori_method=ADBORI^&^&touch_method=MINITOUCH --log F:\Airtest\log
android设备:
airtest run C:\Users\Administrator\Desktop\chyairtest.air --device android://127.0.0.1:5037/FIFIMFFEPVAIWCU8?cap_method=MINICAP_STREAM^&^&ori_method=MINICAPORI^&^&touch_method=MINITOUCH --log F:\Airtest\log --recording
注意:在这里,--log log/,我刚开始以为是我脚本文件的目录下,其实应该是C:\Users\Administrator下的log目录(C:\Users\Administrator>脚本命令)
3)--recording,运行脚本时进行录屏操作
以 MP4 格式保存在 log 内容所在的目录里面
用夜神的时候录制不了,要用android设备,于是跑的时候又报错了,点击事件没生效
这个问题是我使用了py2,后面换了py3就可以了(2和3的环境变量可以一起配,在前面的先使用)
通过airtest report + 脚本文件路径指令,下面是可用参数:
--log_root
,指定log内容和截图文件所在的目录
--outfile
,指定生成报告的目录
--lang
,指定报告语言,可以是中文/英文
--export
,导出一个包含所有资源的报告文件
--static_root
,指定静态资源文件的路径
注意:如果使用report 没有传入参数,会去脚本文件所在目录下寻找log/log.txt生成html报告,如果不存在该目录会报错
成功生成报告(在运行生成报告命令前,要运行一次脚本)
--log_root:指定log和图片目录
--outfile:指定输出报告的目录
--lang:指定语言,默认是英文(zh中文en英文)
C:\Users\Administrator>airtest report C:\Users\Administrator\Desktop\chyairtest.air --log_root F:\Airtest\log --outfile F:\Airtest\log\log.html --lang zh
[07:38:28][INFO]<airtest.report.report> F:\Airtest\log\log.html
读取报告中静态资源文件和图片文件
-- export:不使用该参数,是
绝对路径来访问里面的图片文件;同时HTML报告中访问的静态css与js资源文件,也是硬盘上的绝对路径(默认在airtest
的安装目录下的report
文件夹里)
注意:使用了export参数,outfile参数会失效
airtest report C:\Users\Administrator\Desktop\chyairtest.air --log_root F:\Airtest\log --lang zh --export F:\Airtest\log\cs\
--static_root
# 每次导出报告,都有static目录。一般来说,除非报告的样式做了某些更新,否则这些静态资源文件都是固定不变的。
# 将这些资源文件部署到静态资源文件服务器上,用例如 https://host:port/static/css/ 的路径来访问它。然后在生成报告时,将这个部署出来的服务器地址作为 --static_root的参数传过去:
--static_root https://host:port,可以避免导出报告时重复拷贝这些资源文件造成的磁盘空间占用
注意:
1:使用了POCO语句的报告,在你的报告命令行最末尾添加指令--plugin poco.utils.airtest.report
2:使用SELENIUM插件的报告指令,加入--plugin airtest_selenium.report
(4)怎么样不通过IDE使用命令行去生成和导出报告
参考:airtest.report.report module — airtest 文档
可以借助simple_report()
接口或者 LogToHtml()
类来实现
1) simple_report
生成报告(在本地看)
filepath
,脚本文件的路径,可以直接传入变量 __file__(auto_setup(__file__)
,意思是将脚本文件作为脚本路径传入,其他参数内容将默认读取运行命令行传入的参数)
logpath
,log内容所在路径,如为 True
,则默认去当前脚本所在路径找log内容logfile
,log.txt的文件路径output
,报告的到处路径,必须以 .html
结尾简化版的生成报告的接口,如果不指定参数,该接口会使用默认的参数生成1份HTML格式的报告,output='log.html'
表示在当前脚本路径下生成名为 log.html
的airtest报告
from airtest.report.report import simple_report
simple_report(__file__)
指定output
参数,则按指定路径生成报告
simple_report(__file__,output="F:\Airtest\log\log.html")
如果生成报告的路径和脚本的路径不同,比如我脚本在C盘,报告想放F盘,就会报下面这个错,虽然没影响
备注:刚刚开始学习的时候,有点懵logpath和logfile这两个参数(这2个参数好像没啥用),我在我脚本下新建了log目录,运行脚本后没看到log.txt生成,那报告是通过哪里的log.txt生成的,我在airtest设置看到log的路径(临时文件)
后面问了大佬,我才知道,我代码中的auto_setup(__file__),使用了默认的参数,不生成log文件
可以使用auto_setup(__file__,logdir=True),就能在脚本目录下的log目录生成log文件这些,如下:
刚开始我以为我运行运行后生成了log,我就可以通过logpath和logfile去生成报告(不需要再次运行脚本代码),但是发现报告要不是空的就是图片显示不了,于是我就不纠结了
直接运行脚本,在脚本后使用simple_report(__file__,logpath=True,output="C:\\Users\Administrator\Desktop\chyairtest.air\log.html")即可
2)ogToHtml
导出报告(通过脚本的形式)
from airtest.report.report import LogToHtml
脚本内容(省略)
# 脚本路径/log文件路径/log.txt路径/存放报告路径/语言/插件
chyR = LogToHtml(script_root="C:\\Users\Administrator\Desktop\chyairtest.air", log_root="C:\\Users\Administrator\Desktop\chyairtest.air\log",logfile="C:\\Users\Administrator\Desktop\chyairtest.air\log\log.txt",export_dir="F:\\Airtest\log",lang='zh',plugins=None)
chyR.report()
3)在运行脚本的时候,不免会出现报错,导致执行不下去,然后无法生成报告,可以这样
# try:
# 用例...
# 会导致失败的语句
# 用例...
# finally:
# 报告语句
注:在airtest要注意缩进,要不报错:expected an indented block
由于Airtest是python第三方库,所以当然也可以简单地调用接口来生成报告,首先,我们需要先新建脚本-选择纯.py文件,然后在创建时需要勾选生成log
其中,可以手工指定log目录的路径(logdir=“./log”)
而且,如果这里带了设备参数,在使用命令行的时候不影响,优先使用命令行的参数
if not cli_setup():
auto_setup(__file__, logdir=True, devices=["Android:///",])
文章浏览阅读141次。简介:菜鸟高手裸奔工具沙盘Sandboxie是一款国外著名的系统安全工具,它可以让选定程序在安全的隔离环境下运行,只要在此环境中运行的软件,浏览器或注册表信息等都可以完整的进行清空,不留一点痕迹。同时可以防御些带有木马或者病毒的恶意网站,对于经常测试软件或者不放心的软件,可放心在沙盘里面运行!下载地址:http://www.bytepan.com/J7BwpqQdKzR..._sandboxie系统安全工具
文章浏览阅读230次,点赞4次,收藏5次。Mac老用户都知道之前的老版本系统是可以设置一位数登陆密码的,但是更新到10.14以后就不可以了,今天就教大家怎么在新版本下设置Mac一位数登陆密码。
文章浏览阅读3.4k次。本该到此结束,但是上述实现的时候其实是把生成的每一步的奖励都使用统一的句子级reward,但该代码其实也额外按照每个token来计算奖励值的,为了获取每个token的奖励,我们在生成模型的隐层表示上,多加一个线性层,映射到一维,作为每个状态的预测奖励值。类似的,在文本生成中我们也可以用蒙特卡洛方法来估计一个模型的状态价值。假如我们只采样到了s1和s2,没有采样到s3,由于7和3都是正向奖励,s1和s2的训练后生成的概率都会变大,且s1的概率变的更大,这看似合理,但是s3是未参与训练的,它的概率反而减小了。_chatgpt使用的强化学习
文章浏览阅读433次,点赞10次,收藏8次。尝试了3种方法,都失败了!_truf计算重心
文章浏览阅读406次。学习LIS_poj 1631 hdu 1950为啥是最长上升子序列
文章浏览阅读550次。一、节点规划主机名称IP域名解析k8s-m-01192.168.12.51m1k8s-m-02192.168.12.52m2k8s-m-03192.168.12.53m3k8s-n-01192.168.12.54n1k8s-n-02192.168.12.55n2k8s-m-vip192.168.12.56vip二、插件规划#1.master节点规划kube-apiserverkube-controller-manage_sed -ie 's#image.*#image: ${ epic_image_fullname }#g
文章浏览阅读106次。UAC绕过提权_uac白名单 提权
文章浏览阅读664次,点赞7次,收藏12次。每次架设OpenVPN Server就很痛苦,步骤太多,会出错的地方也多,基本很少一次性成功的。
文章浏览阅读397次。 今天看了继承以及派生类,并且运行了教程中的一个实例,但是仍然有好多坑。主要如下:建立了一个基类bClass以及由基类bClass派生的一个dClass,并且建立两个头文件.h分别申明这两个类,在cpp程序中进行运行来检验。具体程序如下:#ifndef ITEM_BASE//为避免类重复定义,需要在头文件的开头和结尾加上如这个所示 #define ITEM_BASEclass bClass..._多个头文件相互包含
文章浏览阅读1.3w次,点赞19次,收藏88次。PyQt5安装详细教程,安装步骤很详细
文章浏览阅读154次。官方文档:https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html。_scroll-view去除滚动条
文章浏览阅读146次。S(k)=A^1+A^2...+A^k.保利求解就超时了,我们考虑一下当k为偶数的情况,A^1+A^2+A^3+A^4...+A^k,取其中前一半A^1+A^2...A^k/2,后一半提取公共矩阵A^k/2后可以发现也是前一半A^1+A^2...A^k/2。因此我们可以考虑只算其中一半,然后A^k/2用矩阵快速幂处理。对于k为奇数,只要转化为k-1+A^k即可。n为矩阵数量,m为矩阵..._a^1 a^2 ... a^k