Espresso Web

Espresso-Web est un point d'entrée pour utiliser les composants d'interface utilisateur Android WebView. Espresso-Web réutilise les éléments Atom de la célèbre API WebDriver pour examiner et contrôler le comportement d'un composant WebView.

Quand utiliser Espresso-Web

Utilisez Espresso-Web pour tester vos applications hybrides, en particulier l'intégration de votre les composants d'UI natifs de l'application avec son WebView composants d'UI. Vous pouvez utiliser l'API Espresso-Web avec d'autres API Espresso pour interagir pleinement avec les éléments Web dans des objets WebView.

Si vous devez tester uniquement le WebView lui-même, et non le des interactions entre le WebView et les composants natifs de votre application, pensez à écrire un test Web général à l'aide d'un framework tel que WebDriver ; Si vous utilisez un framework de test Web, un appareil Android ou une machine virtuelle Java. Vos tests de manière plus rapide et plus fiable. Cela dit, Espresso-Web vous permet de réutiliser vos atomes WebDriver personnalisés, ce qui vous offre une grande flexibilité, lorsque vous écrivez des tests que vous prévoyez d'exécuter à la fois sur des applications Web autonomes les applications qui incluent une interface utilisateur Android.

Fonctionnement

Semblable à la méthode onData() d'Espresso , une interaction WebView comprend plusieurs objets Atom. Les interactions WebView utilisent le langage de programmation Java et une pour faire leur travail. Comme il n'y a aucun risque d'introduire les conditions de concurrence en exposant les données de l'environnement JavaScript, Côté Java, Espresso voit qu'il s'agit d'une copie isolée qui renvoie des données Web.WebInteraction est entièrement compatible, ce qui vous permet de vérifier toutes les données renvoyées par une demande.

Qu'est-ce qu'un outil WebDriver Atom ?

Le framework WebDriver utilise Atoms pour rechercher et manipuler des éléments Web de manière programmatique. Les fichiers Atom sont utilisés par WebDriver pour permettre la manipulation du navigateur. Une Atom est conceptuellement similaire à ViewAction, une instance qui effectue une action dans votre interface utilisateur. Vous exposez Atoms à l'aide d'une liste des méthodes définies, telles que findElement() et getElement(), pour piloter du point de vue de l'utilisateur. Toutefois, si vous utilisez la commande WebDriver les Atoms doivent être correctement ordonnés, ce qui nécessite une logique est assez long.

Dans Espresso, les classes Web et Web.WebInteraction Encapsulez ce code récurrent et donnez une sensation d'Espresso lors de l'interaction avec WebView. d'objets. Ainsi, dans le contexte d'un WebView, les Atoms sont utilisés comme une substitution à la méthode traditionnelle Espresso ViewMatchers et ViewActions.

L'API semble alors assez simple:

Kotlin

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion)

Java

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion);

Pour en savoir plus, consultez la documentation de Selenium sur Atoms.

Implémenter WebView

Suivez les instructions fournies dans les sections suivantes pour utiliser WebView dans les tests de votre application.

Packages

Pour inclure Espresso-Web dans votre projet, procédez comme suit:

  1. Ouvrez le fichier build.gradle de votre application. Ce n'est généralement pas fichier build.gradle de premier niveau, mais app/build.gradle
  2. Ajoutez la ligne suivante dans les dépendances:

    Groovy

        androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
        

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. Espresso-Web n'est compatible qu'avec Espresso 2.2 ou version ultérieure. version 0.3 ou ultérieure de la bibliothèque de test. Veillez donc à les mettre à jour ainsi que les lignes suivantes:

    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')
        

Utilisation courante des API

onWebView() est le principal point d'entrée lorsque vous travaillez avec WebView sur Android à l'aide de Espresso Elle vous permet d'effectuer des tests avec Espresso-Web, tels que suivantes:

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")));

Dans cet exemple, Espresso-Web localise un élément DOM dont l'ID est "link_2". clique dessus. L'outil vérifie ensuite que WebView envoie une requête GET contenant la chaîne "navigation_2.html".

Compatibilité JavaScript

Lors de l'exécution de vos tests, le système effectue toutes les interactions WebView à l'aide de JavaScript. Par conséquent, pour prendre en charge l'évaluation JavaScript, la WebView testée JavaScript doit être activé.

Vous pouvez forcer l'activation de JavaScript en appelant forceJavascriptEnabled() comme une action dans votre activité sous de test, comme illustré dans le l'extrait de code suivant.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule val activityScenarioRule =
        activityScenarioRule<MyWebViewActivity>()

    @Test fun testWebViewInteraction() {
        onWebView().forceJavascriptEnabled()
    }
}

Interactions courantes sur le Web

Voici quelques-unes des interactions courantes avec les objets Web.WebInteraction:

  • withElement() référence un élément DOM dans la WebView.

    Exemple :

    Kotlin

    onWebView().withElement(findElement(Locator.ID, "teacher"))
    

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • <ph type="x-smartling-placeholder"></ph> withContextualElement() fait référence à un élément DOM limité dans la WebView, par rapport à un autre élément DOM. Vous devez appeler withElement() pour établir la référence Objet Web.WebInteraction (élément DOM).

    Exemple :

    Kotlin

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
    

    Java

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"));
    
  • <ph type="x-smartling-placeholder"></ph> check() évalue une condition et s'assure qu'elle se résout à true.

    Exemple :

    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")));
    
  • <ph type="x-smartling-placeholder"></ph> perform() exécute une action dans un WebView, telle que en cliquant sur un élément.

    Exemple :

    Kotlin

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick())
    

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset() rétablit l'état initial de la WebView. Cela est nécessaire lorsqu'une action, telle qu'un clic, introduit un changement de navigation qui rend Objets ElementReference et WindowReference inaccessibles.

    Remarque:Bien que l'utilisation de reset() soit utile lorsque d'effectuer des assertions sur des workflows multipages, comme les envois de formulaires, vos tests doivent généralement avoir une portée limitée et se concentrer sur une seule page.

    Exemple :

    Kotlin

    onWebView()
        .withElement(...)
        .perform(...)
        .reset()
    

    Java

    onWebView()
        .withElement(...)
        .perform(...)
        .reset();
    

Exemple

L'exemple suivant vérifie si, après avoir saisi du texte dans une WebView et sélectionnez un bouton Envoyer, le même texte apparaît dans un autre élément du la même 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)));
}

Ressources supplémentaires

Pour en savoir plus sur l'utilisation d'Espresso-Web dans les tests Android, consultez le les ressources suivantes.

Exemples

  • WebBasicSample: Utiliser Espresso-Web pour interagir avec des objets WebView.