aber weil RecyclerViewActions erwartet natürlich eine Aktion, da steht falscher 2. Argumenttyp. Da ist kein RecyclerViewAssertions auf Espresso-Beitrag.
Gibt es eine Möglichkeit, Behauptungen auf a auszuführen RecyclerView?
Vielleicht könnte die Antwort auf diese ähnliche SO-Frage helfen
– Francislainy Campos
17. Oktober 2018 um 10:23 Uhr
riwnodennyk
Ziemlich einfach. Es wird keine zusätzliche Bibliothek benötigt. Tun:
mit Methode, die Sie in Ihre setzen können Utils Klasse.
public static Matcher<View> atPosition(final int position, @NonNull final Matcher<View> itemMatcher) {
checkNotNull(itemMatcher);
return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) {
@Override
public void describeTo(Description description) {
description.appendText("has item at position " + position + ": ");
itemMatcher.describeTo(description);
}
@Override
protected boolean matchesSafely(final RecyclerView view) {
RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(position);
if (viewHolder == null) {
// has no item on such position
return false;
}
return itemMatcher.matches(viewHolder.itemView);
}
};
}
Wenn Ihr Artikel zunächst nicht auf dem Bildschirm sichtbar ist, scrollen Sie vorher dorthin:
.perform(scrollToPosition(87)) funktioniert nicht. Test schlägt fehl
– Prajwal Waingankar
12. April um 16:17 Uhr
Diese Lösung funktioniert, aber im Fehlerfall werden Details darüber gedruckt RecyclerView selbst, nicht über das Element an Position N, sodass Sie möglicherweise Schwierigkeiten haben, herauszufinden, was falsch ist. Für Matcher mit besserer Diagnose können Sie sich meine Lösung oder einige der anderen ansehen
Funktioniert bei mir nicht, wenn das Element an dieser Position derzeit nicht auf den Bildschirm passt.
– riwnodennyk
14. Januar 2016 um 16:11 Uhr
Versuchen Sie zuerst, zur Position zu scrollen? onView(withId(R.id.id.recycler_view)).perform(RecyclerViewActions.scrollTo(2));
– HowieH
15. Januar 2016 um 12:32 Uhr
Immer noch die gleichen. Funktioniert zB nicht für Position = 30. Das Problem ist das RecyclerView.findViewHolderForAdapterPosition(position) verwendet werden soll RecyclerView.getChildAt() wie in der Antwort unten gezeigt wurde.
– riwnodennyk
16. Januar 2016 um 0:35 Uhr
Funktioniert immer noch nicht für mich, wenn das Element außerhalb des Bildschirms ist, ich habe den findViewHolderForAdapterPosition(position) zum RecyclerViewMatcher hinzugefügt. Wenn ich das mache: onView(withRecyclerView(R.id.synology_apps_rv).atPositionOnView(7, R.id.not_installed_tv)).check(matches(withText(R.string.notinstalled))); Der Test schlägt fehl, aber wenn ich das mache: onView(withId(R.id.synology_apps_rv)).perform(RecyclerViewActions.scrollToPosition(7));onView(withRecyclerView(R.id.synology_apps_rv).atPositionOnView(7, R.id .not_installed_tv)).check(matches(withText(R.string.notinstalled))); die Prüfung ist gelungen
– Koen Van Looveren
6. November 2016 um 8:55 Uhr
Was ist, wenn Sie mehr als eine Recycler-Ansicht mit derselben ID haben?
– Damia Fuentes
5. September 2017 um 15:01 Uhr
Du Qi
Nur um die Antwort von Riwnodennyk zu verbessern, wenn Sie ViewHolder ist ein ViewGroup statt direkt View Objekt wie TextViewdann können Sie hinzufügen hasDescendant Matcher passend zum TextView Objekt in der ViewGroup. Beispiel:
Perfekt, mir fehlte nur noch der hasDescendantVielen Dank!
– Rob Holmes
17. Oktober 2017 um 21:33 Uhr
Hiten Bahri
Ich habe mit demselben Problem zu kämpfen, bei dem ich eine Recycler-Ansicht mit 6 Elementen habe und dann die an Position 5 auswählen muss und die 5. in der Ansicht nicht sichtbar ist.
Die obige Lösung funktioniert auch. Ich weiß auch, dass es ein bisschen spät ist, aber ich dachte, es lohnt sich, es zu teilen.
Ich tat dies mit einer einfachen Lösung wie folgt:
onView(withId(R.id.recylcer_view))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withText("Text of item you want to scroll to")),
click()));
RecyclerViewActions.actionOnItem – Führt ein ViewAction auf eine Ansicht von abgestimmt viewHolderMatcher.
Scrollen RecyclerView zu der Ansicht passte von itemViewMatcher
Führen Sie eine Aktion für die übereinstimmende Ansicht aus
Mir ist nicht klar, wie ich die bekommen soll targetViewId um es als Parameter an zu übergeben atPositionOnView
– Ein Droide
24. Februar 2018 um 17:09 Uhr
Grundsätzlich kenne ich die ID des Artikels vorher nicht, da sie jedes Mal, wenn ich den Test durchführe, anders sein könnte. Es könnte ein TextView, ein Button oder etwas anderes sein.
– Ein Droide
24. Februar 2018 um 17:25 Uhr
Für Kotlin-Benutzer: Ich weiß, dass ich sehr spät dran bin, und ich bin verwirrt, warum die Leute RecycleView-Aktionen anpassen müssen. Ich wollte genau das gleiche gewünschte Ergebnis erzielen: Hier ist meine Lösung, ich hoffe, sie funktioniert und hilft Neulingen. Seien Sie auch vorsichtig mit mir, da ich möglicherweise blockiert werde.
Mir ist nicht klar, wie ich die bekommen soll targetViewId um es als Parameter an zu übergeben atPositionOnView
– Ein Droide
24. Februar 2018 um 17:09 Uhr
Grundsätzlich kenne ich die ID des Artikels vorher nicht, da sie jedes Mal, wenn ich den Test durchführe, anders sein könnte. Es könnte ein TextView, ein Button oder etwas anderes sein.
– Ein Droide
24. Februar 2018 um 17:25 Uhr
Thomas
Ich habe ein paar Antworten oben zu einer wiederverwendbaren Methode zum Testen anderer Recycler-Ansichten kombiniert, wenn das Projekt wächst. Lassen Sie den Code hier, falls er jemand anderem hilft …
Deklarieren Sie eine Funktion, die für eine RecyclerView-Ressourcen-ID aufgerufen werden kann:
fun Int.shouldHaveTextAtPosition(text:String, position: Int) {
onView(withId(this))
.perform(scrollToPosition<RecyclerView.ViewHolder>(position))
.check(matches(atPosition(position, hasDescendant(withText(text)))))
}
Rufen Sie es dann in Ihrer Recycler-Ansicht auf, um den angezeigten Text mehrerer Adapterelemente in der Liste an einer bestimmten Position zu überprüfen, indem Sie Folgendes tun:
with(R.id.recycler_view_id) {
shouldHaveTextAtPosition("Some Text at position 0", 0)
shouldHaveTextAtPosition("Some Text at position 1", 1)
shouldHaveTextAtPosition("Some Text at position 2", 2)
shouldHaveTextAtPosition("Some Text at position 3", 3)
}
Ich bin mir schon eine Weile nicht sicher, welche Abhängigkeitsversionen erforderlich sind, damit dieser Code ausgeführt werden kann. Wenn ich etwas Freizeit habe, werde ich versuchen, zurückzugehen und sie zu finden.
– Thomas
22. März 2021 um 13:48 Uhr
11765100cookie-checkWie in einem RecyclerView in Espresso behaupten?yes
Vielleicht könnte die Antwort auf diese ähnliche SO-Frage helfen
– Francislainy Campos
17. Oktober 2018 um 10:23 Uhr