安卓Espresso不等待UI完成

8
我有一个测试需要打开一个android.support.v7.preference.ListPreference对话框,选择一个选项,打开导航抽屉并从抽屉中选择一个项目。
对话框定义如下:
<android.support.v7.preference.ListPreference
    android:defaultValue="@string/pref_default_VALUE"
    android:entries="@array/pref_VALUE_entries"
    android:entryValues="@array/pref_VALUE_values"
    android:key="@string/pref_key_VALUE"
    android:negativeButtonText="@null"
    android:positiveButtonText="@null"
    android:title="@string/pref_title_VALUE" />

Espresso 是这样打开它的:

onView(withText(mActivityRule.getActivity().getResources().getString(R.string.pref_title_VALUE))
    .perform(click());

这确实打开了ListPreference,但它不会阻塞,测试中的下一行代码会立即运行。
// click on setting
    onView(withText(VALUE_IN_LIST_PREFERENCE))
            .perform(click());

由于这个事件是立即发生的,对话框还没有出现,withText(VALUE_IN_LIST_PREFERENCE)匹配不到任何内容。

如果我使用调试器逐步执行代码,在上面的那一行暂停,对话框将会及时出现,代码将正常工作。

导航抽屉也存在同样的问题。它是这样打开的:

// open the nav drawer
    onView(withId(R.id.drawer_layout))
            .perform(DrawerActions.open());

当点击某个项目时:

// click on phase 1
    onView(withId(R.id.nav_view))
            .perform(NavigationViewActions.navigateTo(R.id.nav_ITEM));

与ListPreferences一样,测试代码继续执行而不等待UI完成,因此调用onView失败。
我尝试过将线程休眠并遵循这里的答案https://dev59.com/xGEi5IYBdhLWcg3wRauf#22563297 但是,在这两种情况下,对话框直到线程睡眠完毕后才出现,并且视图测试立即运行。 因此,问题仅仅是被延迟了,而不是解决了。
如何确保Espresso测试在必要的视图可见之前不运行?
1个回答

0
如果您还没有找到解决方案,这里提供的可能会对您有所帮助。 等待视图变为可见状态使用IdleResource 解决方案是实现IdlingResource,它将允许您提供一个回调函数,以便在一切都变得空闲时立即运行。
@Override
public final boolean isIdleNow() {
    mIdle = mIdle || mView.getVisibility() == mExpectedVisibility;

    if (mIdle) {
        if (mResourceCallback != null) {
            mResourceCallback.onTransitionToIdle();
        }
    }

    return mIdle;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接