Utiliser Espresso pour cliquer sur vue dans l’élément RecyclerView

Comment puis-je utiliser Espresso pour cliquer sur une vue spécifique dans un élément RecyclerView ? Je sais que je peux cliquer sur l’élément à la position 0 en utilisant:

onView(withId(R.id.recyclerView)) .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));

Mais je dois cliquer sur une vue spécifique à l’intérieur de cet élément et non sur l’élément lui-même.

Merci d’avance.

— modifier —

Pour être plus précis, j’ai un RecyclerView ( R.id.recycler_view ) dont les éléments sont CardView ( R.id.card_view ). Dans chaque CardView, j’ai quatre boutons (entre autres) et je veux cliquer sur un bouton spécifique ( R.id.bt_deliver ).

J’aimerais utiliser les nouvelles fonctionnalités d’Espresso 2.0, mais je ne suis pas sûr que ce soit possible.

Si ce n’est pas possible, je voudrais utiliser quelque chose comme ça (en utilisant le code de Thomas Keller):

 onRecyclerItemView(R.id.card_view, ???, withId(R.id.bt_deliver)).perform(click()); 

mais je ne sais pas quoi mettre sur les points d’interrogation.

Vous pouvez le faire avec personnaliser l’action d’affichage.

 public class MyViewAction { public static ViewAction clickChildViewWithId(final int id) { return new ViewAction() { @Override public Matcher getConstraints() { return null; } @Override public Ssortingng getDescription() { return "Click on a child view with specified id."; } @Override public void perform(UiController uiController, View view) { View v = view.findViewById(id); v.performClick(); } }; } } 

Ensuite, vous pouvez cliquer dessus avec

 onView(withId(R.id.rv_conference_list)).perform( RecyclerViewActions.actionOnItemAtPosition(0, MyViewAction.clickChildViewWithId(R.id. bt_deliver))); 

Maintenant, avec android.support.test.espresso.consortingb il est devenu plus facile:

1) Ajouter une dépendance de test

 androidTestComstack('com.android.support.test.espresso:espresso-consortingb:2.0') { exclude group: 'com.android.support', module: 'appcompat' exclude group: 'com.android.support', module: 'support-v4' exclude module: 'recyclerview-v7' } 

* exclure 3 modules, car très probablement vous l’avez déjà

2) Puis faites quelque chose comme

 onView(withId(R.id.recycler_grid)) .perform(RecyclerViewActions.actionOnItemAtPosition(0, click())); 

Ou

 onView(withId(R.id.recyclerView)) .perform(RecyclerViewActions.actionOnItem( hasDescendant(withText("whatever")), click())); 

Ou

 onView(withId(R.id.recycler_linear)) .check(matches(hasDescendant(withText("whatever")))); 

Essayez l’approche suivante:

  onView(withRecyclerView(R.id.recyclerView) .atPositionOnView(position, R.id.bt_deliver)) .perform(click()); public static RecyclerViewMatcher withRecyclerView(final int recyclerViewId) { return new RecyclerViewMatcher(recyclerViewId); } public class RecyclerViewMatcher { final int mRecyclerViewId; public RecyclerViewMatcher(int recyclerViewId) { this.mRecyclerViewId = recyclerViewId; } public Matcher atPosition(final int position) { return atPositionOnView(position, -1); } public Matcher atPositionOnView(final int position, final int targetViewId) { return new TypeSafeMatcher() { Resources resources = null; View childView; public void describeTo(Description description) { int id = targetViewId == -1 ? mRecyclerViewId : targetViewId; Ssortingng idDescription = Integer.toSsortingng(id); if (this.resources != null) { try { idDescription = this.resources.getResourceName(id); } catch (Resources.NotFoundException var4) { idDescription = Ssortingng.format("%s (resource name not found)", id); } } description.appendText("with id: " + idDescription); } public boolean matchesSafely(View view) { this.resources = view.getResources(); if (childView == null) { RecyclerView recyclerView = (RecyclerView) view.getRootView().findViewById(mRecyclerViewId); if (recyclerView != null) { childView = recyclerView.findViewHolderForAdapterPosition(position).itemView; } else { return false; } } if (targetViewId == -1) { return view == childView; } else { View targetView = childView.findViewById(targetViewId); return view == targetView; } } }; } } 

D’abord, donnez à vos boutons un contenu unique Des descriptions, c’est-à-dire “la ligne du bouton de livraison 5”.

Ensuite, faites défiler jusqu’à la ligne:

onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.scrollToPosition(5));

Ensuite, sélectionnez la vue basée sur contentDescription.

onView(withContentDescription("delivery button row 5")).perform(click());

La description du contenu est un excellent moyen d’utiliser la vue sur Espresso et de rendre votre application plus accessible.