Espresso-Web è un punto di accesso per lavorare con i componenti UI di Android WebView. Espresso-Web riutilizza gli Atoms della nota API WebDriver per esaminare e controllare il comportamento di una WebView.
Quando utilizzare Espresso-Web
Usate Espresso-Web per testare le vostre app ibride, in particolare l'integrazione dei vostri
componenti UI nativi dell'app con i relativi WebView
componenti dell'interfaccia utente. Puoi utilizzare l'API Espresso-Web insieme ad altri
API Espresso per interagire completamente con gli elementi web all'interno degli oggetti WebView
.
Se devi testare solo il componente WebView
e non
interazioni tra WebView
e i componenti nativi della tua app, considera
scrivere un test web generico utilizzando un framework come WebDriver. Se utilizzi un framework di test web,
utilizzare un dispositivo Android o una Java Virtual Machine, che consente di eseguire
possono essere eseguiti in modo più rapido e affidabile. Detto questo, Espresso-Web consente di riutilizzare
i tuoi atom WebDriver personalizzati, il che ti offre molta flessibilità,
quando scrivi test che prevedi di eseguire sia su app web autonome,
che includono una UI Android.
Come funziona
Analogamente a onData()
di Espresso
, un'interazione WebView
comprende diversi Atomi.
Le interazioni con WebView
utilizzano una combinazione del linguaggio di programmazione Java e
bridge JavaScript per svolgere il proprio lavoro. Perché non è possibile introdurre
di competere con l'IA tramite l'esposizione dei dati dell'ambiente JavaScript,
Espresso ritiene che sul lato basato su Java sia una copia isolata, che restituisce dati
Web.WebInteraction
di oggetti è completamente supportato, consentendoti di verificare tutti i dati restituiti
una richiesta.
Che cos'è un Atom di WebDriver?
Il framework WebDriver utilizza Atoms per trovare e manipolare gli elementi web
in modo programmatico. Gli atomi vengono utilizzati da WebDriver per consentire la manipolazione del browser. Un
Atom è concettualmente simile a un
ViewAction
, un'architettura indipendente
che esegue un'azione nell'interfaccia utente. Esponi gli atomi usando un elenco di
metodi definiti, come findElement()
e getElement()
, per promuovere
browser dal punto di vista dell'utente. Tuttavia, se utilizzi WebDriver
framework direttamente, gli Atoms devono essere adeguatamente orchestrati, richiedendo una logica
è piuttosto dettagliato.
All'interno di Espresso, i corsi Web
e Web.WebInteraction
questo boilerplate e dare un'atmosfera come un caffè espresso all'interazione con WebView
di oggetti strutturati. Quindi, nel contesto di un WebView
, gli atomi vengono usati come
al posto del tradizionale espresso ViewMatchers
e ViewActions
.
A questo punto l'API ha un aspetto piuttosto semplice:
Kotlin
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion)
Java
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion);
Per saperne di più, leggi la documentazione di Selenium sugli Atoms.
Implementa WebView
Segui le indicazioni mostrate nelle sezioni seguenti per lavorare con
WebView
nei test dell'app.
Pacchetti
Per includere Espresso-Web nel tuo progetto, completa i seguenti passaggi:
- Apri il file
build.gradle
dell'app. Di solito non sono filebuild.gradle
di primo livello maapp/build.gradle
. Aggiungi la seguente riga all'interno delle dipendenze:
Alla moda
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
Espresso-Web è compatibile solo con Espresso 2.2 o versioni successive e versione 0.3 o successiva della libreria di test, quindi assicurati di aggiornarle a riga di comando:
Alla moda
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')
Utilizzo comune dell'API
La onWebView()
è il punto di accesso principale quando si lavora con WebView su Android
Il caffè espresso. Questo metodo viene utilizzato per eseguire i test Espresso-Web, come
seguenti:
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")));
In questo esempio, Espresso-Web individua un elemento DOM il cui ID è "link_2"
e
e ci fa clic sopra. Lo strumento verifica quindi che WebView invii una richiesta GET
contenente la stringa "navigation_2.html"
.
Supporto JavaScript
Durante l'esecuzione dei test, il sistema esegue tutte le interazioni WebView utilizzando JavaScript. Pertanto, per supportare la valutazione JavaScript, il componente WebView sottoposto a test deve avere JavaScript attivato.
Puoi forzare l'attivazione di JavaScript chiamando
forceJavascriptEnabled()
come azione nella tua attività sotto
test, come mostrato
successivo snippet di codice.
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule val activityScenarioRule = activityScenarioRule<MyWebViewActivity>() @Test fun testWebViewInteraction() { onWebView().forceJavascriptEnabled() } }
Interazioni web comuni
Le interazioni comuni con gli oggetti Web.WebInteraction
includono quanto segue:
-
withElement()
fa riferimento a un elemento DOM all'interno di WebView.Esempio:
Kotlin
onWebView().withElement(findElement(Locator.ID, "teacher"))
Java
onWebView().withElement(findElement(Locator.ID, "teacher"));
-
withContextualElement()
fa riferimento a un elemento DOM con ambito all'interno di WebView rispetto a un altro elemento DOM. Devi chiamarewithElement()
prima di stabilire il riferimento OggettoWeb.WebInteraction
(elemento DOM).Esempio:
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()
valuta una condizione, assicurandosi che si risolva atrue
.Esempio:
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()
esegue un'azione all'interno di un componente WebView, ad esempio facendo clic su un elemento.Esempio:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick())
Java
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick());
-
reset()
ripristina lo stato iniziale di WebView. Ciò è necessario quando una precedente un'azione, come un clic, introduce una modifica alla navigazione che rende Oggetti ElementReference e WindowReference inaccessibili.Nota: l'utilizzo di
reset()
è utile quando fare asserzioni in base a flussi di lavoro di più pagine, come l'invio di moduli, i test dovrebbero generalmente avere un ambito limitato e concentrarsi su una sola pagina.Esempio:
Kotlin
onWebView() .withElement(...) .perform(...) .reset()
Java
onWebView() .withElement(...) .perform(...) .reset();
Esempio
L'esempio seguente verifica se, dopo aver inserito il testo in un componente WebView e selezionando un pulsante Invia, lo stesso testo verrà visualizzato all'interno di un elemento diverso in la stessa 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))); }
Risorse aggiuntive
Per ulteriori informazioni sull'uso di Espresso-Web nei test Android, consulta il le seguenti risorse.
Campioni
- WebBasicSample:
Usa Espresso-Web per interagire con
WebView
oggetti.