Jak mogę użyć Espresso, aby kliknąć określony widok wewnątrz elementu RecyclerView ? Wiem, że mogę kliknąć element na pozycji 0 za pomocą:
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
Ale muszę kliknąć określony widok wewnątrz tego elementu, a nie sam element.
Z góry dziękuję.
-- edytować --
Aby być bardziej precyzyjnym: mam RecyclerView ( R.id.recycler_view
), które są elementami CardView ( R.id.card_view
). Wewnątrz każdego CardView mam cztery przyciski (między innymi) i chcę kliknąć określony przycisk ( R.id.bt_deliver
).
Chciałbym skorzystać z nowych funkcji Espresso 2.0, ale nie jestem pewien, czy jest to możliwe.
Jeśli nie jest to możliwe, chcę użyć czegoś takiego (używając kodu Thomasa Kellera):
onRecyclerItemView(R.id.card_view, ???, withId(R.id.bt_deliver)).perform(click());
ale nie wiem, co umieścić na znakach zapytania.
źródło
Odpowiedzi:
Możesz to zrobić, dostosowując akcję widoku.
Następnie możesz go kliknąć
źródło
Teraz dzięki android.support.test.espresso.contrib stało się to łatwiejsze:
1) Dodaj zależność testową
* wyklucz 3 moduły, ponieważ najprawdopodobniej już je masz
2) Następnie zrób coś takiego
Lub
Lub
źródło
exclude group: 'com.android.support' exclude module: 'recyclerview-v7'
actionOnItemAtPosition
wymaga parametru typu. Nie wiem, co tam umieścić.Oto jak rozwiązałem problem w Kotlin:
i wtedy
źródło
Wypróbuj następne podejście:
źródło
Można kliknąć na 3 pozycji z
recyclerView
tak:Nie zapomnij podać
ViewHolder
typu, aby wnioskowanie nie zawiodło.źródło
<RecyclerView.ViewHolder>
dziękuję sir;)Wszystkie powyższe odpowiedzi nie zadziałały, więc stworzyłem nową metodę, która przeszukuje wszystkie widoki wewnątrz komórki, aby zwrócić widok z żądanym identyfikatorem. Wymaga dwóch metod (można połączyć w jedną):
Następnie możesz użyć tego w Recycler View, wykonując następujące czynności:
Możesz użyć wywołania zwrotnego, aby zwrócić widok, jeśli chcesz zrobić z nim coś innego, lub po prostu zbudować 3-4 różne wersje tego, aby wykonać inne zadania.
źródło
Próbowałem różnych metod, aby dowiedzieć się, dlaczego odpowiedź @ blade nie działa dla mnie, aby zdać sobie sprawę, że mam
OnTouchListener()
, odpowiednio zmodyfikowałem ViewAction:źródło
Można nawet uogólnić to podejście, aby wspierać nie tylko więcej działań
click
. Oto moje rozwiązanie:A potem
EditText
możesz zrobić coś takiego:źródło
Najpierw nadaj swoim przyciskom unikalną zawartość opisów, tj. „Rząd przycisku dostawy 5”.
<button android:contentDescription=".." />
Następnie przewiń do wiersza:
onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.scrollToPosition(5));
Następnie wybierz widok na podstawie contentDescription.
onView(withContentDescription("delivery button row 5")).perform(click());
Opis treści to świetny sposób na wykorzystanie onView Espresso i zwiększenie dostępności aplikacji.
źródło
withText("Order")
działałby również i nie wymagałby, abyś wiedział w czasie testu, co zamawiasz.