WiFi 统一管理以及设备自动化测试实践
ATX 安卓设备 WiFi 统一管理以及设备自动化测试实践 (零散知识梳理总结)
此文为转载,感谢作者
众所周知,安卓单台设备的UI自动化测试已经比较完善了,有数不清的自动化框架或者工具。但是介绍多设备管理的内容并不多,当手里的手机多了之后,要做自动化测试平台,这块的东西又不得不碰,摆脱USB限制,接入WiFi,才能更加自由
框架介绍
1.ATX
ATX(AutomatorX) 是一款开源的自动化测试工具,支持测试iOS平台和Android平台的原生应用、游戏、Web应用。 使用Python来编写测试用例,混合使用图像识别,控件定位技术来完成游戏的自动化。附加专用的IDE来完成脚本的快速编写。
atx-agent
运行在手机的内部,为手机增加了远程控制,自动化的功能。atx-server
最重要的功能,是将atx-agent
汇总到一个网页上展示,并提供一个API可以获取所有设备的列表
2.uiautomator
UIAutomator是为数不多的Android官方支持的自动化框架之一,UIAutomator随着Android版本发布而更新。作为基于控件的自动化框架,UIAutoamtor的整体框架及API简单明晰,非常容易上手,发布后便受到了不少开发人员的好评,但仍有部分开发人员觉得不支持resourceId检索控件有点儿可惜。官方在随后的Level 18中弥补了这一缺憾,至此,UIAutomator便在自动化测试领域占据了一席之地,满足了大部分开发人员的需求。
UIAutoamtor较于其他自动化框架有什么特性呢?笔者觉得可以用粗暴但灵活、简单可依赖来形容,其细数的优势有很多,
概括起来有以下几点
官方支持更新: Android原生支持,测试依赖环境少,创建方便。·
层次接口明晰: 框架层次结果分明,API明晰,上手成本很低。
基于控件交互: 支持Android原生控件解析,比坐标交互兼容性更强。
不依赖于源码: 测试过程基于黑盒进行,对所有发行版本都可以测试。
事件等待优秀: 在事件等待方面接口丰富,控制灵活精确,表现优秀。
支持跨进程测试: 在自动化框架中,具备此特性的不多,测试范围在ROM。
在技术选型方面,除了涉及Web的测试,UIAutomator基本上都可以帮用户实现。如果用户想做ROM层级的测试,或是App间
协作需跨进程的测试,那UIAutomator将是非常好的选择;用户渴望写出简单易懂而功能强大的代码,也不妨选择一
试,UIAutomator可以让用户在事件等待方面看到它优雅的一面;没有代码没关系,想要竞品对比也可以,单元测试、性能测
试、压力测试,UIAutomator都可以成为用户的选择;简单而不简约,留给开发人员更自由的发挥空间,轻巧灵动,强大可靠,
这就是UIAutomator
3.python-uiautomator2
python-uiautomator2封装了谷歌自带的uiautomator2测试框架,提供便利的python接口。他允许测试人员直接在PC上编写Python的测试代码,操作手机应用,完成自动化,大大提高了自动化代码编写的效率。
如图所示,python-uiautomator2主要分为两个部分,python客户端,移动设备
- python端: 运行脚本,并向移动设备发送HTTP请求
- 移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。
整个过程
在移动设备上安装
atx-agent
(守护进程), 随后atx-agent
启动uiautomator2服务(默认7912端口)进行监听在PC上编写测试脚本并执行(相当于发送HTTP请求到移动设备的server端)
移动设备通过WIFI或USB接收到PC上发来的HTTP请求,执行制定的操作
API介绍
github:https://github.com/openatx/uiautomator2
中文翻译:https://blog.csdn.net/qq_38071435/article/details/80003212
1、安装:
pip install --pre uiautomator2
#或者你可以直接从github上源码安装
git clone https://github.com/openatx/uiautomator2
pip install -e uiautomator2
pip install pillow #截屏工具
2、初始化手机,需要的环境SDK
python -m uiautomator2 init
这个只有初始化后才可以用
pip install --pre --upgrade weditor#安装自动化UI定位
python -m weditor#启动
自动安装本库所需的设备端程序:uiautomator-server ,atx-agent ,openstf / minicap ,openstf / minitouch 可单独下载安装
配置工作完成
3、打开手机端口:adb forward tcp:7912 tcp:7912
连接手机:device_ip = 127.0.0.1
这个不知道干嘛的忘记了好像是是自行安装atx-agent的时候用的
4、常用命令:
1、安装apk:python -m uiautomator2 install $ device_ip https://example.org/some.apk
2、清缓存:python -m uiautomator2
3、停止所有应用程序:python -m uiautomator2 app-stop-all $ device_ip
4、截图:python -m uiautomator2截图$ device_ip screenshot.jpg
5、检查守护线程:d.healthcheck()
6、打开调试:d.debug = true
7、获取连接信息:d.info
8、shell命令:d.adb_shell('pwd')
9、分辨率:d.window_size()
10、查看当前应用信息:d.current_app()
11、查看序列号:d.serial
5、快速开始:
import uiautomator2 as u2
#通过WIFI
d = u2.connect('10 .0.0.1')#u2.connect_wifi('10 .0.0.1')的#别名
#通过usb获取设备
d = u2.connect('123456f')#u2.connect_usb('123456f')的#别名
6、系统操作:
1、安装,只指出url:d.app_install('http://some-domain.com/some.apk')
2、启动:d.app_start(“com.example.hello_world”)#以包名称开头
3、停止应用:d.app_stop(“com.example.hello_world”)
d.app_clear('com.example.hello_world')
停止所有应用:d.app_stop_all()
5、推送一个文件到手机:d.push(“foo.txt的”,“/ SD卡/”)
6、推和重命名:d.push(“foo.txt的”,“/sdcard/bar.txt”)
7、推送并更改文件模式:d.push(“foo.sh”,“/ data / local / tmp /”,mode = 0o755)
8、从设备中拉取文件:d.pull(“/ sdcard / tmp.txt”,“tmp.txt”)#如果文件在设备上找不到,FileNotFoundError将会出现
d.pull(“/ sdcard / some-file-not-exist.txt”,“tmp.txt”)
7,应用连接会话:
1、启动应用:sess = d.session(“com.netease.cloudmusic”
2、会话连接运行中的程序:sess = d.session(“com.netease.cloudmusic”
3、检测应否崩溃:SESS(文字= “音乐”)点击()
检查会话是否正常:sess.running()
8,手机硬件操作
1、d.screen_on()#打开屏幕d.screen_off()#关闭屏幕
2、获取当前屏幕状态:d.info.get('screenOn')#android 4.4
3、按软/硬件
d、press(“home”)#按home键,用键名
d、press(“back”)#按返回键,与主要的名称
d、press(0x07,0x02)#按下键码0×07(“0”)与META ALT(0x02)
d、unlock()解锁屏幕
实践代码
所用到的设计模式
PageObject设计模式:
1.是将某个页面的所有"元素(包含控件)属性"及"元素操作"封装在1个类(Class)里面~~~~
- 目的: 测试代码与被测页面对象代码分离,后期如果有页面元素发生了更改,只需要修改相应页面对象的代码(即对应Class文件),而不需要修改测试代码
- 尽量采用xpath方式来寻找页面元素,而不建议使用name,Link等方法; xpath是基于页面元素所处区域,一般不会发生变化,测试代码基本不受干扰.
- 将页面元素属性信息与代码分离,即与被测对象代码分离,目的也是为了进一步降低后续因页面变化带来的维护成本
def install(d):#安装元素选择
lists = ["com.kingroot.kinguser:id/button_right", "vivo:id/vivo_adb_install_ok_button", "android:id/button1",
"com.android.packageinstaller:id/decide_to_continue"]
while True:
for i in lists:
anzhuang(i,d)
def anzhuang(string,d):#元素触发
try:
s = d(resourceId=string)
if s.exists:
s.click()
except:
pass
从ATX-server中获取当前可用设备列表
1.在 ATX server自带的设备管理页面中,列出了当前可用的设备列表。于是尝试从这个页面的网络请求中获取设备列表,果然有收获:
从 list 这个请求中,通过 present 属性,获取当前可用的设备列表,就可以逐个调用进行测试了。
def getDevices():#获取在线ip
url=r'http://192.168.1.110:8000/list'.encode()
r=requests.get(url)
deviceList=[]
content=json.loads(r.text)
for device in content:
if device['present']:
deviceList.append(device['ip'])
print(device['ip'])
python启动以及关闭服务
开启服务
obj1=subprocess.Popen(['rethinkdb','--http-port','8090'],cwd=r'C:\rethinkdb-2.3.6',shell=True, stdout=subprocess.PIPE)
obj2=subprocess.Popen(['atx-server','--port','8000'],cwd=r'C:\Users\外网\go\src\github.com\openatx\atx-server',shell=True,stdout=subprocess.PIPE)
obj3=subprocess.Popen(['python','-m','http.server','8888'],cwd=r'C:\Users\外网\Desktop',shell=True,stdout=subprocess.PIPE)
关闭服务
subprocess.Popen('TASKKILL /F /IM rethinkdb.exe', shell=True, stdout=subprocess.PIPE)
subprocess.Popen('TASKKILL /F /IM atx-server.exe', shell=True, stdout=subprocess.PIPE)
subprocess.Popen('TASKKILL /F /IM python.exe',shell=True, stdout=subprocess.PIPE)
框架API使用
iplist=getDevices()
for ip in iplist:#
d = u2.connect('%s'%ip.strip())
d.unlock()
d.healthcheck()
d.app_uninstall_all()
az=threading.Thread(target=install,args=(d,))
az.start()
package=d.app_install('http://192.168.1.110:8888/T11.apk')
#d.disable_popups()
print(package)
d.app_start(package)
WiFi 统一管理以及设备自动化测试实践的更多相关文章
- ATX 安卓设备 WiFi 统一管理以及设备自动化测试
众所周知,安卓单台设备的UI自动化测试已经比较完善了,有数不清的自动化框架或者工具.但是介绍多设备管理的内容并不多,当手里的手机多了之后,要做自动化测试平台,这块的东西又不得不碰,摆脱USB限制,接入 ...
- Lego-美团点评接口自动化测试实践
Lego-美团点评接口自动化测试实践 2018-02-07 转自:Lego-美团点评接口自动化测试实践 目录 一.概述 1.1 接口自动化概述 1.2 提高ROI 针对“减少投入成本” ...
- 【巨杉数据库SequoiaDB】巨杉数据库无人值守智能自动化测试实践
刚刚过去的春节,新型冠状病毒疫情突如其来地横扫大江南北.为了响应国家号召,许多软件公司和互联网公司也将在较长一段时间内建议员工采取远程办公的方式,同时也存在骨干工程师无法及时返岗的问题,使得生产力大受 ...
- Lego:美团点评接口自动化测试实践
概述 接口自动化概述 众所周知,接口自动化测试有着如下特点: 低投入,高产出. 比较容易实现自动化. 和UI自动化测试相比更加稳定. 如何做好一个接口自动化测试项目呢? 我认为,一个“好的”自动化 ...
- [原创]django+ldap实现统一认证部分二(python-ldap实践)
前言 接上篇文章 [原创]django+ldap实现统一认证部分一(django-auth-ldap实践) 继续实现我们的统一认证 python-ldap 我在sso项目的backend/lib/co ...
- [原创]django+ldap实现统一认证部分一(django-auth-ldap实践)
前言 接之前我的文章,django+ldap+memcache实现单点登录+统一认证 ,ldap部署相关,ldap双机\LAM配置管理\ldap备份还原,目前来说,我们已经有了高可用性的ldap环境了 ...
- 分享——张南《从Desktop到Mobile的自动化测试实践》
张南在top100summit(14年)上分享了google从Desktop到Mobile的自动化测试实践,这里分享一下 案例简述 随着每年移动用户量的增长,移动网络速度以及覆盖力的增强,移动设备逐年 ...
- Android Studio配置统一管理依赖版本号引用
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo采用的是其中一个方案,其他方案请阅读参考资料<Android Studio中统一管理版本号引用配置> 使用步骤 ...
- 基于kubernetes自研容器管理平台的技术实践
一.容器云的背景 伴随着微服务的架构的普及,结合开源的Dubbo和Spring Cloud等微服务框架,宜信内部很多业务线逐渐了从原来的单体架构逐渐转移到微服务架构.应用从有状态到无状态,具体来说将业 ...
随机推荐
- Git for Windows之分支管理、分支合并、解决分支冲突
分支是在稳定版本出现bug的情况下,通过分支技术,在保证稳定版本稳定的情况,修改稳定版本的(差异下载的,速度极快,不同于SVN等技术,会将所有的代码下载到本地)副本,通过合并,解决冲突,最后回归到稳定 ...
- Composite组合模式(结构型模式)
1.概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2.案例 需要构建一个容器系统,需要满足以下几点要求: (1). ...
- C# 字符串操作基本过程(Equals、Compare、EndsWith等处理方法)
本文只介绍了比较方法,但是EndsWith,IndexOf等方法均采用相同的过程,先设置CultureInfo(一般情况下调用当前线程的CultureInfo,该语言文化可以通过控制面板设置),然后调 ...
- linux下的进程(孤儿进程、僵尸进程)
linux提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到.这种机制就是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开文件,占用的内存等.但是仍然为其保留一定的信息 ...
- spring security的简单应用
本文只包涵spring security配置部分,不是一个完整项目,不过可以任意添加到一个web项目中,不需要对原来的程序做任何修改 部分内容来源于网络,如有雷同,毫无意外 1.xml配置文件 < ...
- Visual Studio 2017 取消 break mode
用 Visual Studio 2017 (以下简称 VS 2017) 运行程序,程序出错后,只是进入中断模式,仅显示 The application is in break mode而没有像 VS ...
- Tomcat学习总结(15)—— Tomcat优化时的参数分析
(1).maxHttpHeaderSize=”8192” 此选项用于配置:来自于客户端请求的Request和Response的HTTP header 的最大长度,以字节计算.如果不设置,该属性为409 ...
- Golang 函数function
函数function Go函数不支持嵌套.重载和默认参数 但支持以下特性: 无需声明原型 不定长度变参 多返回值 命名返回值参数 匿名函数 闭包 定义函数使用关键字func,且左大括号不能另起一行 函 ...
- [USACO 06DEC]Milk Patterns
Description 题库链接 给定一个长度为 \(n\) 的字符串,求至少出现 \(k\) 次的最长重复子串,这 \(k\) 个子串可以重叠. \(1\leq n\leq 20000\) Solu ...
- git将本地项目发布到远端
如果本地有个项目myapp之前没在git上,想上传到git仓库保存,操作如下 1. 在gitee或者github上创建一个新仓库 仓库 2. 在控制台进入本地已有的项目文件夹下 cd myapp 3. ...