Testing ViewPager with Espresso. How perfom action to a button of an Item?

不问归期 提交于 2019-12-18 10:42:08

问题


I have a ViewPager whith items containing only a picture and a button.

I can't successfully interact with the UI of an item (Page) because, except the displayed picture, there is nothing to differentiate (from UI point of view) all items of the ViewPager.

I tried to select only one item with a position:

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

causing:

NoMatchingViewException: No views in hierarchy found matching: is assignable from class: class android.widget.AdapterView

How to access and test items of a ViewPager with Espresso ?


回答1:


FirstVal, ViewPager is not an AdapterView, it directly extends from ViewGroup. So the method onData() cannot be used on a ViewPager.

1. Solution

As it's a ViewGroup, each items are direct children of its ViewPager. So the process is to reference the first view child using a custom matcher (like this onefirstChildOf()) and playing with hasDescendant() and isDescendantOfA() to access the targeted view and perform an action on it.

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

2. Solution (da best)

As the particularity of the ViewPager is to display each items (#1 solution's child views) that composed it, one by one (page-by-page style). So even if your items use the same layout with the same IDs, only one is displayed. So we can reference the targeted view by its Id and add the constraints isDisplayed(). It will match only one view, the one that is currently displayed.

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

as simple as that.

And if you want another item, you may perform a swipe() on your ViewPager to change the displayed item:

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


来源:https://stackoverflow.com/questions/29836405/testing-viewpager-with-espresso-how-perfom-action-to-a-button-of-an-item

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!