Espresso RecyclerView错误 - 位置没有视图持有者

时间:2017-08-13 19:50:09

标签: java android android-espresso

我正在运行Espresso测试以点击RecyclerView的元素。

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

但是,我收到以下错误: java.lang.IllegalStateException:位置没有视图持有者

我已经检查了视图ID指向我的RecyclerView,我的依赖关系如下:

  • com.android.support.test.espresso:espresso-core:2.2.2
  • com.android.support.test.espresso:浓咖啡的contrib:2.2.2

3 个答案:

答案 0 :(得分:1)

我想,可能的问题是,当您尝试执行操作时,您的项目实际上不可见。如果是这样,您可以尝试onView(withId(R.id.recyclerList)).perform(RecyclerViewActions.scrollToPosition(2)) 然后执行您的操作

答案 1 :(得分:0)

好吧,我认为我遇到了同样的问题,我设法解决了。

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

因此,它将在位置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
}

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

这个short and concise video确实帮助我理解了如何使用IdlingResources(特别是CountingIdlingResources)。

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

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

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

        //assert something
}

我希望它有所帮助。

答案 2 :(得分:0)

您可以使用 real 类来确保您的数据在运行测试之前加载到您的回收器视图中,方法是在您的计数空闲对象之前调用 CountingIdlingResource获取数据,然后在加载数据后在您的计数空闲对象上调用 increment()

首先要做的是添加依赖以使用 decrement()

CountingIdlingResource

在您的 Activity 中定义一个类型为 implementation 'androidx.test.espresso:espresso-idling-resource:3.3.0'

的全局 public 变量
CountingIdlingResource 

“Loader”只是您空闲资源的唯一 ID(来自文档:此资源应向 Espresso 报告的资源名称。)

然后在从数据源获取数据之前调用 public CountingIdlingResource idlingResource = new CountingIdlingResource("Loader"); ,获取数据后调用 idlingResource.increment()

RecyclerViewTest 类中的最后一步是添加活动规则

idlingResource.decrement()

然后在您的测试方法中

@Rule
public ActivityScenarioRule<YourActivity> rule = new ActivityScenarioRule<>(YourActivity.class);