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。开始进入正题....(若有不当之处还望指出批评)android

1、UiObject

在2.0中保留了uiautomator.jar中的UiObject,可是将其查找方式 new Object() 更改成 findObject() .其余可见《UiAutomator1.0 与 UiAutomator2.0》。接下来先上图来看看UiObject 控件点击操做的实现过程。(为方便只画了一张图,图画的不是很好,可能还有些问题(/ω\)。欢迎指正批评 )
windows

先从蓝色字体来看,自动化测试脚本在测试设备上实现控件点击操做能够分为3步:首先要对设备控件操做就得得到一个UiDevice对象; 其次在该设备上获取要操做的UiObject对象; 最后对该设备的控件进行操做(如:点击,滑动,拖拽等)数组

  1. UiDevice:[绿色部分]
    从图中就能够知道是经过Instrumentation得到 UiDevice的实例对象,而至于具体Instrumentation的获取,可自行搜索"Instrumentation原理"。
  2. UiObject : [浅黄色部分]
    要获得一个UiObject对象,首先得构造一个控件选择器对象,而选择器的标准则是依据该控件的具体属性。
        当建立一个UiObject引用对象且有一个选择器标准时,此时分两步:一是将其属性及属性值存储在稀疏数组中;二是结合UiDevice#findObject方法构造UiObject对象。也就是说这时的 UiObject 并无直接绑定到视图做为引用对象。
  3. 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弹框,对话框...)

注:若点击操做后未出现监听到窗口内容或状态事件则等待最大时长。点击操做和点击等待新窗口的区别在于: 等待事件不同、等待时间不同测试

2、UiObject2

UiObject2是 2.0中新增的类,功能与UiObject大致一致。区别在于其选择器、控件的查找方式、控件对象的生命周期。也上张图来看看吧!
字体

先从蓝色字体来看,UiObject与 UiObject2的区别在于 第二步和第三步。UiObject2中的使用的新的 选择器 By 和 点击方法 clickAndWait()网站

  1. UiDevice:[绿色部分]
    与UiObject 是一致的状况。
  2. UiObject2 : [红色->粉红部分]
    经过By 静态工厂构造选择器对象。图中能够看出此时直接与AccessibilityNodeInfo进行匹配(也就是与当前窗口),存在控件则进入下一步,最多等待10s,判断当前窗口是否刷新,刷新则抛出控件过期异常。因此能够看出使用UiObject2的方式时 控件与视图是处于绑定的状态。
  3. clickAndWait/click :[红色部分]
    与Object的点击方式不一样:点击等待指定事件条件,且将x,y构形成Point对象,而后再包装成指针手势(点击,长按,滑动等)。其他操做相似,执行手势线程使用手势控制器将点击操做进行注入,与此同时监听当前指定事件。最后设备进行相应的操做。

注:Until 只提供了2个事件条件:Until.newWindow() 和 Until.scrollFinished(Direction direction)ui

相关文章
相关标签/搜索