我正在尝试用新的android-test-kit(Espresso)编写一些测试。但我找不到有关如何检查视图是否显示以及对其执行某些操作的任何信息(例如单击按钮,e.t.c。)。请注意,我需要检查视图是否存在。如果它确实对视图执行操作,如果不执行到下一个视图。
任何帮助,将不胜感激。我只需要一个链接,或基本的一些示例代码:
检查视图是否存在如果是,则执行操作如果不存在,请继续执行下一个屏幕
您可以使用经典选项“try / catch”:
try {
onView(withText("Text")).check(matches(isDisplayed()));
//perform some actions on this view
} catch (NoMatchingViewException notExist) {
//proceed to the next screen
}
Object currentActivity;
@Nullable
private Activity getCurrentActivity() throws Throwable {
getInstrumentation().waitForIdleSync();
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
Collection resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(RESUMED);
if (resumedActivities.iterator().hasNext()) {
currentActivity = resumedActivities.iterator().next();
}
}
});
return (Activity) currentActivity;
}
使用此功能,您可以获取当前显示的活动。在此之后通过执行此类操作,您可以创建一个安全的代码部分
HOMESCREEN:
{
for (; ; ) {
if (getCurrentActivity() != null) {
//check if it is the required screen
if (getCurrentActivity().getLocalClassName().toLowerCase().contains("homescreen")) {
//if it is the required screen, break the
//loop and continue execution
break HOMESCREEN;
} else {
//wait for 2 seconds and run the loop again
sleep(2000);
}
} else {
break HOMESCREEN;
}
}
}
sleep(2000)是一个自定义函数,只调用thread.sleep,如下所示:
private void sleep(long milliseconds) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException("Cannot execute Thread.sleep()");
}
}
您必须控制测试的行为。因此,您必须添加一些前提条件,或创建将控制行为的@Rule,例如通过添加参数,具体取决于您的视图将显示与否。