一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于软件测试中的“UiSelector类介绍(一)”。
UiSelector可通过控件的各种属性与节点关系定位组件。正如本卷开始说的,一个功能测试程序主要包括组件的定位、组件的操作和断言,在这里UiSelector对象作用就是定位组件。
UiSelector的定义方法如下。
UiSelector uiSelector = new UiSelector().定位方法
关于定位方法将会在后面会进行介绍。
下面列出Android常用的控件类型。
l TextView 文本框。
l EditView 编辑框。
l Button 按钮。
l RadioButton 单选按钮。
l CheckBox 复选框。
l ToggleButton 状态开关按钮。
l Switch 开关。
l SeekBar 拖动条。
l AnalogClock DigitalClock 时钟。
l Chronometer 计时器。
l ListView 列表视图。
l GridView 网格视图。
l ProgressBar 进度条。
l RatingBra 星际评分条。
l Toast 提示信息框。
l ScrollView 滚动视图。
表4-13列出Android组件所有的属性,这对于定位组件是十分重要的。
对于UiSelector定位元素主要分为以下四种情况进行匹配。
l 默认:完全匹配。
l Contains:包含匹配,也可以叫模糊匹配。
l StartsWith:起始匹配,匹配开始的字符串。
l Matches:正则匹配(支持正则表达式)。
另外介绍匹配之前还要介绍了解一下四个概念,如果开发过简单的Android开发,了解layout.xml结构就更好理解了。
l 父 Patent:父控件
l 子 Children:子控件
l 同胞 Sibling:同胞控件
l 先辈 Ancestor:父控件的上一级、上上级...
l 后代 Descendant:子控件的下一级、下下级...
在如下的layout.xml文件中。
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:id="@+id/root"
android:onClick="rootClick"
tools:context="com.example.demo5.MainActivity" >
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="193dp"
android:src="@drawable/pic1"
android:visibility="invisible" />
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="225dp"
android:src="@drawable/pic2"
android:visibility="invisible" />
两个ImageView是FrameLayout的子控件,FrameLayout是两个ImageView的父控件,两个ImageView互为同胞控件。这样也应该理解先辈和后代了。
由于产品的代码往往不是开发人员书写的,所以自动化测试人员不太了解程序中的属性值,而这又往往是定位元素很重要的信息,为此Android SDK专门提供了一个工具:UiAutomatorViewer,它在%ANDROID_HOME%\tools\bin\uiautomatorviewer.bat。
打开呈现如图4-17界面。
图4-17 UiAutomatorViewer初始化界面
点击桌面第二个图标,虚拟设备上的界面将会同步到UiAutomatorViewer工具中,如图4-18所示。
图4-18 UiAutomatorViewer同步界面
在同步界面中点击相应组件,组件的详细信息会在右边显示出来。
下面来介绍UiSelector对象定位元素的方法。
(1)通过文本(Text)属性来定位
通过文本(Text)属性来定位的API如表4-14所示。
这里的参数对应于UiAutomatorViewer工具中的text内容(注意:不是所有的属性都有值的,如果没有只能用其他方法来定位)。
案例4-9:通过文本(Text)属性来定位。
UiSelector uiSelector = new UiSelector().text("天气");//查找文本为“天气”的所有组件
(2)通过描述(Description)属性来定位
通过描述(Description)属性来定位的API如表4-15所示。
这里的参数对应于UiAutomatorViewer工具中的content-desc内容。
案例4-10:通过描述(Description)属性来定位。
UiSelector uiSelector = new UiSelector().descriptionContains("天气");//查找描述包含“天气”的所有组件
(3)通过类名(ClassName)属性来定位
通过类名(ClassName)属性来定位的API如表4-16所示。
这里的参数对应于UiAutomatorViewer工具中的class内容。
案例4-11:通过类名(ClassName)属性来定位。
UiSelector x=new UiSelector().className("android.widget.CheckBox");
UiSelector wx=new UiSelector().className("android.widget.TextView").text"微信");
由第二个语句可以看到,可以同时通过两种方式进行定位clasNames和text,是与的关系。这条语句是className为“android.widget.TextView”且text为“微信”。
(4)通过包名(PackageName)属性来定位
通过包名(PackageName)属性来定位的API如表4-17所示。
这里的参数对应于UiAutomatorViewer工具中的package内容。
案例4-12:通过包名(PackageName)属性来定位。
UiSelector x=new UiSelector().packageName("com.example.demo4");
(5)通过索引与实例(index&instance)属性来定位
对于同一个text、Description、ClassName或者PackageName可能有多个组件,为了找到所需要的元素,可以通过索引与实例来定位。通过索引与实例(index&instance)属性来定位的API如表4-18所示。
这里的参数对应于UiAutomatorViewer工具中的index内容。
案例4-13:通过索引与实例(index&instance)属性来定位。
UiSelector uiSelector = new UiSelector().className("android.widget.ImagView").index(1);//查找ImageView在同级中下标为1的组件
UiSelector uiSelector = new UiSelector().text("天气").instance(2);//查找界面中文本为“天气”的第3个组件
注意:instance(n),为符合条件的第n+1个元素。
(6)通过特殊属性来定位
通过特殊属性来定位的API如表4-19所示。
案例4-14:通过特殊属性来定位。
UiSelector x=new UiSelector().fousable(true).className("android.widget.CheckBox");
定位ClassName为“android.widget.CheckBox”且当前聚焦的组件。
(7)通过资源ID来定位
通过资源ID来定位的API如表4-20所示。
这里的参数对应于UiAutomatorViewer工具中的resurce-id内容。
案例4-15:通过资源ID来定位。
UiSelector x=new UiSelector().resourceId("com.example.demo4:id/username1");
(8)通过节点来定位
通过节点来定位的API如表4-21所示。
案例4-16:通过节点来定位。
UiObject uio=new UiObject(new UiSelector().text("Cache junk").fromParent(new UiSelector().className("android.widget.CheckBox")));
图4-19 通过节点来定位
这个例子如图4-19所示,得到text为“Cache junk”的className为“android.widget.CheckBox”的父亲组件,即text为“Cache junk”右边的复选框。