The Android Developer Challenge is back! Submit your idea before December 2.

Espresso Web

Espresso-Web adalah titik masuk untuk bekerja dengan komponen UI Android WebView. Espresso-Web menggunakan kembali Atom dari WebDriver API populer untuk memeriksa dan mengontrol perilaku WebView.

Kapan harus menggunakan Espresso-Web

Gunakan Espresso-Web untuk menguji aplikasi hybrid Anda, terutama integrasi komponen UI asli aplikasi Anda dengan komponen UI WebView-nya. Anda dapat menggunakan Espresso-Web API bersama dengan Espresso API lainnya untuk berinteraksi sepenuhnya dengan elemen web dalam objek WebView.

Jika hanya perlu menguji WebView, dan bukan interaksi antara WebView dan komponen asli di aplikasi Anda, cobalah menulis pengujian web umum menggunakan framework seperti WebDriver. Jika menggunakan framework pengujian web, Anda tidak perlu menggunakan perangkat Android atau Java Virtual Machine, yang membuat pengujian Anda berjalan lebih cepat dan andal. Jadi, Espresso-Web memungkinkan Anda untuk menggunakan kembali atom WebDriver kustom, yang memberi banyak fleksibilitas, terutama saat menulis pengujian yang Anda rencanakan untuk dijalankan terhadap kedua aplikasi web mandiri dan aplikasi yang menyertakan UI Android.

Cara kerja

Sama dengan metode onData() Espresso, interaksi WebView terdiri dari beberapa Atom. Interaksi WebView menggunakan kombinasi bahasa pemrograman Java dan bridge JavaScript untuk memudahkan Anda. Karena tidak ada peluang memperkenalkan kondisi race dengan menampilkan data dari lingkungan JavaScript — semua yang dilihat Espresso di sistem berbasis Java adalah salinan yang terisolasi — mengembalikan data dari objek Web.WebInteraction didukung sepenuhnya, memungkinkan Anda memverifikasi semua data yang dikembalikan dari permintaan.

Apa yang dimaksud Atom WebDriver?

Framework WebDriver menggunakan Atom untuk menemukan dan memanipulasi elemen web secara terprogram. Atom digunakan oleh WebDriver untuk memungkinkan manipulasi browser. Atom secara konseptual mirip dengan ViewAction, sebuah unit yang sepenuhnya berfungsi sendiri yang melakukan tindakan di UI Anda. Tampilkan Atom menggunakan daftar metode yang ditentukan, seperti findElement() dan getElement(), untuk mengarahkan browser dari sudut pandang pengguna. Namun, jika Anda menggunakan framework WebDriver secara langsung, Atom harus dikoordinasi dengan benar, sehingga memerlukan logika yang sedikit lebih panjang.

Dalam Espresso, class Web dan Web.WebInteraction menggabungkan boilerplate ini dan memberikan sentuhan seperti Espresso untuk berinteraksi dengan objek WebView. Jadi, dalam konteks WebView, Atom digunakan sebagai pengganti untuk Espresso ViewMatchers dan ViewActions tradisional.

API akan terlihat cukup sederhana:

Kotlin

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

Java

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

Untuk mempelajari lebih lanjut, baca dokumentasi Selenium tentang Atom.

Menerapkan WebView

Ikuti panduan yang ditunjukkan di bagian berikut ini untuk bekerja dengan WebView di pengujian aplikasi Anda.

Paket

Untuk menyertakan Espresso-Web dalam project Anda, lakukan langkah-langkah berikut:

  1. Buka file build.gradle aplikasi Anda. File tersebut biasanya bukan file build.gradle tingkat teratas, tetapi app/build.gradle.
  2. Tambahkan baris berikut di dalam dependensi:

        androidTestImplementation 'androidx.test.espresso:espresso-web:3.1.0'
        
  3. Espresso-Web hanya kompatibel dengan Espresso 2.2 atau yang lebih tinggi dan versi 0.3 atau yang lebih tinggi dari library pengujian, jadi, pastikan Anda memperbarui baris tersebut juga:

        androidTestImplementation 'androidx.test:runner:1.1.0'
        androidTestImplementation 'androidx.test:rules:1.1.0'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
        

Penggunaan API umum

Metode onWebView() adalah titik masuk awal saat bekerja dengan WebView di Android menggunakan Espresso. Gunakan metode ini untuk melakukan pengujian Espresso-Web, seperti berikut ini:

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

Dalam contoh ini, Espresso-Web menemukan elemen DOM yang ID-nya adalah "link_2" lalu mengkliknya. Fitur tersebut kemudian memverifikasi bahwa WebView mengirim permintaan GET yang berisi string "navigation_2.html".

Dukungan JavaScript

Saat menjalankan pengujian Anda, sistem melakukan semua interaksi WebView menggunakan JavaScript. Oleh karena itu, untuk mendukung evaluasi JavaScript, WebView yang diuji harus mengaktifkan JavaScript.

Anda dapat memaksa JavaScript untuk diaktifkan dengan memanggil forceJavascriptEnabled() sebagai tindakan dalam aktivitas Anda yang sedang diuji, seperti yang ditunjukkan dalam cuplikan kode berikut.

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

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

Interaksi web umum

Interaksi umum dengan objek Web.WebInteraction menyertakan interaksi berikut:

  • withElement() mereferensikan elemen DOM dalam WebView.

    Contoh:

    Kotlin

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

    Java

        onWebView().withElement(findElement(Locator.ID, "teacher"));
        
  • withContextualElement() mereferensikan elemen DOM terbatas dalam WebView, yang terkait dengan elemen DOM lainnya. Anda harus memanggil withElement() terlebih dahulu untuk membuat referensi objek Web.WebInteraction (elemen DOM).

    Contoh:

    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() mengevaluasi suatu kondisi, memastikan bahwa kondisi ditetapkan ke true.

    Contoh:

    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() menjalankan tindakan dalam WebView, seperti mengklik elemen.

    Contoh:

    Kotlin

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

    Java

        onWebView()
            .withElement(findElement(Locator.ID, "teacher"))
            .perform(webClick());
        
  • reset() mengembalikan WebView ke kondisi awalnya. Tindakan ini diperlukan sebelum tindakan sebelumnya, seperti klik, memperkenalkan perubahan navigasi yang membuat objek ElementReference dan WindowReference tidak dapat diakses.

    Catatan: Meskipun menggunakan reset() berguna saat membuat penegasan terhadap alur kerja multi-halaman, seperti pengiriman formulir, pengujian Anda biasanya harus dibatasi dalam cakupan dan fokus pada satu halaman.

    Contoh:

    Kotlin

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

    Java

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

Contoh

Contoh berikut menguji apakah, setelah memasukkan teks ke dalam WebView dan memilih tombol Kirim, teks yang sama akan muncul di dalam elemen yang berbeda dalam WebView yang sama:

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

Referensi lainnya

Untuk informasi selengkapnya tentang menggunakan Espresso-Web dalam pengujian Android, lihat referensi berikut.

Contoh

  • WebBasicSample: Gunakan Espresso-Web untuk berinteraksi dengan objek WebView.