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); } }