UiAutomator2.0 - 控件实现点击操作原理
穿梭各大技术博客网站,每天都能看到一些的新的技术。突然感觉UiAutomator 2.0相对于现在来说已经是个很久远的东西了ε=(´ο`*)))。写还是不写?这是个问题(还是总结总结吧)。先说明一下这里的2.0指的是Android测试支持库的uiautomator-v18:2.1.2.jar(位置:sdk-tools-windows\extras\android\m2repository\com\android\support\test),并非sdk-tools-windows\platforms\android-'xx'路径下的 uiautomator.jar。开始进入正题....(如有不当之处还望指出批评)
一、UiObject
在2.0中保留了uiautomator.jar中的UiObject,但是将其查找方式 new Object() 更改为 findObject() .其他可见《UiAutomator1.0 与 UiAutomator2.0》。接下来先上图来看看UiObject 控件点击操作的实现过程。(为方便只画了一张图,图画的不是很好,可能还有些问题(/ω\)。欢迎指正批评 )

先从蓝色字体来看,自动化测试脚本在测试设备上实现控件点击操作可以分为3步:首先要对设备控件操作就得获得一个UiDevice对象;其次在该设备上获取要操作的UiObject对象;最后对该设备的控件进行操作(如:点击,滑动,拖拽等)
- UiDevice:[绿色部分]
从图中就可以知道是通过Instrumentation获得 UiDevice的实例对象,而至于具体Instrumentation的获取,可自行搜索"Instrumentation原理"。 - UiObject : [浅黄色部分]
要得到一个UiObject对象,首先得构造一个控件选择器对象,而选择器的标准则是依据该控件的具体属性。
当创建一个UiObject引用对象且有一个选择器标准时,此时分两步:一是将其属性及属性值存储在稀疏数组中;二是结合UiDevice#findObject方法构造UiObject对象。也就是说这时的 UiObject 并没有直接绑定到视图作为引用对象。 - clickAndWaitForNewWindow/click :[红色部分]
控件点击操作有两种:点击等待新窗口/点击。当控件调用点击等待新窗口方法,才开始在设备上对控件进行查找匹配-点击-等待窗口事件.
通过QueryController#findAccessibilityNodeInfo方法:首先等待设备空闲,获取当前窗口可访问性节点信息。以此时点击操作的选择器标准作为匹配条件,遍历稀疏数组中的属性与可访问性节点信息相关属性是否匹配。若匹配,则返回该选择器对应的AccessibilityNodeInfo对象;否则抛出UiObjectNotFoundException。然后通过该节点信息得到控件中心坐标点。
通过InteractionController#runAndWaitForEvents方法:首先启动线程执行点击操作---本质是将MotionEvent.ACTION_DOWN以及中心坐标点作为运行事件进行注入,等待100ms,再将MotionEvent.ACTION_UP进行注入。然后在指定(5500ms)的等待时间内监听事件AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED |AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
最后看到设备点击操作后,等待窗口内容或状态更新(如:启动新的Activity,Pop-up弹框,对话框...)
注:若点击操作后未出现监听到窗口内容或状态事件则等待最大时长。点击操作和点击等待新窗口的区别在于: 等待事件不一样、等待时间不一样
二、UiObject2
UiObject2是 2.0中新增的类,功能与UiObject大体一致。区别在于其选择器、控件的查找方式、控件对象的生命周期。也上张图来看看吧!

先从蓝色字体来看,UiObject与 UiObject2的区别在于 第二步和第三步。UiObject2中的使用的新的 选择器 By 和 点击方法 clickAndWait()
- UiDevice:[绿色部分]
与UiObject 是一致的情况。 - UiObject2 : [红色->粉红部分]
通过By 静态工厂构造选择器对象。图中可以看出此时直接与AccessibilityNodeInfo进行匹配(也就是与当前窗口),存在控件则进入下一步,最多等待10s,判断当前窗口是否刷新,刷新则抛出控件过时异常。所以可以看出使用UiObject2的方式时 控件与视图是处于绑定的状态。 - clickAndWait/click :[红色部分]
与Object的点击方式不同:点击等待指定事件条件,且将x,y构造成Point对象,然后再包装成指针手势(点击,长按,滑动等)。其余操作类似,执行手势线程使用手势控制器将点击操作进行注入,与此同时监听当前指定事件。最后设备进行相应的操作。
注:Until 只提供了2个事件条件:Until.newWindow() 和 Until.scrollFinished(Direction direction)
UiAutomator2.0 - 控件实现点击操作原理的更多相关文章
- Android 使用代码主动去调用控件的点击事件(模拟人手去触摸控件)
使用代码主动去调用控件的点击事件(模拟人手去触摸控件) //View 可以是LinearLayout,Button,TextView View.performClick();
- Kinect用体感来实现UI控件的点击
用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...
- 微软 microsoft calendar control 11.0 控件下载
微软 microsoft calendar control 11.0 控件下载 https://files.cnblogs.com/files/mqingqing123/csccal2.rar
- android中RecyclerView控件实现点击事件
RecyclerView控件实现点击事件跟ListView控件不同,并没有提供类似setOnItemClickListener()这样的注册监听器方法,而是需要自己给子项具体的注册点击事件. 本文的例 ...
- 【Unity/Kinect】Kinect实现UI控件的点击
用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...
- 【MAUI】为 Label、Image 等控件添加点击事件
一.前言 已经习惯了 WPF.WinForm 中"万物皆可点击"的方式. 但是在 MAUI 中却不行了. 在 MAUI 中,点击.双击的效果,是需要通过"手势识别器&qu ...
- Android简单的ListViewDemo及每个控件的点击事件
ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...
- Android监听Button和ImageButton控件的点击事件
一.onClick事件 Button和ImageButton都有一个onClick事件,通过自身的.setOnClickListener(OnClickListener)方法添加点击事件 所有的控件都 ...
- Button控件的点击事件
Java的代码 主要重点: findViewById(); OnClickListener() package com.example.admin.myapplication; import andr ...
随机推荐
- Spring Bean's life
In contrast, the lifecycle of a bean in a Spring container is more elaborate. It’simportant to under ...
- call, apply 和 bind 方法
我们知道,每个函数在调用的时候会产生一个执行上下文环境,而这个执行上下文环境中包含了诸如 this 等等信息.即当我们调用函数的时候,内部的 this 已经明确地隐式绑定到了某一个对象上.如果我们希望 ...
- P1339 [USACO09OCT]热浪Heat Wave
我太lj了,所以趁着夜色刷了道最短路的水题....然后,,我炸了. 题目描述: The good folks in Texas are having a heatwave this summer. T ...
- 数论ex
数论ex 数学学得太差了补补知识点or复习 Miller-Rabin 和 Pollard Rho Miller-Rabin 前置知识: 费马小定理 \[ a^{p-1}\equiv 1\pmod p, ...
- centos7服务器配置nuxt部署环境
一.安装node(默认安装在根目录下) 1.首先安装wget yum install -y wget 2.下载最新nodejs安装包 wget https://nodejs.org/dist/v10. ...
- (模拟) codeVs1083 && 洛谷P1014 Cantor表
题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/ ...
- 标签传播算法(Label Propagation Algorithm, LPA)初探
0. 社区划分简介 0x1:非重叠社区划分方法 在一个网络里面,每一个样本只能是属于一个社区的,那么这样的问题就称为非重叠社区划分. 在非重叠社区划分算法里面,有很多的方法: 1. 基于模块度优化的社 ...
- OA系统开发人事模块关于请假跨月的处理
前言:其实对于跨月的数据单独处理是不难的,但是对于后台显示页面,肯定不是单纯拼接一个where条件的,因此在我的项目也是如此,并不能够用普遍的方法来处理,此时就想尽量用简单的方法来处理跨月数据的准确性 ...
- 【LOJ 6041】「雅礼集训 2017 Day7」事情的相似度
Description 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的 ...
- Exp2 后门原理与实践 20164314 郭浏聿
1.实践内容 (1)使用nc实现win,Linux间的后门连接. 热身 (2)使用netcat获取主机操作Shell,cron启动. (3)使用socat获取主机操作Shell, 任务计划启动. (4 ...