ventana studio personalizado mensaje emergente dialogo confirmación confirmacion con botones boton alerta android android-espresso

android - studio - Compruebe si se muestra un cuadro de diálogo con Espresso



mensaje de confirmación android studio (6)

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

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

    o, basado en texto con identificación

    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ón 1 - OK, 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 estoy seguro de hacer clic fuera de la vista de diálogo personalizado, pero para verificar si se muestra o no, debe crear su marcador personalizado y verificar dentro de él.

Estoy intentando escribir algunas pruebas con el nuevo android-test-kit (Espresso) . Pero no puedo encontrar ninguna información sobre cómo verificar si se muestra un cuadro de diálogo y realizar algunas acciones en él (como hacer clic en los botones positivo y negativo, etc.). Tenga en cuenta que un cuadro de diálogo también puede mostrarlo WebView , no la aplicación en sí.

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

  1. Compruebe si aparece un cuadro de diálogo
  2. Realizar clics en los botones de diálogo
  3. Interactúa con la vista interna del diálogo (si es una vista personalizada)
  4. Haga clic en Preformas fuera del cuadro de diálogo y compruebe si se muestra o no (por ejemplo, si se setCancelable(false) en el generador de diálogo y queremos verificarlo)

¡Gracias por el consejo!


Actualmente uso esto y parece funcionar bien.

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


El botón Ids R.id.button1 y R.id.button2 no van a ser iguales en todos los dispositivos. Los ID pueden cambiar con las versiones del sistema operativo.

La forma 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(); }


Para responder a la pregunta 4, que no acepta la respuesta aceptada, modifiqué el siguiente código, que encontré aquí en ( link ) para probar si se mostró un Toast.

@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 actualmente mostrada en su diálogo. También podría escribir el método de esta 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.

Úselo así:

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


Por si acaso alguien tropieza con esta pregunta como yo. Todas las respuestas solo funcionarán para los diálogos CON botones de diálogo. No intente usar esto para diálogos de progreso sin la interacción del usuario. Espresso sigue esperando que la aplicación entre en estado inactivo. Siempre que el diálogo de progreso esté visible, la aplicación no está inactiva.


Si tienes un AlertDialog así:

Puede verificar si los componentes se muestran:

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 realiza una acción:

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