Espresso RecyclerView 错误 - 位置没有视图支架

Ada*_*itz 7 java android android-espresso

我正在运行 Espresso 测试以单击 RecyclerView 的一个元素。

   onView(withId(R.id.recyclerList)).perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:java.lang.IllegalStateException: No view holder at position

我检查了视图 id 指向我的 RecyclerView 并且我的依赖项如下:

  • com.android.support.test.espresso:espresso-core:2.2.2
  • com.android.support.test.espresso:espresso-contrib:2.2.2

onV*_*Val 6

好吧,我想我也遇到了同样的问题并且我设法解决了它。

问题是,除非您使用 AsyncTask填充 RecyclerView,否则 Espresso不会等待后台线程完成后再执行下一个操作。

因此,它将搜索位置 2 处的项目,并且由于您的后台线程仍在运行并且回收器视图尚未加载,因此它将返回 IllegalStateException。

尽管我建议使用它,但您可以通过添加 Thread.sleep() (具有合理的时间)来检查测试是否运行得非常快,如下所示:

    @Test
    public void myTest() {

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        onView(withId(R.id.recyclerList))
                .perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));

        //assert something
}
Run Code Online (Sandbox Code Playgroud)

解决此问题的更好(且正确)的解决方案是使用Idling Resources

这个简短的视频确实帮助我了解了如何使用 IdlingResources(特别是 CountingIdlingResources)。

您的 ui 测试现在应该类似于:

    @Test
    public void myTest() {
        registerIdlingResources(/*put your IdlingResource here*/);

        onView(withId(R.id.recyclerList))
                .perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));

        //assert something
}
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助。