Espresso

Espresso-Web ist ein Einstiegspunkt für die Arbeit mit Android WebView-UI-Komponenten. Espresso-Web verwendet Atoms aus der beliebten WebDriver API wieder, um das Verhalten einer WebView zu untersuchen und zu steuern.

Verwendung von Espresso-Web

Verwenden Sie Espresso-Web, um Ihre Hybrid-Apps zu testen, insbesondere die Integration Ihrer nativen UI-Komponenten der App mit der WebView UI-Komponenten Sie können die Espresso-Web API in Verbindung mit anderen Espresso-APIs für die vollständige Interaktion mit Webelementen in WebView-Objekten

Wenn Sie nur die WebView selbst und nicht die zwischen den WebView- und nativen Komponenten in Ihrer App, Einen allgemeinen Webtest mit einem Framework wie WebDriver zu schreiben Wenn ihr ein Webtest-Framework verwendet, ein Android-Gerät oder eine virtuelle Maschine (Java Machine) verwenden, schneller und zuverlässiger ausgeführt werden. Allerdings können Sie mit Espresso-Web Ihre benutzerdefinierten WebDriver-Atome, was Ihnen eine große Flexibilität bietet, wenn Sie Tests für eigenständige Web-Apps und Apps mit Android-UI.

Funktionsweise

Ähnlich wie onData() von Espresso umfasst eine WebView-Interaktion mehrere Atome. WebView-Interaktionen verwenden eine Kombination aus der Programmiersprache Java und einem JavaScript-Bridge verwenden. Da es keine Chance gibt, Race-Bedingungen durch Bereitstellung von Daten aus der JavaScript-Umgebung – Espresso sieht auf der Java-basierten Seite eine isolierte Kopie, die Daten von Web.WebInteraction wird vollständig unterstützt, sodass Sie alle Daten überprüfen können, die von einen Antrag stellen.

Was ist ein WebDriver-Atom?

Das WebDriver-Framework nutzt Atoms, um Webelemente zu finden und zu bearbeiten Programmatisch garantiert. Atome werden von WebDriver verwendet, um Browsermanipulationen zu ermöglichen. Eine Das Atom ähnelt konzeptionell einem ViewAction, eine eigenständige Einheit, die eine Aktion in Ihrer Benutzeroberfläche ausführt. Atome werden mithilfe einer Liste wie findElement() und getElement() definiert, aus der Sicht des Nutzers betrachten. Wenn Sie jedoch den WebDriver müssen die Atoms ordnungsgemäß orchestriert werden. Dabei ist Logik erforderlich, ist ziemlich ausführlich.

Bei Espresso sind die Klassen Web und Web.WebInteraction diese Boilerplate-Datei verpacken und der Interaktion mit WebView ein Espresso-ähnliches Gefühl verleihen. Objekte. Im Kontext eines WebView werden Atome als Dies ist ein Ersatz für den herkömmlichen Espresso ViewMatchers und ViewActions.

Die API sieht dann ganz einfach aus:

Kotlin

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

Java

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

Weitere Informationen finden Sie in der Selenium-Dokumentation zu Atoms.

WebView implementieren

Folgen Sie der Anleitung in den folgenden Abschnitten, wenn Sie mit WebView in den Tests Ihrer App.

Pakete

Führen Sie die folgenden Schritte aus, um Espresso-Web in Ihr Projekt aufzunehmen:

  1. Öffnen Sie die build.gradle-Datei Ihrer App. Dies ist normalerweise nicht oberste Ebene build.gradle-Datei, aber app/build.gradle.
  2. Fügen Sie die folgende Zeile innerhalb der Abhängigkeiten ein:

    Cool

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

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. Espresso-Web ist nur mit Espresso 2.2 oder höher kompatibel und Version 0.3 oder höher der Testbibliothek. Stellen Sie daher sicher, dass Sie diese hinzufügen:

    Cool

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

Häufige API-Nutzung

Die onWebView() ist der Haupteinstiegspunkt bei der Arbeit mit WebView unter Android mithilfe von Espresso. Sie verwenden diese Methode zur Durchführung von Espresso-Web-Tests wie z. B. der Folgendes:

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 diesem Beispiel findet Espresso-Web ein DOM-Element mit der ID "link_2" und darauf klickt. Das Tool überprüft dann, ob WebView eine GET-Anfrage sendet. mit dem String "navigation_2.html".

JavaScript-Unterstützung

Beim Ausführen Ihrer Tests führt das System alle WebView-Interaktionen mithilfe JavaScript Um die JavaScript-Auswertung zu unterstützen, JavaScript muss aktiviert sein.

Sie können die Aktivierung von JavaScript erzwingen, indem Sie den Aufruf forceJavascriptEnabled() als Aktion in Ihrer Aktivität unter testen, wie in den folgenden Code-Snippet.

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

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

Häufige Webinteraktionen

Zu den häufigsten Interaktionen mit Web.WebInteraction-Objekten gehören:

  • withElement() auf ein DOM-Element innerhalb der WebView verweist.

    Beispiel:

    Kotlin

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

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • <ph type="x-smartling-placeholder"></ph> withContextualElement() verweist auf ein beschränktes DOM-Element innerhalb der WebView relativ zu einem anderen DOM-Element. Am besten rufen Sie withElement() zuerst zum Erstellen der Referenz Web.WebInteraction-Objekt (DOM-Element).

    Beispiel:

    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() wertet eine Bedingung aus und stellt sicher, dass sie aufgelöst wird an true.

    Beispiel:

    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() führt eine Aktion in einer WebView aus, z. B. auf ein Element klicken.

    Beispiel:

    Kotlin

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

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset() setzt die WebView in ihren Ausgangszustand zurück. Dies ist notwendig, wenn ein z. B. ein Klick, eine Navigationsänderung hervorruft, durch die Auf ElementReference- und WindowReference-Objekte kann nicht zugegriffen werden.

    Hinweis:Die Verwendung von reset() ist nützlich, Assertions gegenüber mehrseitigen Workflows wie z. B. Formulareinreichungen, sollten die Tests in der Regel begrenzt sein und sich auf eine einzige Seite konzentrieren.

    Beispiel:

    Kotlin

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

    Java

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

Beispiel

Im folgenden Beispiel wird getestet, ob nach der Eingabe von Text in eine WebView und auf die Schaltfläche Senden klicken, erscheint derselbe Text in einem anderen Element in 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)));
}

Weitere Informationen

Weitere Informationen zur Verwendung von Espresso-Web in Android-Tests finden Sie in der in den folgenden Ressourcen.

Produktproben

  • WebBasicSample: Verwenden Sie Espresso-Web, um mit WebView-Objekten zu interagieren.