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 ser mostrado por a WebView
, no por la aplicación en sí.
Cualquier ayuda sería apreciada. Solo necesito un enlace o algún código de ejemplo para los conceptos básicos:
- Compruebe si aparece un cuadro de diálogo
- Realizar clics en los botones de diálogo
- Interactuar con la vista interna del cuadro de diálogo (si es una vista personalizada)
- Haga clic en la preforma fuera del cuadro de diálogo y verifique si se muestra o no (por ejemplo, si
setCancelable(false)
se llamó en el generador de cuadros de diálogo y queremos verificarlo)
¡Gracias por el consejo!
android
android-espresso
Serj Lotutovici
fuente
fuente
Respuestas:
Para verificar si aparece un cuadro de diálogo, simplemente puede verificar si se muestra Ver con un texto que se presenta dentro 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 cuadros de diálogo, haga lo siguiente (botón1 - Aceptar, botón2 - Cancelar):
onView(withId(android.R.id.button1)).perform(click());
ACTUALIZAR
fuente
Actualmente uso esto y parece funcionar bien.
onView(withText(R.string.my_title)) .inRoot(isDialog()) // <--- .check(matches(isDisplayed()));
fuente
Si tiene un AlertDialog como ese:
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());
fuente
android.R.id.message
y el título tenía una identificación oculta deandroid.R.id.alertTitle
.int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Para responder a la pregunta 4, que no es la respuesta aceptada, modifiqué el siguiente código, que encontré aquí en Stack Overflow ( enlace ) 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 la identificación de unView
que se muestra actualmente en su diálogo. También puede escribir el método así:@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 que
View
contenga una cadena de texto en particular.Úselo así:
getRootView(getActivity(), R.id.text_id).perform(click());
fuente
Los ID de botón R.id.button1 y R.id.button2 no serán los mismos en todos los dispositivos. Los identificadores pueden cambiar con las versiones del sistema operativo.
La forma correcta de lograrlo es utilizar 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(); }
fuente
android.R.id.button1
,android.R.id.button2
yandroid.R.id.button3
para "positivo", "neutral" y "negativo", son símbolos globales que pueden ser utilizados. Si elige seleccionar botones a través de su texto, lo cual está totalmente bien, no necesita UIAutomator, pero puede hacer lo mismo con EspressoonView(withText("ButtonTest")).perform(click())
.En caso de que alguien se encuentre con esta pregunta como yo. Todas las respuestas solo funcionarán para cuadros de diálogo CON botones de diálogo. No intente utilizar esto para los cuadros de diálogo de progreso sin la interacción del usuario. Espresso sigue esperando que la aplicación entre en estado inactivo. Mientras el cuadro de diálogo de progreso esté visible, la aplicación no estará inactiva.
fuente