unit tutorial test support studio book androidtestimplementation android android-testing android-espresso

android - tutorial - Espresso: haga clic en texto en la vista de lista



test ui android (3)

El problema es que intenta hacer coincidir la vista de lista con el instanceOf(ListView.class) como argumento para onData() . onData() requiere una coincidencia de datos que coincida con los datos adaptados de ListView , no con ListView , y tampoco con la View que Adapter.getView() , sino con los datos reales.

Si tiene algo como esto en su código de producción:

ListView listView = (ListView)findViewById(R.id.myListView); ArrayAdapter<MyDataClass> adapter = getAdapterFromSomewhere(); listView.setAdapter(adapter);

Entonces, el argumento de Matcher de Espresso.onData() debería coincidir con la instancia deseada de MyDataClass . Entonces, algo como esto debería funcionar:

onData(hasToString(startsWith("ASDF"))).perform(click());

(Puede usar otro Matcher usando un método de org.hamcrest.Matchers )

En caso de que tenga varias vistas de adaptador en su actividad, puede llamar a ViewMatchers.inAdapterView() con un matcher de vista que especifique el AdapterView de la siguiente manera:

onData(hasToString(startsWith("ASDF"))) .inAdapterView(withId(R.id.myListView)) .perform(click());

Intento hacer clic en un texto en una vista de lista con Espresso. Sé que tienen esta guía , pero no veo cómo hacer que esto funcione al buscar texto. Esto es lo que he intentado

Espresso.onData(Matchers.allOf(Matchers.is(Matchers.instanceOf(ListView.class)), Matchers.hasToString(Matchers.startsWith("ASDF")))).perform(ViewActions.click());

Como se esperaba, esto no funcionó. El error dice que no hay vista en la jerarquía. ¿Alguien sabe cómo seleccionar una Cadena? ( "ASDF" en este caso) Gracias de antemano.

Actualización debido a @haffax

Recibí un error:

com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException: ''se puede asignar desde la clase: class android.widget.AdapterView'' coincide con múltiples vistas en la jerarquía.

Segundo error

Con este código

onData(hasToString(startsWith("ASDF"))).inAdapterView(withContentDescription("MapList")).perform(click());

Me sale este error

com.google.android.apps.common.testing.ui.espresso.PerformException: Error al ejecutar ''load adapter data'' on view ''con la descripción del contenido: es "MapList"''.

Causado por: java.lang.RuntimeException: no se encontraron datos que coincidan: asString (una cadena que comienza con "ASDF")

Solución

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


Si el adaptador tiene una clase de modelo personalizada, por ejemplo 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)); } }; }

Luego llame al siguiente:

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

Esto funciona mejor para mí con datos de texto de fila.