我刚刚开始使用Espresso,之前我尝试过Robotium。我需要测试LoginActivity。逻辑是:
testLogin来源:
public void testLogin() throws Exception{
onView(withId(R.id.login_email)).perform(typeText(LOGIN_EMAIL));
onView(withId(R.id.login_password)).perform(typeText(LOGIN_PASSWORD));
onView(withId(R.id.login_loginBtn)).perform(click());
onView(withText(R.string.loading_logging_in)).check(matches(isDisplayed()));
onView(withText("You're logged in")).check(matches(isDisplayed()));
}
问题是espresso没有等待“你”重新登录“字符串出现,它正试图找到它,而记录仍在进行中。
logcat的:
com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: 层次结构中没有查看匹配的视图:with text:是“您已登录”
我尝试过使用Thread.sleep(10000),但它终止了Thread.sleep(10000)上的运行并给了我错误:
测试未能完成。原因:'仪表运行失败 由于'进程崩溃'。'检查设备logcat以获取详细信息测试 运行失败:由于“进程崩溃”,仪表运行失败。
logcat的:
@@@ @@@ @@@在HttpReRegistrationService中杀死了cancelService
在此之前,我使用了waitForActivity(MainActivity.class)方法。 是否有任何解决方法可以使这项工作?
答案 0 :(得分:2)
如果您尝试登录用户时登录过程正忙,并且您没有使用AsyncTask(以适当的方式),那么您唯一的选择就是让您的繁忙资源按照所述IdlingResource
来实现{{1}} {3}}
Espresso知道等待的时间和时间。
答案 1 :(得分:2)
另一种接近这种方法的方法是使用UiAutomator。我经常在这样的情况下使用它。解决方案将是这样的:
d = {}
for x, y in L:
d[x] = d.get(x, 0) + 1
d[y] = d.get(y, 0) + 1
print d.items()
# [('Jimmy', 2), ('Henry', 2), ('Bob', 1), ('Lucas', 1)]
或者你甚至可以这样做:
UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
onView(withId(R.id.login_loginBtn)).perform(click());
UiObject loginLoading = mDevice.findObject(new UiSelector().resourceId(your_package_name+":id/loading_logging_in"));
loginLoading.waitUntilGone(15 * 1000); //Give them 15s to login
onView(withText("You're logged in")).check(matches(isDisplayed()));