Ich versuche mit Espresso auf einen Text in einer Listenansicht zu klicken. Ich weiß, dass sie diesen Leitfaden haben, aber ich kann nicht erkennen, wie dies funktioniert, indem ich nach Text suche. Das habe ich versucht
Espresso.onData(Matchers.allOf(Matchers.is(Matchers.instanceOf(ListView.class)), Matchers.hasToString(Matchers.startsWith("ASDF")))).perform(ViewActions.click());
Wie erwartet funktionierte das nicht. Der Fehler sagte keine Ansicht in der Hierarchie. Weiß jemand, wie man einen String auswählt? ("ASDF"
in diesem Fall) Vielen Dank im Voraus.
Ich habe einen Fehler erhalten:
com.google.Android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException: 'kann von der Klasse: Klasse Android.widget.AdapterView' zugewiesen werden, entspricht mehreren Ansichten in der Hierarchie.
Mit diesem Code
onData(hasToString(startsWith("ASDF"))).inAdapterView(withContentDescription("MapList")).perform(click());
Ich bekomme diesen Fehler
com.google.Android.apps.common.testing.ui.espresso.PerformException: Fehler beim Durchführen von 'Adapterdaten laden' mit der Inhaltsbeschreibung: "MapList" '.
Verursacht durch: Java.lang.RuntimeException: Keine übereinstimmenden Daten gefunden: asString (eine Zeichenfolge, die mit "ASDF" beginnt)
onData (anything ()). inAdapterView (withContentDescription ("desc")). atPosition (x) .perform (click ())
Das Problem ist, dass Sie versuchen, die Listenansicht selbst mit der instanceOf(ListView.class)
als Argument für onData()
abzugleichen. onData()
erfordert einen Data Matcher, der mit den angepassten Daten der ListView
übereinstimmt, nicht mit der ListView
selbst und auch nicht mit der View
, die Adapter.getView()
zurückgibt, sondern den tatsächlichen Daten.
Wenn Sie so etwas in Ihrem Produktionscode haben:
ListView listView = (ListView)findViewById(R.id.myListView);
ArrayAdapter<MyDataClass> adapter = getAdapterFromSomewhere();
listView.setAdapter(adapter);
Dann sollte das Matcher-Argument von Espresso.onData()
mit der gewünschten Instanz von MyDataClass
..__ übereinstimmen. So etwas sollte funktionieren:
onData(hasToString(startsWith("ASDF"))).perform(click());
(Sie können einen anderen Matcher mit der Methode org.hamcrest.Matchers
verwenden.)
Falls Sie mehrere Adapteransichten in Ihrer Aktivität haben, können Sie ViewMatchers.inAdapterView()
mit einem View-Matcher aufrufen, der die AdapterView wie folgt angibt:
onData(hasToString(startsWith("ASDF")))
.inAdapterView(withId(R.id.myListView))
.perform(click());
Wenn der Adapter eine benutzerdefinierte Modellklasse hat, zum Beispiel Item
:
public static Matcher<Object> withItemValue(final String value) {
return new BoundedMatcher<Object, Item>(Item.class) {
@Override
public void describeTo(Description description) {
description.appendText("has value " + value);
}
@Override
public boolean matchesSafely(Item item) {
return item.getName().toUpperCase().equals(String.valueOf(value));
}
};
}
Dann rufen Sie folgendes an:
onData(withItemValue("DRINK1")).inAdapterView(withId(R.id.menu_item_grid)).perform(click());
onData(hasEntry(equalTo(ListViewActivity.ROW_TEXT),is("List item: 25")))
.onChildView(withId(R.id.rowTextView)).perform(click());
Dies funktioniert am besten für mich mit Zeilentextdaten.