Android 用浓缩咖啡测试ViewPager。如何对项目的按钮执行操作?

Android 用浓缩咖啡测试ViewPager。如何对项目的按钮执行操作?,android,android-viewpager,android-espresso,ui-testing,Android,Android Viewpager,Android Espresso,Ui Testing,我有一个ViewPager,其中的项目只包含一张图片和一个按钮 我无法成功地与项目页面的UI交互,因为除了显示的图片之外,没有任何东西可以从UI的角度区分ViewPager的所有项目 我尝试只选择一个具有位置的项目: onData(is(instanceOf(ItemClass.class))) .atPosition(0) .onChildView(withId(R.id.button)) .perform(click()

我有一个ViewPager,其中的项目只包含一张图片和一个按钮

我无法成功地与项目页面的UI交互,因为除了显示的图片之外,没有任何东西可以从UI的角度区分ViewPager的所有项目

我尝试只选择一个具有位置的项目:

onData(is(instanceOf(ItemClass.class)))
            .atPosition(0)
            .onChildView(withId(R.id.button))
            .perform(click());
导致:

NoMatchingViewException:在层次结构中找不到匹配的视图:可从类分配:class android.widget.AdapterView

如何使用浓缩咖啡访问和测试ViewPager的项目?

FirstVal,ViewPager不是AdapterView,它直接从ViewGroup扩展而来。因此,无法在ViewPager上使用onData方法

解决方案1 由于它是一个视图组,每个项目都是其ViewPager的直接子项。 因此,这个过程是使用像这样的自定义匹配器引用第一个视图子视图,并使用和访问目标视图并对其执行操作

 onView(allOf(withId(R.id.button), isDescendantOfA(firstChildOf(withId(R.id.viewpager)))))
            .perform(click());
解决方案2 da最佳 由于ViewPager的特殊性,它以逐页样式显示每个items 1解决方案组成它的子视图。因此,即使您的项目使用具有相同ID的相同布局,也只会显示一个。因此,我们可以通过Id引用目标视图并添加约束。它将只匹配一个视图,即当前显示的视图

onView(allOf(withId(R.id.button), isDisplayed())).perform(click());
就这么简单

如果需要其他项目,可以在ViewPager上执行以下操作以更改显示的项目:

onView(withId(R.id.viewpager)).perform(swipeLeft());
秘书处的说明:

isDisplayed将选择部分显示的视图,例如: 视图的完整高度/宽度大于视图的高度/宽度 可见的矩形。如果要确保整个矩形 此视图将显示给用户使用


谢谢@TWiStErRob

您可能想使用“完全显示”。根据我的经验,isDisplayed还与屏幕外页面中的视图相匹配。@TWiStErRob给出了一个很棒的提示,请检查此答案,您是否可以在此添加位置,因为所有列表都具有相同的id…在ViewAllowWithidR.id.button上,isDisplayed.performclick;我有一个ViewPager类似的问题,它使用相同的视图,但有不同的项目。其中提到的@TWiStErRob显示了匹配的屏幕外视图。因此,我尝试了完全显示,但当我在支票前刷卡时,即使关闭了动画,浓缩咖啡似乎也无法做到这一点。因此,我最终使用的是:onviewAllowWithidR.id.recyclerView,isDisplayingAtLeast60,并且recycler视图现在一直正确标识。