使用Espresso测试ViewPager。如何对项目的按钮执行操作?

时间:2015-04-23 23:56:35

标签: 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());
使

  

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

如何使用Espresso访问和测试ViewPager的商品?

1 个答案:

答案 0 :(得分:83)

FirstVal,ViewPager不是AdapterView,它直接从ViewGroup延伸。因此,在onData()上无法使用ViewPager 方法

1。溶液

因为它是ViewGroup,所以每个项目都是其ViewPager的直接子项。 因此,该过程是使用自定义匹配器(例如此firstChildOf())引用第一个视图子项,并使用hasDescendant()isDescendantOfA()来访问目标视图并对其执行操作。

 onView(allOf(withId(R.id.button), isDescendantOfA(firstChildOf(withId(R.id.viewpager)))))
            .perform(click());

2。解决方案(最佳)

由于ViewPager的特殊性是逐个显示构成它的每个项目(#1解决方案的子视图)(逐页样式)。因此,即使您的项目使用具有相同ID的相同布局,也只会显示一个。因此,我们可以通过其ID引用目标视图,并添加约束isDisplayed()。它只匹配一个视图,即当前显示的视图。

onView(allOf(withId(R.id.button), isDisplayed())).perform(click());

就这么简单。

如果您想要其他项目,可以在ViewPager上执行swipe()更改显示的项目:

onView(withId(R.id.viewpager)).perform(swipeLeft());