unit tutorial test support studio book androidtestimplementation android android-espresso

android - tutorial - Actualizando un EditText con Espresso



test ui android (4)

Estaba teniendo un problema similar y lo resolví utilizando el correlador de las cadenas de secuencias y Class.getSimpleName (). Me gusta esto:

onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed()));

Puedes ver el código completo here

Estoy intentando actualizar un EditText como parte de una prueba de Espresso con:

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(clearText()) .perform(click()) .perform(typeText("Another test"));

Sin embargo recibo el siguiente error:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: (with class name: a string ending with "EditText" and with text: is "Test")

Al desglosar la línea de prueba puedo ver que esto ocurre después de realizar clearText() , por lo que asumo que los emparejadores se están volviendo a ejecutar antes de cada perform y fallan en la acción anterior. Aunque esto tiene sentido, me deja un poco confundido en cuanto a cómo actualizar EditText utilizando Espresso. ¿Cómo debería hacer esto?

Tenga en cuenta que no puedo usar un ID de recurso o similar en este escenario y tengo que usar la combinación como se muestra arriba para identificar la vista correcta.


Podrías probar dos cosas. Primero intentaría usar

onView(withId(<id>).perform...

De esta manera, siempre tendrá acceso al campo EditarTexto incluso cuando otros campos EditarTexto estén en la pantalla.

Si esa no es una opción, podría dividir sus llamadas realizadas.

onView(allOf(withClassName(endsWith("EditText")),withText(is("Test")))).perform(clearText()); onView(withClassName(endsWith("EditText"))).perform(click()); onView(withClassName(endsWith("EditText"))).perform(typeText("Another Test");


Puede utilizar el método replaceText .

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))) .perform(replaceText("Another test"));


Tres cosas para probar:

1. Se pueden ejecutar actuaciones en sucesión.

onView(...) .perform(clearText(), typeText("Some Text"));

2. Hay un problema registrado en la página de Espresso que se marcó como no válido (pero sigue siendo un error). Una solución para esto es hacer una pausa en la prueba entre las actuaciones.

public void test01(){ onView(...).perform(clearText(), typeText("Some Text")); pauseTestFor(500); onView(...).perform(clearText(), typeText("Some Text")); } private void pauseTestFor(long milliseconds) { try { Thread.sleep(milliseconds); } catch (InterruptedException e) { e.printStackTrace(); } }

3. ¿Está absolutamente seguro de que su EditText contiene el texto "Test"?