web-dev-qa-db-fra.com

Test de ViewPager avec Espresso. Comment effectuer une action sur un bouton d'un élément?

J'ai un ViewPager avec des éléments contenant uniquement une image et un bouton.

Je ne peux pas interagir avec succès avec l'interface utilisateur d'un élément (Page) car, à l'exception de l'image affichée, il n'y a rien pour différencier (du point de vue de l'interface utilisateur) tous les éléments de ViewPager.

J'ai essayé de sélectionner un seul élément avec une position:

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

provoquant:

NoMatchingViewException: aucune vue dans la hiérarchie trouvée correspondant: est attribuable à partir de la classe: classe Android.widget.AdapterView

Comment accéder et tester les éléments d'un ViewPager avec Espresso?

27
damson

FirstVal, ViewPager n'est pas un AdapterView, il s'étend directement de ViewGroup. Ainsi, la méthode onData() ne peut pas être utilisée sur un ViewPager.

1. Solution

Comme il s'agit d'un ViewGroup, chaque élément est le fils direct de son ViewPager. Ainsi, le processus consiste à référencer le premier enfant de vue en utilisant un matcher personnalisé (comme celui-ci firstChildOf() ) et en jouant avec hasDescendant() et isDescendantOfA() pour accéder à la vue ciblée et effectuer une action dessus.

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

2. Solution (da best)

Comme la particularité de ViewPager est d'afficher chaque élément (vues enfant de la solution n ° 1) qui le compose, un par un (style page par page). Ainsi, même si vos articles utilisent la même mise en page avec les mêmes identifiants, un seul est affiché. On peut donc référencer la vue ciblée par son Id et ajouter les contraintes isDisplayed() . Il ne correspondra qu'à une seule vue, celle qui est actuellement affichée.

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

aussi simple que cela.

Et si vous voulez un autre élément, vous pouvez effectuer une swipe() sur votre ViewPager pour changer l'élément affiché:

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