引言: UIAutomator作为基于控件的自动化框架的一种,具备的强大兼容性及应用的灵活性, 可以很好地帮助我们解决自动化过程中的问题。
特点: 粗暴但灵活、 简单可依赖 缺点:无法对web做解析。
uiautomator的框架有9个类,分别是 ·UIAutomationSupport: UI测试信息拓展类。 ·UIAutomatorTestCase: UI测试基类。 ·UICollection: UI测试控件集合。 ·UIDevice: UI测试设备抽象。 ·UIObject: UI测试控件抽象。 ·UIObjectNotFoundException: UI测试控件无法找到的异常。 ·UIScrollable: UI测试可滚动控件。 ·UISelector: UI测试控件选择器。 ·UIWatcher: UI测试界面观察者 uiautomator的常用API
1.UiDevice: 设备对象,通过UiDevice的getInstance(instrumentation)方法获取,可以通过UiDevice实例来检测设备的各种属性,比如获取屏幕的方向、尺寸等
2.UiObject 通过uiDevice的findObject()方法获取可以获取手机控件,然后就可以对UI控件进行相关的操作,比如点击、长按等:
对于手机软件中控件的描述可以通过UIAutomator获取到
UIAutomator的原理: 作为基于控件的自动化测试框架, 有两件比较重要的事情, 即界面解析和事件注入。 界面解析以获取目标控件, 事件注入以完成操作交互。在UIAutomator自动化测试过程中, 界面解析和事件注入最终都依赖于UiAutomation来完成, 而UiAutomatorBridge相当于UiAutomation的代理, 作为两者之间调用的桥梁, 几乎所有事件的处理及交互, 都经过UiAutomatorBridge进行派发。 UiAutomatorBridge与UiAutomation的关系: UiAutomatorBridge持有UiAutomation的实例作为成员变量, QueryController及InteractionController在执行事务的时候, 会通过UiAutomatorBridge来获得UiAutomation的实例进行调用。 UiAutomatorBridge与UiDevice的关系: UiDevice成员变量中拥有UiAutomatorBridge的实例, 视其为UiAutomation的代理, 所有与界面解析及事件注入相关的事务, 都调用UiAutomatorBridge来进行。 UIAutomator界面解析和事件注入的流程, 可以稍做总结如下: ·UIAutomator界面解析、 事件注入均由UiAutomation来完成。 ·UiObject对象可以理解成使用时才被实例化, 每次调用都会重新解析实例化。 ·UIAutomator的操作事件非基于控件, 最终都转换为坐标执行。 ·控件遍历过程中每次只返回一个节点信息而不是控件树, 效率比较低
编写UIAutomator自动化测试脚本大体过程: 1.使用UIAutomator2中的instrumentation框架,调用UIdevice,UIobject这些常用的类。 2.最后通过实例化UIdevice,创建测试用例,调用一些常用的API来实现模拟用户操作的过程。
一个简单的小demo: 我用UIAutomator创建一个简单的相机自动化测试流程:
1、使用Android SDK自带的UIAutormatorViewer界面解析器来进行界面解析。通过点击界面中的目标控件,获得空间的元素属性(如text,description,resource-id,package等),这些属性在后面操作控件的方法API中会用到。 2.创建测试用例,编码模拟用户操作过程
a). 在执行测试用例前运行setup(),用于环境准备。(调用instumentation框架啊,实例化UIdevice类啊) b). 写测试用例
设置循环执行测试1200次,执行完一轮就打印一下次数 点击“相机”控件 打开相机后,点击拍照按钮 转换前后摄像头,再次拍照 切换相机到AICamera模式,再拍照 .......
(每次执行一个测试用例,延迟时间2~3秒,让相机有反应时间) 一旦相机出现crash或者ANR问题,就跳出执行测试用例的循环,打印出当前时间(以便在log在文件中查找),并执行让手机截屏命令,将问题图片以“报错时间”来命名,保存在sdcard中。 最后我们可以看到执行完测试测试后输出的日志。
【最后两步可以看一下下面程序:
|