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

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

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

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

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

в результате чего:

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

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

Solutions Collecting From Web of "Тестирование ViewPager с эспрессо. Как перфорировать действие кнопки?"

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

1. Решение

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

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

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

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

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

так просто.

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

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