Espresso w sieci

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:

  1. Otwórz plik build.gradle z aplikacją. Zwykle nie jest to pliku build.gradle najwyższego poziomu, ale app/build.gradle
  2. 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')
        
  3. 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 Obiekt Web.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 do true.

    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.