Как я могу использовать Espresso, чтобы щелкнуть определенное представление внутри элемента RecyclerView ? Я знаю, что могу щелкнуть элемент в позиции 0, используя:
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
Но мне нужно щелкнуть конкретный вид внутри этого элемента, а не сам элемент.
Заранее спасибо.
-- редактировать --
Чтобы быть более точным: у меня есть RecyclerView ( R.id.recycler_view
), элементы которого - CardView ( R.id.card_view
). Внутри каждого CardView у меня есть четыре кнопки (среди прочего), и я хочу нажать на определенную кнопку ( R.id.bt_deliver
).
Я хотел бы использовать новые функции Espresso 2.0, но не уверен, что это возможно.
Если это невозможно, я хочу использовать что-то вроде этого (используя код Томаса Келлера):
onRecyclerItemView(R.id.card_view, ???, withId(R.id.bt_deliver)).perform(click());
но я не знаю, что ставить вопросительные знаки.
источник
Ответы:
Вы можете сделать это с помощью действия настройки просмотра.
Затем вы можете щелкнуть по нему с помощью
источник
Теперь с android.support.test.espresso.contrib стало проще:
1) Добавить тестовую зависимость
* исключить 3 модуля, потому что скорее всего он у вас уже есть
2) Затем сделайте что-нибудь вроде
Или
Или
источник
exclude group: 'com.android.support' exclude module: 'recyclerview-v7'
actionOnItemAtPosition
требуется параметр типа. Не уверен, что туда поставить.Вот как я решил проблему в котлине:
а потом
источник
Попробуйте следующий подход:
источник
Вы можете щелкнуть по 3-му пункту в виде
recyclerView
этого:Не забудьте указать
ViewHolder
тип, чтобы логический вывод не завершился ошибкой.источник
<RecyclerView.ViewHolder>
спасибо, сэр;)Все приведенные выше ответы не сработали для меня, поэтому я создал новый метод, который просматривает все представления внутри ячейки, чтобы вернуть представление с запрошенным идентификатором. Для этого требуются два метода (их можно объединить в один):
Затем, наконец, вы можете использовать это в Recycler View, выполнив следующие действия:
Вы можете использовать обратный вызов, чтобы вернуть представление, если вы хотите сделать с ним что-то еще, или просто создать 3-4 разные версии этого для выполнения любых других задач.
источник
Я продолжал пробовать различные методы, чтобы выяснить, почему ответ @ blade не работает для меня, только чтобы понять, что у меня есть
OnTouchListener()
, я соответствующим образом изменил ViewAction:источник
Вы даже можете обобщить этот подход не только для поддержки большего количества действий
click
. Вот мое решение для этого:И тогда
EditText
вы можете сделать что-то вроде этого:источник
Сначала дайте вашим кнопкам уникальное описание содержимого, например, «строка кнопки доставки 5».
<button android:contentDescription=".." />
Затем прокрутите до строки:
onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.scrollToPosition(5));
Затем выберите представление на основе описания содержимого.
onView(withContentDescription("delivery button row 5")).perform(click());
Описание содержимого - отличный способ использовать onView от Espresso и сделать ваше приложение более доступным.
источник
withText("Order")
тоже будет работать, и вам не потребуется знать во время тестирования, что вы заказываете.