Uiautomator 2.0 - Until
Android 测试支持库中的 Until 类,用于循环查找某些元素或者组件条件等。
有搜索条件,状态条件,事件条件等三种快捷的条件方式。主要使用在如判断一个对象是否出现,判断新页面是否打开,判断滑动列表是否滚动底部,判断组件是否在特定状态等。

| 返回类型 | 状态条件— 状态条件API | |
| static UiObject2Condition<Boolean> | descContains(java.lang.String substring) | 当对象的描述与给定的字符串包含匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | descEndsWith(java.lang.String substring) | 当对象的描述与给定的字符串结尾匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | descStartsWith(java.lang.String substring) | 当对象的描述与给定的字符串起始匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | descEquals(java.lang.String contentDescription) | 当对象的描述与给定的字符串完全匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | descMatches(java.util.regex.Pattern regex) | 当对象的描述与给定的字符串正则匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | descMatches(java.lang.String regex) | 当对象的描述与给定的字符串正则匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | textContains(java.lang.String substring) | 当对象的文本与给定的字符串包含匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | textNotEquals(java.lang.String text) | 当对象的文本与给定的字符串不相等时,返回一个条件 |
| static UiObject2Condition<Boolean> | textEndsWith(java.lang.String substring) | 当对象的文本与给定的字符串结尾匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | textStartsWith(java.lang.String substring) | 当对象的文本与给定的字符串起始匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | textEquals(java.lang.String text) | 当对象的文本与给定的字符串完全匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | textMatches(java.util.regex.Pattern regex) | 当对象的文本与给定的字符串正则匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | textMatches(java.lang.String regex) | 当对象的文本与给定的字符串正则匹配时,返回一个条件 |
| static UiObject2Condition<Boolean> | checkable(boolean isCheckable) | 依据 Checkable 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | checked(boolean isChecked) | 依据 Checked 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | clickable(boolean isClickable) | 依据 Clickable 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | enabled(boolean isEnabled) | 依据 Enabled 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | focusable(boolean isFocusable) | 依据 Focusable 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | focused(boolean isFocused) | 依据 Focused 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | longClickable(boolean isLongClickable) | 依据 Focused 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | scrollable(boolean isScrollable) | 依据 Scrollable 属性状态返回一个条件 |
| static UiObject2Condition<Boolean> | selected(boolean isSelected) | 依据 Selected 属性状态返回一个条件 |
| 返回类型 | 搜索条件— 搜索条件API | 说明 |
| static SearchCondition<UiObject2> | findObject(BySelector selector) | 至少找到选择器中的一个元素就会返回一个 SearchCondition |
| static SearchCondition<List<UiObject2>> | findObjects(BySelector selector) | 至少找到选择器中的一个元素就会返回一个 SearchCondition列表 |
| static SearchCondition<Boolean> | gone(BySelector selector) | 当没有一个元素匹配选择器则返回 SearchCondition |
| static SearchCondition<Boolean> | hasObject(BySelector selector) | 当至少有一个元素匹配选择器则返回 SearchCondition |
| 返回类型 | 事件条件— 事件条件API | 说明 |
| static EventCondition<Boolean> | newWindow() | 当有一个新窗口出现是返回 EventCondition |
| static EventCondition<Boolean> | scrollFinished(Direction direction) | 当滚动滚动对象,滚动到尽头的时候返回一个EventCondition |
@RunWith(AndroidJUnit4.class)
public class TUntils {
UiDevice device;
Instrumentation instrumentation;
public String resIdTitle = "com.android.settings:id/titleSwitch";
public String resIdWifiPassword = "com.android.settings:id/dialog_wifi_password";
public String resIdWifiPositive = "com.android.settings:id/dialog_wifi_positive";
public String textWifiStatus = "已连接";
public String textWifiPassword = "LCT-2016";
@Before
public void setUp(){
instrumentation= InstrumentationRegistry.getInstrumentation();
device=UiDevice.getInstance(instrumentation);
}
@After
public void tearDown(){
}
@Test
public void testConditionStatus() throws IOException{
/*
* 1 状态条件-Uiobject2Condtion
* 1.1 一个UiObject2Condition代表UiObject2满足某个条件的特定状态,主要用于获取到组件释放处于某种状态。
*
* */
device.executeShellCommand("am start com.android.settings/com.banyac.midrive.connectionsettings.activity.WifiActivity");
UiObject2 uio = device.findObject(By.res(resIdTitle));
if (uio.isChecked())
uio.click();
Assert.assertTrue(uio.wait(Until.checked(false),10000)); // Status Condition
}
@Test
public void testConditionSearch() throws IOException{
/*
* 2. 搜索条件 - SearchCondition
* 2.1 SearchCondition代表满足一定条件的,需要查找的UI元素,主要用于判断是否存在某个组件。
*
* */
device.executeShellCommand("am start com.android.settings/com.banyac.midrive.connectionsettings.activity.WifiActivity");
UiObject2 uio = device.findObject(By.res(resIdTitle));
if (! uio.isChecked())
uio.click();
//Assert.assertTrue(device.wait(Until.gone(By.text("banya-guest")),2000));
Assert.assertTrue(device.wait(Until.hasObject(By.text("banya-guest")),5000));
}
@Test
public void testConditionEvent() throws IOException{
/*
* 3. 事件条件 - EventCondition
* 3.1 EventCondition是一种条件,它依赖于一个事件或一系列事件发生,主要用于判断某个事件是否发生了。
*
* */
device.executeShellCommand("am start com.android.settings/com.banyac.midrive.connectionsettings.activity.WifiActivity");
UiObject2 uio = device.findObject(By.res(resIdTitle));
if (! uio.isChecked())
uio.click();
final UiObject2 scrollList = device.findObject(By.clazz("android.widget.ScrollView"));
Boolean result = device.performActionAndWait(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
scrollList.scroll(Direction.DOWN, 0.5f);
}
}
}, Until.scrollFinished(Direction.DOWN), 10000);
Assert.assertTrue(result);
}
}

浙公网安备 33010602011771号