Android Espresso不等待UI完成

jho*_*lkd 6 android android-testing android-espresso

我有一个测试需要打开android.support.v7.preference.ListPreference对话框,选择一个选项,打开NavDrawer并从抽屉中选择一个项目.

对话框的定义如下:

<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" />
Run Code Online (Sandbox Code Playgroud)

Espresso打开它像这样:

onView(withText(mActivityRule.getActivity().getResources().getString(R.string.pref_title_VALUE))
    .perform(click());
Run Code Online (Sandbox Code Playgroud)

这会打开ListPreference,但它不会阻塞,测试中的下一行会立即运行.

// click on setting
    onView(withText(VALUE_IN_LIST_PREFERENCE))
            .perform(click());
Run Code Online (Sandbox Code Playgroud)

由于这种情况立即发生,因此没有出现对话框,并且withText(VALUE_IN_LIST_PREFERENCE)不匹配任何内容.

如果我单步执行调试器,暂停上面的行,对话框将及时显示,代码将起作用.

导航抽屉也会出现同样的问题.它像这样打开:

// open the nav drawer
    onView(withId(R.id.drawer_layout))
            .perform(DrawerActions.open());
Run Code Online (Sandbox Code Playgroud)

点击一个项目:

// click on phase 1
    onView(withId(R.id.nav_view))
            .perform(NavigationViewActions.navigateTo(R.id.nav_ITEM));
Run Code Online (Sandbox Code Playgroud)

与ListPreferences一样,测试代码继续而不等待UI完成,因此对onView的调用失败.

我已经尝试将线程置于睡眠状态并按照这里的答案/sf/answers/1579430821/

但是在这两种情况下,只有在Thread完成休眠并且视图测试立即运行之后才会出现对话框.所以,问题只是延迟,而不是解决.

如何在必要的视图可见之前确保不运行Espresso测试?

Sco*_*tyC 0

如果您尚未找到解决方案,此处提供的解决方案可能会对您有所帮助。

等待视图通过 IdleResource 变得可见

解决方案是实现IdlingResource,这将允许您提供一个回调,以便在一切都空闲时立即运行。

@Override
public final boolean isIdleNow() {
    mIdle = mIdle || mView.getVisibility() == mExpectedVisibility;

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

    return mIdle;
}
Run Code Online (Sandbox Code Playgroud)