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:
- Android revoca el permiso al inicio de cada prueba
- Android Espresso Testing: ActivityTestRule no cierra la actividad
- Archivo de clase para android.support.v4.widget.DrawerLayoutImpl no se encuentra en travis support-v4 21.0
- Selección de la vista secundaria en índice mediante Espresso
- Espresso NestedScrollView
- Compruebe si aparece un cuadro de diálogo
- Ejecutar clics en los botones de diálogo
- Interactuar con la vista interna del diálogo (si se trata de una vista personalizada)
- 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!
- Java.lang.IncompatibleClassChangeError al incluir espresso-contrib: 2.0
- ¿Cómo puedo excluir un Servicio de comenzar en una prueba de Espresso?
- Android.os.BaseBundle no se burla
- Espresso - verificar qué actividad se abre con la intención de pulsar el botón?
- Cómo realizar varias pruebas en Android afirmando brindis
- Espresso NoMatchingViewException cuando se utiliza matricador withId
- ¿Cómo obtener una vista desde dentro de Espresso para pasar a un IdlingResource?
- Cómo afirmar dentro de un RecyclerView en Espresso?
-
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()));
-
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
- Creo que es posible ya que Espresso tiene soporte para múltiples ventanas .
- 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í:
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(); }
- SimpleDateFormat (plantilla de cadena, configuración local) con, por ejemplo, Locale.US para fechas ASCII
- Cómo enviar el valor de hashmap a otra actividad usando una intención