Compruebe si se muestra un diálogo con Espresso

Estoy tratando de escribir algunas pruebas con el nuevo android-test-kit (Espresso) . Pero no puedo encontrar ninguna información sobre cómo comprobar si un diálogo se muestra y realizar algunas acciones en él (como hacer clic en los botones positivos y negativos, etc). Tenga en cuenta que un diálogo también puede ser visualizado por un WebView , no por la aplicación misma.

Cualquier ayuda sería apreciada. Sólo necesito un enlace, o algún código de ejemplo para los conceptos básicos:

  1. Compruebe si aparece un cuadro de diálogo
  2. Ejecutar clics en los botones de diálogo
  3. Interactuar con la vista interna del diálogo (si se trata de una vista personalizada)
  4. La preforma hace clic fuera del cuadro de diálogo y comprueba si está mostrando o no (por ejemplo, si setCancelable(false) fue llamado en el constructor de diálogo y queremos comprobarlo)

¡Gracias por el consejo!

  1. Para verificar si aparece el cuadro de diálogo, simplemente puede ver si se muestra Ver con un texto que se presenta en el interior del cuadro de diálogo:

     onView(withText("dialogText")).check(matches(isDisplayed())); 

    O, basado en texto con id

     onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed())); 
  2. Para hacer clic en el botón de diálogo haga esto (botón1 – Aceptar, botón2 – Cancelar):

     onView(withId(android.R.id.button1)).perform(click()); 

    ACTUALIZAR

  3. Creo que es posible ya que Espresso tiene soporte para múltiples ventanas .
  4. No está seguro acerca de hacer clic fuera de la vista de diálogo personalizado, pero para comprobar si se está mostrando o no, tienes que crear tu marcador personalizado y comprobar dentro de él.

Actualmente uso esto y parece que funciona bien.

 onView(withText(R.string.my_title)) .inRoot(isDialog()) // <--- .check(matches(isDisplayed())); 

Si usted tiene un AlertDialog así:

Introduzca aquí la descripción de la imagen

Puede comprobar si se muestran los componentes:

 int titleId = mActivityTestRule.getActivity().getResources() .getIdentifier( "alertTitle", "id", "android" ); onView(withId(titleId)) .inRoot(isDialog()) .check(matches(withText(R.string.my_title))) .check(matches(isDisplayed())); onView(withId(android.R.id.text1)) .inRoot(isDialog()) .check(matches(withText(R.string.my_message))) .check(matches(isDisplayed())); onView(withId(android.R.id.button2)) .inRoot(isDialog()) .check(matches(withText(android.R.string.no))) .check(matches(isDisplayed())); onView(withId(android.R.id.button3)) .inRoot(isDialog()) .check(matches(withText(android.R.string.yes))) .check(matches(isDisplayed())); 

Y realizar una acción:

 onView(withId(android.R.id.button3)).perform(click()); 

Para responder a la pregunta 4, que la respuesta aceptada no, he modificado el siguiente código, que encontré aquí en el desbordamiento de la pila ( enlace ) para probar si un Toast se muestra.

 @NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) { return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); } 

El id pasado es el id de una View que se muestra actualmente en su diálogo. También puede escribir el método de la siguiente manera:

 @NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) { return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); } 

Y ahora está buscando una View contenga una cadena de texto en particular.

Utilícelo de la siguiente manera:

 getRootView(getActivity(), R.id.text_id).perform(click()); 

Los botones Ids R.id.button1 y R.id.button2 no van a ser iguales entre dispositivos. Los ID pueden cambiar con las versiones del sistema operativo.

La manera correcta de lograr esto es usar UIAutomator. Incluya la dependencia de UIAutomator en su build.gradle

 // Set this dependency to build and run UI Automator tests androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' 

y use

 // Initialize UiDevice instance UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // Search for correct button in the dialog. UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText")); if (button.exists() && button.isEnabled()) { button.click(); } 
  • Espresso: Cómo utilizar R.string recursos de la carpeta androidTest
  • La ejecución de instrumentación falló debido a 'android.content.res.Resources $ NotFoundException'
  • Espresso - ¿Cómo puedo comprobar si se inicia una actividad después de realizar una determinada acción?
  • ¿Cómo esbozar imágenes de selección con intenciones Espresso?
  • Android, Error = No se puede encontrar la información de instrumentación para: ComponentInfo {}
  • Snackbar y Espresso fallando a veces
  • Se intentó desplazar a la vista, pero la vista no se muestra
  • Conseguir Dagger para inyectar objetos simulados al hacer pruebas funcionales espresso para Android
  • Android - Espresso - desplazamiento a un elemento no listado Ver
  • Android Espresso: ¿Cómo afirmo que no debería mostrarse una vista?
  • Cómo recuperar el acceso a una actividad después de enviarlo al fondo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.