The UI Automator APIs allow you to write robust tests without needing to know about the implementation details of the app that you are targeting. You can use these APIs to capture and manipulate UI components across multiple apps:
UiCollection
: Enumerates a container's UI elements for the purpose of counting, or targeting sub-elements by their visible text or content-description property.UiObject
: Represents a UI element that is visible on the device.UiScrollable
: Provides support for searching for items in a scrollable UI container.UiSelector
: Represents a query for one or more target UI elements on a device.Configurator
: Allows you to set key parameters for running UI Automator tests.a. UiCollection是UiObject的子类
b. UiCollection代表元素条目的集合
先按照一定的条件列举出容器中的所有符合条件UI元素,然后在这些符合条件的元素中通过其可见文本或内容描述属性对子元素进行计数或定位。
public class UiCollection extends UiObject
继承的常量:
androidx.test.uiautomator.UiObject
a. 一般使用容器类组件作为父类
b. 一般使用在需要找子类并且子类由于某些因素不好定位
c. 获取某一类的数量,比如获取短信列表下面短信的数量
public UiObject getChildByDescription (UiSelector childPattern, String text)
pubilc UiObject getChildByText (UiSelector, childPattern, String text)
pubilc UiObject getChildByInstance (UiSelector childPattern, int instance)
如上所说,在UiSelector选择器的查找条件中从子ui元素中搜索,递归寻找所有符合条件的子集。然后用描述,文本,实例条件搜索元素。
a. childPattern:UiSelector从子元素中选择的条件
b. text,instance都是从搜索出来的元素中再次用描述,文本条件搜出来的元素。
返回值:UIObject
抛出异常:UIObjectNotFoundException
public int getChildCount(UiSelector childPattern)
按照查找条件递归的查找所有符合条件的子元素集合的数量
需求:
一个手机页面上同时存在很多相同的按键,我们需要找到我们需要的控件,然后enable和disable这个控件,如下图所示:
这里我们需要去打开和关闭Google go的开关,假如这个页面上只有这一个那就好办了,我们用getText() 获取这个控件的开和关闭值,然后写个判断值是开我就关闭,是关闭的我就点击控件打开,很简单。
但是如上图,这个办法就不行了,因为他的控件都是一样的,只有text会有变化,是ON和OFF,这个时候需要精确的打开Google Go就需要我们的Collection了。
代码:
private void openAppSwitch(String appName, boolean on) throws UiObjectNotFoundException {
UiCollection collection = new UiCollection(new UiSelector().className("android.widget.LinearLayout"));
UiSelector appNameSelector = new UiSelector().resourceId("android:id/title").text(appName);
UiSelector switchOffSelector = new UiSelector().resourceId("android:id/switch_widget")
.className("android.widget.Switch").text("OFF");
UiSelector switchOnSelector = new UiSelector().resourceId("android:id/switch_widget")
.className("android.widget.Switch").text("ON");
if (on) {
if (collection.getChild(appNameSelector).exists() &&
collection.getChild(switchOffSelector).exists()) {
new UiObject(appNameSelector).clickAndWaitForNewWindow(5000L);
}
} else {
if (collection.getChild(appNameSelector).exists() &&
collection.getChild(switchOnSelector).exists()) {
new UiObject(appNameSelector).clickAndWaitForNewWindow(5000L);
}
}
}
@Test
public void testSettings_0130_9_enableGoogleGoAppPermission() throws UiObjectNotFoundException {
// 打开Google Go的权限
mSettingsPage.enterAppsAndNotifications();
AppsNotificationsPage appsNotificationsPage = new AppsNotificationsPage(mDevice);
appsNotificationsPage.enterAppPermissions();
appsNotificationsPage.enterCamera();
openAppSwitch("Google Go", true); //关闭,就false
}
代码解释:
首先先获得父类的集合
然后找到符合条件的子元素,也就是Google Go 和 开关按钮 (android:id/switch_widget)
然后判断 开关按钮是开还是关,是开的就点击Google Go这个空间关闭它,是关闭的就点击Google GO去打开它,完美解决问题;