2016-09-03 46 views
6

Czy istnieje sposób przewijania do końca widoku recyclerview za pomocą espresso?Espresso: widok z recyklingu przewiń do końca

Istnieje element z tekstem, powiedzmy "Tekst XYZ", a widok recycler ma identyfikator recycler_view. Ten przedmiot jest ostatnim elementem widoku recyklera.

Próbowałem

onView(withId(R.id.recycler_view)).check(matches(isDisplayed())).perform(RecyclerViewActions.scrollTo(withText("Text XYZ")),click()); 

Ale to nie wydają się działać. Jakieś pomysły?

+0

wydaje się nie działać - dziennik błędów proszę – piotrek1543

+0

sprawdzasz, czy widok jest wyświetlany przed przewinięciem do niego. – denys

+0

@denys The ckeck jest dla rzeczywistego recyclerview. Nie powinno to mieć znaczenia, chyba że widok recyklingu nie jest faktycznie wyświetlany. –

Odpowiedz

13

RecyclerViewActions.scrollTo() mecze z ItemView z ViewHolder, który jest zawyżony w onCreateViewHolder() adaptera. Aby funkcja scrollTo() mogła działać, musisz podać moduł dopasowujący, który jednoznacznie identyfikuje to, ItemView.

Twój bieżący matcher mówi espresso, aby przewinąć do obiektu ViewHolder, który został napompowany TextView jako itemView. Co może się zdarzyć, ale zazwyczaj masz do czynienia z pewną akcją ViewGroup, która ma na celu ukształtowanie uchwytów widoku tak, jak chcesz, żeby wyglądały.

Jeśli zmienisz Matcher scrollTo(), na hasDescendant(withText("Text XYZ")), aby uwzględnić wszystkie układy zagnieżdżone (jeśli istnieje więcej niż jeden).

Należy także pamiętać, ponieważ starają się również kliknąć element - nie można tego zrobić w tym samym perform() ponieważ będzie wysłać kliknij aby bieżącego ViewInteraction, który jest w tym przypadku RecyclerView id R.id.recycler_view. Wykonanie tego w tym samym wykonaniu powoduje kliknięcie środka na obiekcie RecyclerView, a nie elementu, do którego przewinięto.

Aby rozwiązać ten problem, potrzebujesz albo innego onView() z matcherem, którego użyłeś do przewinięcia do elementu lub użycia RecyclerView.actionOnItem().

W przypadku innego onView() oświadczeniu hasDescendant(withText("Text XYZ")) zawiodę cię, bo znajdzie wszystkich rodziców tego TextView (viewholder, recyclerview, w viewgroup która posiada recyclerview i tak dalej), a wszystkie one mają tę szczególną potomka. To zmusi Cię do uczynienia macierzy bardziej precyzyjnej i uwzględnia wszystkie układy zagnieżdżone. W takich sytuacjach zwykle chodzę na matcher withChild(), ale może to być dla ciebie inne.

+0

Niesamowite, dzięki, działa idealnie! Powinien być tak podobny do tego onView (withId (R.id.rvSettings)). Check (match (isDisplayed())) perform (RecyclerViewActions.scrollTo (hasDescendant (withText (stringId)))); –