我有一个测试需要打开一个android.support.v7.preference.ListPreference对话框,选择一个选项,打开导航抽屉并从抽屉中选择一个项目。
对话框定义如下:
这确实打开了ListPreference,但它不会阻塞,测试中的下一行代码会立即运行。
与ListPreferences一样,测试代码继续执行而不等待UI完成,因此调用onView失败。
我尝试过将线程休眠并遵循这里的答案https://dev59.com/xGEi5IYBdhLWcg3wRauf#22563297 但是,在这两种情况下,对话框直到线程睡眠完毕后才出现,并且视图测试立即运行。 因此,问题仅仅是被延迟了,而不是解决了。
如何确保Espresso测试在必要的视图可见之前不运行?
对话框定义如下:
<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测试在必要的视图可见之前不运行?