用EspressotestingViewPager。 如何执行一个项目的button的动作?

我有一个ViewPager只包含一个图片和一个button的项目。

我无法成功地与项目(页面)的用户界面进行交互,因为除了显示的图片之外,没有什么可以区分(从UI的angular度来看) ViewPager所有项目。

我试图只select一个位置的项目:

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

造成:

NoMatchingViewException:层次结构中没有find匹配的视图:可以从类中分配:class android.widget.AdapterView

如何使用Espresso访问和testingViewPager项目?

FirstVal, ViewPager不是AdapterView ,它直接从ViewGroup扩展。 所以方法onData() 不能ViewPager上使用。

1.解决scheme

由于它是一个ViewGroup ,每个项目都是其ViewPager直接子项。 所以这个过程就是使用一个自定义的匹配器(比如这个firstChildOf() )和hasDescendant()isDescendantOfA()来访问目标视图并对其执行操作。

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

2.解决scheme(最好)

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

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

就如此容易。

如果你想要另一个项目,你可以在你的ViewPager上执行swipe()来改变显示的项目:

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