In Espresso when we have to locate to a particular position of an element and there are multiple element of having same id then we can do it by the following approaches :-
- Through Custom index we can locate to an element by the index of that element.
- In Recycler view when we want to locate an element where the element not having unique id.
-
Through Custom index we can locate to an element by the index value of that element.
In this we have to create a custom index :-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static Matcher<View> withIndex(final Matcher<View> matcher, final int index) { return new TypeSafeMatcher<View>() { int currentIndex = 0; @Override public void describeTo(Description description) { description.appendText("with index: "); description.appendValue(index); matcher.describeTo(description); } @Override public boolean matchesSafely(View view) { return matcher.matches(view) && currentIndex++ == index; } }; } |
And like this we have to use it :-
1 |
onView(withIndex(withId(R.id.button_btn), 0)).perform( click()); |
Here the “button_id” is the id where we want to perfom a click action and “0” is the index position of that element.
2. In Recycler view when we want to locate an element where the element not having unique id.
Then we using this class in code like this:-
1 2 |
onView(withId(R.id.my_recycler_view)).perform( RecyclerViewActions.actionOnItemAtPosition(0, MyViewAction.clickChildViewWithId(R.id.button_id))).perform(scrollTo(),click()); |
here “my_recycler_view” is the id of recycler view and “0” is the position where we want to click that button and “
button-id” is the id of the button on which we have to perform the click.
Here is the class “MyViewAction“:-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public static class MyViewAction { public static ViewAction clickChildViewWithId(final int id) { return new ViewAction() { @Override public Matcher<View> getConstraints() { return null; } @Override public String 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(); } }; } } |
By using this technique you can easily locate to your location When there are multiple same id buttons.
I hope this will help you when you face “multiple match” problem in Espresso.