Espresso AmbiguousViewMatcherException: как выбрать первое горизонтальное представление Recycler из нескольких горизонтальных представлений Recycler

Есть несколько горизонтальных Recyclerview на экране. Я хочу выполнить эспрессо-клик по первому элементу первой горизонтали Recyclerview, Пожалуйста, дайте мне знать, как мы можем этого достичь.

 onView(withId(R.id.craousal_recyclerview))
.perform(RecyclerViewActions.actionOnItemAtPosition(1, new ClickOnImageView()));

 public class ClickOnImageView implements ViewAction {
    ViewAction click = click();

    @Override
    public Matcher<View> getConstraints() {
        return click.getConstraints();
    }

    @Override
    public String getDescription() {
        return " click on custom image view";
    }

    @Override
    public void perform(UiController uiController, View view) {
        click.perform(uiController, view.findViewById(R.id.craousal_imageview));
    }

Это дает мне следующее исключение:

android.support.test.espresso.AmbiguousViewMatcherException

1 ответ

Потратив несколько часов, я нашел решение, нам нужно использовать Matcher, чтобы соответствовать первому RecyclerView из нескольких горизонтальных RecyclerView, Поместите метод ниже в вашем тестовом классе.

    private <T> Matcher<T> firstView(final Matcher<T> matcher) {
    return new BaseMatcher<T>() {
        boolean isFirst = true;

        @Override
        public boolean matches(final Object item) {
            if (isFirst && matcher.matches(item)) {
                isFirst = false;
                return true;
            }

            return false;
        }

        @Override
        public void describeTo(final Description description) {
            description.appendText("should return first matching item");
        }
    };
}

А вот фрагмент кода, как вы можете его использовать,

  onView(firstView(withId(R.id.recyclerview_tray)))
            .perform(RecyclerViewActions.actionOnItemAtPosition(1, click()));
Другие вопросы по тегам