Подтвердить что ты не робот

Тестирование ViewPager с эспрессо. Как перфорировать действие кнопки?

У меня есть элементы ViewPager, содержащие только изображение и кнопку.

Я не могу успешно взаимодействовать с пользовательским интерфейсом элемента (Страница), потому что, кроме отображаемого изображения, нет ничего, чтобы отличить (с точки зрения UI) все элементы ViewPager.

Я попытался выбрать только один элемент с позицией:

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

вызывая

NoMatchingViewException: никакие представления в иерархии не найдены: присваивается класс: class android.widget.AdapterView

Как получить доступ и проверить элементы ViewPager с помощью эспрессо?

4b9b3361

Ответ 1

FirstVal, ViewPager не является AdapterView, он напрямую распространяется от ViewGroup. Таким образом, метод onData() не может использоваться на ViewPager.

1. Решение

Поскольку он ViewGroup, каждый элемент является прямым дочерним элементом его ViewPager. Таким образом, процесс состоит в том, чтобы ссылаться на первый вид дочернего элемента с использованием пользовательского совпадения (например, этот firstChildOf()) и играть с hasDescendant() и isDescendantOfA() для доступа к целевому виду и выполнения действия над ним.

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

2. Решение (да лучше)

Поскольку спецификацией ViewPager является отображение каждого элемента (дочерние представления решения 1), которые его составляли, один за другим (поэтапный стиль). Поэтому, даже если ваши элементы используют один и тот же макет с одинаковыми идентификаторами, отображается только один. Поэтому мы можем ссылаться на целевое представление по его идентификатору и добавлять ограничения isDisplayed(). Он будет соответствовать только одному представлению, отображаемому в настоящее время.

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

так же просто.

И если вы хотите другой элемент, вы можете выполнить swipe() на ViewPager, чтобы изменить отображаемый элемент:

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