Espresso-Web es un punto de entrada para trabajar con los componentes de la IU de Android WebView. Espresso-Web reutiliza los Atoms de la popular API WebDriver para examinar y controlar el comportamiento de un WebView.
Cuándo usar Espresso-Web
Usa Espresso-Web para probar tus apps híbridas, especialmente la integración de tu
de la IU nativa de la app con su WebView
componentes de IU. Puedes usar la API de Espresso-Web junto con otras
APIs de Espresso para interactuar completamente con elementos web dentro de objetos WebView
Si solo necesitas probar el WebView
y no el
interacciones entre WebView
y componentes nativos en tu app, considera
escribir una prueba web general con un framework como WebDriver Si usas un framework de pruebas web, no
necesitas usar un dispositivo Android o una máquina virtual Java, lo que hace que tus pruebas
se ejecuten de forma más rápida y confiable. Dicho esto, Espresso-Web permite reutilizar
tus átomos personalizados de WebDriver, lo que te da mucha flexibilidad, especialmente
cuando escribes pruebas que planeas ejecutar, tanto en apps web independientes como en
aplicaciones que incluyen una IU de Android.
Cómo funciona
De manera similar a onData()
de Espresso
, una interacción WebView
incluye varios Atoms.
Las interacciones WebView
usan una combinación del lenguaje de programación Java y un
puente JavaScript para hacer su trabajo. Debido a que no hay posibilidades de introducir
de carrera exponiendo datos del entorno de JavaScript: todo
Espresso considera que, en el lado basado en Java, es una copia aislada que muestra datos de
Web.WebInteraction
son completamente compatibles, lo que permite verificar todos los datos que se devuelven
una solicitud.
¿Qué es un Atom de WebDriver?
El framework de WebDriver usa Atoms para buscar y manipular elementos web.
programáticamente. WebDriver los utiliza para permitir la manipulación del navegador. Los
Conceptualmente, un Atom es similar a un
ViewAction
, un archivo
unidad que realiza una acción en tu IU. Los Atoms se exponen mediante una lista de
métodos definidos, como findElement()
y getElement()
, para controlar
navegador desde el punto de vista del usuario. Sin embargo, si usas WebDriver
un framework, los Atoms deben estar orquestados correctamente, lo que requiere una lógica que
es bastante detallado.
En Espresso, las clases Web
y Web.WebInteraction
unir este código estándar y darle una sensación de Espresso a la interacción con WebView
objetos. En el contexto de un WebView
, los Atoms se usan como
una sustitución de ViewMatchers
y ViewActions
de Espresso tradicionales.
La API parece bastante simple:
Kotlin
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion)
Java
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion);
Para obtener más información, consulta la documentación de Selenium sobre Atoms.
Cómo implementar WebView
Sigue las instrucciones que se muestran en las siguientes secciones para trabajar con
WebView
en las pruebas de tu app
Paquetes
Para incluir Espresso-Web en tu proyecto, completa los siguientes pasos:
- Abre el archivo
build.gradle
de tu app. Por lo general, esta no es la archivobuild.gradle
de nivel superior, peroapp/build.gradle
Agrega la siguiente línea dentro de las dependencias:
Groovy
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
Espresso-Web solo es compatible con Espresso 2.2 o versiones posteriores, y versión 0.3 o posterior de la biblioteca de pruebas, así que asegúrate de actualizarlas líneas de servicio:
Groovy
androidTestImplementation 'androidx.test:runner:1.6.1' androidTestImplementation 'androidx.test:rules:1.6.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
Kotlin
androidTestImplementation('androidx.test:runner:1.6.1') androidTestImplementation('androidx.test:rules:1.6.1') androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
Uso de API común
La onWebView()
es el punto de entrada principal cuando se trabaja con WebView en Android usando
Espresso Usas este método para realizar pruebas de Espresso-Web, como la
lo siguiente:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...)) .perform(webClick()) // Similar to perform(click()) // Similar to check(matches(...)) .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")))
Java
onWebView() .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...)) .perform(webClick()) // Similar to perform(click()) // Similar to check(matches(...)) .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")));
En este ejemplo, Espresso-Web localiza un elemento DOM cuyo ID es "link_2"
y
hace clic en él. Luego, la herramienta verifica que WebView envíe una solicitud GET
que contiene la cadena "navigation_2.html"
.
Soporte de JavaScript
Cuando ejecutas tus pruebas, el sistema realiza todas las interacciones de WebView usando JavaScript: Por lo tanto, para admitir la evaluación de JavaScript, el WebView bajo debe tener habilitado JavaScript.
Para forzar la habilitación de JavaScript, llama a
forceJavascriptEnabled()
como una acción en tu actividad bajo
prueba, como se muestra en la
siguiente fragmento de código.
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule val activityScenarioRule = activityScenarioRule<MyWebViewActivity>() @Test fun testWebViewInteraction() { onWebView().forceJavascriptEnabled() } }
Interacciones web comunes
Las interacciones comunes con los objetos Web.WebInteraction
incluyen lo siguiente:
-
withElement()
hace referencia a un elemento DOM dentro de WebView.Ejemplo:
Kotlin
onWebView().withElement(findElement(Locator.ID, "teacher"))
Java
onWebView().withElement(findElement(Locator.ID, "teacher"));
-
withContextualElement()
hace referencia a un elemento del DOM con alcance. dentro de WebView, en relación con otro elemento del DOM. Deberías llamarwithElement()
para establecer la referencia ObjetoWeb.WebInteraction
(elemento DOM).Ejemplo:
Kotlin
.withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name"))
Java
.withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name"));
-
check()
evalúa una condición y se asegura de que resuelva atrue
.Ejemplo:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name")) .check(webMatches(getText(), containsString("Socrates")))
Java
onWebView() .withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name")) .check(webMatches(getText(), containsString("Socrates")));
-
perform()
ejecuta una acción dentro de WebView, como cuando haces clic en un elemento.Ejemplo:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick())
Java
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick());
-
reset()
revierte WebView a su estado inicial. Esto es necesario cuando un acción, como un clic, introduce un cambio en la navegación que hace que No se puede acceder a los objetos ElementReference y WindowReference.Nota: Si bien el uso de
reset()
es útil cuando realizar aserciones frente a flujos de trabajo de varias páginas, como envíos de formularios, Por lo general, tus pruebas deben tener un alcance limitado y centrarse en una sola página.Ejemplo:
Kotlin
onWebView() .withElement(...) .perform(...) .reset()
Java
onWebView() .withElement(...) .perform(...) .reset();
Ejemplo
En el siguiente ejemplo, se prueba si, después de ingresar texto en un WebView y si seleccionas un botón Enviar, el mismo texto aparece dentro de un elemento diferente en la misma WebView:
Kotlin
const val MACCHIATO = "Macchiato" @RunWith(AndroidJUnit4::class) class MyEspressoWebTestSuite { @Test fun typeTextInInput_clickButton_SubmitsForm() { // Create an intent that displays a web form. val webFormIntent = Intent() // ... // Lazily launch the Activity with a custom start Intent per test. ActivityScenario.launchActivity(webFormIntent) // Selects the WebView in your layout. If you have multiple WebView // objects, you can also use a matcher to select a given WebView, // onWebView(withId(R.id.web_view)). onWebView() // Find the input element by ID. .withElement(findElement(Locator.ID, "text_input")) // Clear previous input and enter new text into the input element. .perform(clearElement()) .perform(DriverAtoms.webKeys(MACCHIATO)) // Find the "Submit" button and simulate a click using JavaScript. .withElement(findElement(Locator.ID, "submitBtn")) .perform(webClick()) // Find the response element by ID, and verify that it contains the // entered text. .withElement(findElement(Locator.ID, "response")) .check(webMatches(getText(), containsString(MACCHIATO))) } }
Java
public static final String MACCHIATO = "Macchiato"; @Test public void typeTextInInput_clickButton_SubmitsForm() { // Create an intent that displays a web form. Intent webFormIntent = new Intent(); // ... // Lazily launch the Activity with a custom start Intent per test. ActivityScenario.launchActivity(webFormIntent); // Selects the WebView in your layout. If you have multiple WebView objects, // you can also use a matcher to select a given WebView, // onWebView(withId(R.id.web_view)). onWebView() // Find the input element by ID. .withElement(findElement(Locator.ID, "text_input")) // Clear previous input and enter new text into the input element. .perform(clearElement()) .perform(DriverAtoms.webKeys(MACCHIATO)) // Find the "Submit" button and simulate a click using JavaScript. .withElement(findElement(Locator.ID, "submitBtn")) .perform(webClick()) // Find the response element by ID, and verify that it contains the // entered text. .withElement(findElement(Locator.ID, "response")) .check(webMatches(getText(), containsString(MACCHIATO))); }
Recursos adicionales
Para obtener más información sobre el uso de Espresso-Web en pruebas de Android, consulta el los siguientes recursos.
Ejemplos
- WebBasicSample:
Usa Espresso-Web para interactuar con objetos
WebView
.