[UiAutomator] UiSelector中instance与index的用法

在使用UiAutomator写测试用例时,最常用到的就是控件查找操作。

在UiSelector中,有两个定位控件的方法,一个是instance,一个是index。那么这两个方法有什么区别呢?

首先,我们看一下官方api说明:

instance(int instance):
Set the search criteria to match the widget by its instance number. The instance value must be 0 or greater, where the first instance is 0. For example, to simulate a user click on the third image that is enabled in a UI screen, you could specify a a search criteria where the instance is 2, the className(String) matches the image widget class, and enabled(boolean) is true. The code would look like this: new UiSelector().className("android.widget.ImageView") .enabled(true).instance(2);

index(int index):
Set the search criteria to match the widget by its node index in the layout hierarchy. The index value must be 0 or greater. Using the index can be unreliable and should only be used as a last resort for matching. Instead, consider using the instance(int) method.

也就是说instance方法会将界面上所有相同类型的控件按顺序取出来,放到一个集合里(暂且这么理解吧,不知道放哪里了,囧),然后按照控件在集合的角标把想要的控件取出来;而index则是通过该控件所在层级的节点角标将对应的控件取出来。

那么这两个方法到底是怎么使用的呢?看下面的例子:

首先我们通过xml定义一个布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="textview1"
        android:textSize="22sp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button1" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="textview2"
        android:textSize="22sp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button2" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="textview3"
        android:textSize="22sp" />

</LinearLayout>

使用UiAutomatorViewer截出来的图是这样的:

按照说明,使用index方法获取TextView控件是这样的:

UiObject obj = new UiObject(new UiSelector().className("android.widget.TextView").index(0)); // textview1
UiObject obj = new UiObject(new UiSelector().className("android.widget.TextView").index(2));  // textview2
UiObject obj = new UiObject(new UiSelector().className("android.widget.TextView").index(4));  // textview3

哎,等等,尼玛!为啥我第一个方法取到的UiObject是“TestUI”,原来在我们的TitleBar上也有一个TextView控件,而它的节点角标也是0(见下图)。这是不是太坑爹了?先不要埋怨,人家api文档都说的很清楚了,这是一个不靠谱(unreliable)的方法,其他方法都不好使了才建议去尝试此方法。

下面把使用instance方法获取TextView控件的方法写出来:

UiObject obj = new UiObject(new UiSelector().className("android.widget.TextView").instance(0)); // TestUI
UiObject obj = new UiObject(new UiSelector().className("android.widget.TextView").instance(1)); // textview1
UiObject obj = new UiObject(new UiSelector().className("android.widget.TextView").instance(2));  // textview2
UiObject obj = new UiObject(new UiSelector().className("android.widget.TextView").instance(3));  // textview3

怎么样,使用instance方法就靠谱多了吧。

本次分享到此结束,欢迎大家与我一起交流。

============================2014-12-25 分割线===================

今天上网看博客,发现index方法还有一种用法,就是在UiObject.getChild()方法里使用。还是以上面的UI为例。

如果我们想要获取textview1对应的TextView控件,首先找到它的父控件LinearLayout,而LinearLayout又是FrameLayout的子控件(如下图)。

所以,获取textview1的代码大概是这样:

UiObject viewObj = new UiObject(new UiSelector().className("android.view.View")); // 获取View控件
UiObject flObj = viewObj.getChild(new UiSelector().index(1)); // 获取FrameLayout控件
UiObject llObj = flObj.getChild(new UiSelector().index(0)); // 获取LinearLayout控件
UiObject tv1Obj = llObj.getChild(new UiSelector().index(0)); // 获取textview1对应的TextView控件

怎么样?还是instance好用吧!

时间: 2024-11-08 23:21:39

[UiAutomator] UiSelector中instance与index的用法的相关文章

Oracle中HINT的30个用法

在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消

关于数组方法中delete()与splice()的用法与不同点

关于数组方法中delete()与splice()的用法与不同点 一.delete arr[i]  删除数组的指定索引的项,删除的时候该项还是会占据原来数组的位置,只是该位置的值变成了undefined;  delete还会有返回值,当可以删除的时候返回值为true.另外delete还能够删除对象的某个属性,但是不能删除var定义的变量,此时返回值为false; var arr1 = [ 5 , 4 , 3 , 2 , 1 , 9 ]; console.log ( arr1 ); console.

java中String的21种用法

(构造函数必须new出来) * public String (char[] vaue)                         将一个字符数组变成字符串(构造函数) * public String (char[] vaue,int offset,int count)    将制定范围内的字符数组变为字符串(构造函数) * public String (byte[],bytes)                        将一个byte数组变为字符串(构造函数) * public St

JAVA中字符串函数subString的用法小结

本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str; demo:

linux中grep和find的用法区别

linux中grep和find的用法区别 本文章详细的介绍了关于在linux中的grep和find两个命令的用法介绍,以及后面总结了它们两年用法区别哦. 先我们来介绍一下关于grep用法和一些小注意事项 使用过程中,使用最多的参数就是 -v ,但是用着并不爽. 比如说,我想查找一个单词“UserService”,但是像”*.svn” 这种文件就不用显示了,我该怎么做呢? 代码如下 复制代码 grep -r "UserService" ./ | grep -v "svn&quo

python中enumerate()函数用法

python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输出, 2.将 list 倒序成 [6, 5, 4, 3, 2, 1] 3.将a 中的偶数挑出 *2 ,结果为 [4, 8, 12] 这个例子用到了python中enumerate的用法.顺便说一下enumerate在for循环中得到计数的用法,enumerate参数为可遍历的变量,如 字符串,列表等

PyTorch中scatter和gather的用法

PyTorch中scatter和gather的用法 闲扯 许久没有更新博客了,2019年总体上看是荒废的,没有做出什么东西,明年春天就要开始准备实习了,虽然不找算法岗的工作,但是还是准备在2019年的最后一个半月认真整理一下自己学习的机器学习和深度学习的知识. scatter的用法 scatter中文翻译为散射,首先看一个例子来直观感受一下这个API的功能,使用pytorch官网提供的例子. import torch import torch.nn as nn x = torch.rand(2,

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

shell中$0,$?,$!等的特殊用法

shell中$0,$?,$!等的特殊用法 变量说明: $$Shell本身的PID(ProcessID)$!Shell最后运行的后台Process的PID$?最后运行的命令的结束代码(返回值)$-使用Set命令设定的Flag一览$*所有参数列表.如"$*"用「"」括起来的情况.以"$1 $2 … $n"的形式输出所有参数.[email protected]所有参数列表.如"[email protected]"用「"」括起来的情况