浓缩咖啡:单击 ViewPager 内 ListView 中的第一项

Posted

技术标签:

【中文标题】浓缩咖啡:单击 ViewPager 内 ListView 中的第一项【英文标题】:Espresso: click first item in ListView inside a ViewPager 【发布时间】:2016-08-18 14:40:30 【问题描述】:

是否可以在 ViewPager 中单击 ListView 的第一项?

我已经尝试让它像这样工作:

onData(anything()).inAdapterView(withId(R.id.myListView)).atPosition(0).perform(click());.

但据我了解:Testing ViewPager with Espresso. How perfom action to a button of an Item? 您不能将 onData 用于 ViewPager。 另外,如果我运行测试,我会得到多个匹配项的 AmbiguousViewMatcherException。

android.support.test.espresso.AmbiguousViewMatcherException: 'with id: my.awesome.app:id/myListView' matches multiple views in the hierarchy. Problem views are marked with '****MATCHES****' below.

如果我像这样onView(allOf(withId(R.id.myListView),isDisplayed())).perform(click()); 运行测试,则永远不会单击第一项。

还有其他方法可以单击列表的第一项吗?

【问题讨论】:

你只是想选择第一个项目吗? 不,我想点击它 哦,我明白了,哈哈。 @PatrickSturm 【参考方案1】:

试试这个:

onData(anything())
    .inAdapterView(allOf(withId(R.id.myListView), isCompletelyDisplayed()))
    .atPosition(0).perform(click());

由于您有 AmbiguousViewMatcherException,如果我没记错的话,这可能会匹配屏幕上显示的“myListView”。

【讨论】:

它成功了,运行一次......然后我又遇到了另一个错误:android.support.test.espresso.PerformException: Error performing 'load adapter data' on view '(with id: my.awesome.app:id/myListView and at least 100 percent of the view's area is displayed to the user.)'. 您是否在单击第一个元素之前滑动 ViewPager?如果是这样,添加一个 SystemClock.sleep(800);在此说明之前检查它是否有效。 然后,如果它工作,你可以使用这个空闲资源:github.com/Karumi/Rosie/blob/master/sample/src/androidTest/java/… 来避免睡眠,也应该工作。 好吧,这让我更困惑了。如果我使用这个组合,每次都会点击第一个项目:onView(allOf(withId(R.id.myListView), isDisplayed())).perform(click()); onData(anything()).inAdapterView(allOf(withId(R.id.myListView),isCompletelyDisplayed())).atPosition(0).perform(click());。如果我改变位置,第一个项目仍然被点击。 这意味着列表视图只有在您之前单击它时才会完全显示。也尝试使用 isDisplayed() 而不是 isCompletelyDisplayed(),它会抛出 AmbiguousViewMatcherException 还是有效?

以上是关于浓缩咖啡:单击 ViewPager 内 ListView 中的第一项的主要内容,如果未能解决你的问题,请参考以下文章

浓缩咖啡:AppNotIdleException

浓缩咖啡执行点击

带有 AsyncTask 的浓缩咖啡

手机睡着的浓缩咖啡测试

未解决的浓缩咖啡方法

浓缩咖啡 - withEffectiveVisibility vs isDisplayed