我有ViewPager
个只包含图片和按钮的项目。
我无法与项目(页面)的UI成功交互,因为除了显示的图片之外,没有任何内容可以区分(从UI的角度来看)ViewPager
的所有项目。
我尝试只选择一个有位置的项目:
onData(is(instanceOf(ItemClass.class)))
.atPosition(0)
.onChildView(withId(R.id.button))
.perform(click());
使
NoMatchingViewException:层次结构中找不到匹配的视图:可从类中分配:class android.widget.AdapterView
如何使用Espresso访问和测试ViewPager
的商品?
答案 0 :(得分:83)
FirstVal,ViewPager
不是AdapterView
,它直接从ViewGroup
延伸。因此,在onData()
上无法使用ViewPager
方法。
因为它是ViewGroup
,所以每个项目都是其ViewPager
的直接子项。
因此,该过程是使用自定义匹配器(例如此firstChildOf()
)引用第一个视图子项,并使用hasDescendant()
和isDescendantOfA()
来访问目标视图并对其执行操作。
onView(allOf(withId(R.id.button), isDescendantOfA(firstChildOf(withId(R.id.viewpager)))))
.perform(click());
由于ViewPager
的特殊性是逐个显示构成它的每个项目(#1解决方案的子视图)(逐页样式)。因此,即使您的项目使用具有相同ID的相同布局,也只会显示一个。因此,我们可以通过其ID引用目标视图,并添加约束isDisplayed()
。它只匹配一个视图,即当前显示的视图。
onView(allOf(withId(R.id.button), isDisplayed())).perform(click());
就这么简单。
如果您想要其他项目,可以在ViewPager
上执行swipe()
更改显示的项目:
onView(withId(R.id.viewpager)).perform(swipeLeft());