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()
, um den
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:
- Öffnen Sie die
build.gradle
-Datei Ihrer App. Dies ist normalerweise nicht oberste Ebenebuild.gradle
-Datei, aberapp/build.gradle
. 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')
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. Rufen SiewithElement()
zuerst zum Erstellen der ReferenzWeb.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 antrue
.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 Ihre 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.