Espresso-Web jest punktem wejścia do pracy z komponentami interfejsu WebView Androida. Espresso-Web wykorzystuje zasoby Atom z popularnego interfejsu WebDriver API do badania i kontrolowania działania komponentu WebView.
Kiedy używać Espresso-Web
Za pomocą Espresso-Web przetestuj aplikacje hybrydowe, a zwłaszcza integrację
natywne komponenty interfejsu aplikacji wraz z parametrem WebView
Komponenty interfejsu. Interfejsu API Espresso-Web możesz używać w połączeniu z innymi
Interfejsy API Espresso umożliwiają pełną interakcję z elementami internetowymi wewnątrz obiektów WebView
.
Jeśli chcesz przetestować tylko samą regułę WebView
, a nie
interakcje między elementem WebView
a komponentami natywnymi w aplikacji, rozważ
pisania ogólnego testu internetowego wykorzystującego platformę taką jak WebDriver. Jeśli korzystasz z platformy do testowania stron internetowych,
muszą używać urządzenia z Androidem lub maszyny wirtualnej Java, co umożliwia przeprowadzanie testów
które przebiegają szybciej i bardziej wydajnie. Jednak Espresso-Web pozwala na ponowne wykorzystywanie
niestandardowe atomy funkcji WebDriver, które zapewniają dużą elastyczność, zwłaszcza
przy pisaniu testów, które planujesz przeprowadzić
zarówno w osobnych aplikacjach internetowych,
które mają interfejs Androida.
Jak to działa
Podobnie jak onData()
Espresso
metoda, interakcja WebView
składa się z kilku elementów Atom.
Interakcje WebView
wykorzystują język programowania Java oraz
JavaScriptu. Ponieważ nie ma możliwości wprowadzenia
przez ujawnianie danych ze środowiska JavaScript.
Espresso widzi stronę opartą na Javie to izolowana kopia, z której
Web.WebInteraction
Obiekty są w pełni obsługiwane, co pozwala zweryfikować wszystkie dane zwracane przez
o żądanie.
Co to jest WebDriver Atom?
Platforma WebDriver wykorzystuje Atoms do wyszukiwania elementów internetowych i manipulowania nimi
automatycznie. Elementy Atom są używane przez WebDriver do umożliwienia manipulacji przeglądarką. An
Atom jest koncepcyjnie podobny do
ViewAction
– aplikacja niezależna
która wykonuje działanie w interfejsie. Ujawniasz Atoms za pomocą listy
w określonych metodach, takich jak findElement()
i getElement()
,
z perspektywy użytkownika. Jeśli jednak używasz WebDriver
bezpośrednio na platformie, środowisko Atom wymaga odpowiedniej koordynacji,
jest dość szczegółowy.
W ramach zajęć „Espresso” zajęcia Web
i Web.WebInteraction
aby wejść w interakcję z komponentem WebView, by wyglądało jak espresso
obiektów. Dlatego w kontekście WebView
dane Atoms są używane jako
zamiennik tradycyjnego espresso ViewMatchers
i ViewActions
.
Interfejs API wygląda wtedy całkiem prosto:
Kotlin
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion)
Java
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion);
Więcej informacji znajdziesz w dokumentacji firmy Seenium poświęconej usłudze Atoms.
Wdróż WebView
Aby pracować z nimi, postępuj zgodnie ze wskazówkami podanymi w poniższych sekcjach
WebView
w testach aplikacji.
Pakiety
Aby włączyć Espresso-Web w swoim projekcie, wykonaj te czynności:
- Otwórz plik
build.gradle
z aplikacją. Zwykle nie jest to plikubuild.gradle
najwyższego poziomu, aleapp/build.gradle
Dodaj ten wiersz w zależności:
Odlotowe
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
Aplikacja Espresso-Web jest zgodna tylko z Espresso 2.2 lub nowszym i biblioteki testowej w wersji 0.3 lub nowszej, więc pamiętaj o ich aktualizowaniu oraz wiersze:
Odlotowe
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')
Typowe zastosowania interfejsu API
onWebView()
jest głównym punktem wejścia podczas pracy z komponentem WebView na Androidzie za pomocą
Espresso Ta metoda służy do przeprowadzania testów Espresso-Web, takich jak
:
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")));
W tym przykładzie Espresso-Web znajduje element DOM, którego identyfikator to "link_2"
, a
go kliknie. Następnie narzędzie sprawdza, czy WebView wysyła żądanie GET.
zawierający ciąg "navigation_2.html"
.
Obsługa JavaScriptu
Podczas wykonywania testów system wykonuje wszystkie interakcje WebView z komponentami JavaScriptu. Dlatego do oceny JavaScriptu testowany jest komponent WebView musi mieć włączoną obsługę JavaScriptu.
Możesz wymusić włączenie JavaScriptu, wywołując
forceJavascriptEnabled()
jako działanie w ramach aktywności
test, jak widać w tabeli
ten fragment kodu.
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule val activityScenarioRule = activityScenarioRule<MyWebViewActivity>() @Test fun testWebViewInteraction() { onWebView().forceJavascriptEnabled() } }
Typowe interakcje z internetem
Typowe interakcje z obiektami Web.WebInteraction
to między innymi:
-
withElement()
odwołuje się do elementu DOM w WebView.Przykład:
Kotlin
onWebView().withElement(findElement(Locator.ID, "teacher"))
Java
onWebView().withElement(findElement(Locator.ID, "teacher"));
-
withContextualElement()
odwołuje się do elementu DOM o zakresie w komponencie WebView w stosunku do innego elementu DOM. ZadzwońwithElement()
, aby utworzyć odniesienie ObiektWeb.WebInteraction
(element DOM).Przykład:
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()
ocenia warunek, upewniając się, że jest rozwiązany dotrue
.Przykład:
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()
wykonuje działanie w komponencie WebView, takie jak: po kliknięciu elementu.Przykład:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick())
Java
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick());
-
reset()
przywraca komponent WebView do początkowego stanu. Jest to konieczne, gdy przed działanie, np. kliknięcie, powoduje zmianę nawigacji Obiekty ElementReference i WindowReference niedostępne.Uwaga: chociaż
reset()
jest przydatny, gdy twierdzenia dotyczące wielostronicowych przepływów pracy, takich jak przesyłanie formularzy, powinny być zazwyczaj ograniczone i koncentrować się na jednej stronie.Przykład:
Kotlin
onWebView() .withElement(...) .perform(...) .reset()
Java
onWebView() .withElement(...) .perform(...) .reset();
Przykład
W przykładzie poniżej sprawdzisz, czy po wpisaniu tekstu w komponencie WebView i kliknięcie przycisku Prześlij spowoduje, że ten sam tekst pojawi się w innym elemencie ten sam komponent 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))); }
Dodatkowe materiały
Więcej informacji o korzystaniu z Espresso-Web w testach na Androidzie znajdziesz w poniższe zasoby.
Próbki
- WebBasicSample:
Użyj Espresso-Web do interakcji z obiektami
WebView
.