Intereting Posts
Полный пример того, как программно выполнять RotateAnimations? MediaCodec H264 Encoder не работает на устройствах Snapdragon 800 Получить имя из абсолютного пути, подстроку из последней косой черты, java android Панель действий Android SearchView как автозаполнение? Как изменить цвет края прокрутки и пролить свет Как найти текстовую область (Высота / Ширина) TextView программно в android Как нарисовать границу только на одной стороне линейного макета? SQLite "INSERT OR REPLACE INTO" не работает Cache.properties (система не может найти указанный файл) Невозможно создать экземпляр фрагмента, убедитесь, что имя класса существует, является общедоступным и имеет пустой конструктор, открытый Функция Samsung «Оптимизация приложения» отключает фоновые приложения через 3 дня Предоставляет ли ведущий знания о Activity / Context плохую идею в шаблоне MVP? Как настроить проект плагина Cordova с поддержкой IDE? Как увеличить размер шрифта в тосте? Советы по организации крупных проектов Android?

Тестирование 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());