wake-up-neo.com

Espresso - Klicken Sie in der Listenansicht nach Text

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.

Update wegen @haffax

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.

Zweiter Fehler

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) 


Lösung

onData (anything ()). inAdapterView (withContentDescription ("desc")). atPosition (x) .perform (click ())

33
Chad Bingham

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());
39
haffax

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());
2
Veer
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.

0
anuja jain