Espresso per il Web

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:

  1. Apri il file build.gradle dell'app. Di solito non sono file build.gradle di primo livello ma app/build.gradle.
  2. 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')
        
  3. 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 chiamare withElement() prima di stabilire il riferimento Oggetto Web.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 a true.

    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.