2017-08-13 84 views
3

我正在运行Espresso测试来点击RecyclerView的一个元素。Espresso RecyclerView错误 - 没有位置的视图持有者

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

不过,我发现了以下错误:java.lang.IllegalStateException:

我检查视图id在位置无景观持有人指着我RecyclerView和我的依赖关系如下:

  • com.android.support.test.espresso:浓咖啡核:2.2.2
  • com.android.support.test.espresso:浓咖啡的contrib:2.2.2
+1

你设法解决了吗?我有完全相同的问题,没有人回答我的问题要么 – onVal

+0

不幸的是,我无法解决:-( –

+0

请提供一个[mcve]重现错误。 –

回答

0

好吧,我想我有同样的问题,我设法解决它。

的问题是,除非你正在使用的AsyncTask来填充RecyclerView,咖啡等待后台线程进行下一次操作之前完成。

因此,它会搜索位于位置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 
} 

我希望它帮助。

1

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

相关问题