Android Espresso waitFor ..和Thread.sleep()解决方案

时间:2014-05-06 12:35:28

标签: android multithreading android-espresso

我刚刚开始使用Espresso,之前我尝试过Robotium。我需要测试LoginActivity。逻辑是:

  1. 用户输入正确的凭据;
  2. 用户看到“登录...”字符串;
  3. 用户等待字符串消失;
  4. 用户在MainActivity中,看到“您已登录”
  5. 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)方法。 是否有任何解决方法可以使这项工作?

2 个答案:

答案 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()));