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 aplikasi komponen UI native aplikasi dengan WebView Komponen UI. Anda dapat menggunakan Espresso-Web API bersama Espresso API untuk berinteraksi sepenuhnya dengan elemen web di dalam objek WebView.

Jika Anda hanya perlu menguji WebView itu sendiri, dan bukan interaksi antara WebView dan komponen native di aplikasi Anda, pertimbangkan menulis pengujian web umum menggunakan framework seperti WebDriver. Jika Anda menggunakan kerangka kerja pengujian web, Anda tidak harus menggunakan perangkat Android atau Mesin Virtual Java, yang membuat pengujian berjalan lebih cepat dan andal. Meskipun demikian, Espresso-Web memungkinkan Anda untuk menggunakan kembali atom WebDriver khusus Anda, yang memberikan banyak fleksibilitas, terutama saat menulis pengujian yang ingin Anda jalankan terhadap aplikasi web mandiri dan aplikasi yang menyertakan UI Android.

Cara kerjanya

Sama seperti onData() Espresso , interaksi WebView terdiri dari beberapa Atom. Interaksi WebView menggunakan kombinasi bahasa pemrograman Java dan jembatan JavaScript untuk melakukan pekerjaannya. Karena tidak ada peluang untuk kondisi race dengan mengekspos data dari lingkungan JavaScript—semuanya yang dilihat Espresso di sisi berbasis Java adalah salinan terisolasi, yang mengembalikan data dari Web.WebInteraction sepenuhnya didukung, memungkinkan Anda untuk memverifikasi semua data yang dikembalikan membuat permintaan.

Apa yang dimaksud Atom WebDriver?

Kerangka kerja WebDriver menggunakan Atom untuk menemukan dan memanipulasi elemen web secara terprogram. Atom digunakan oleh WebDriver untuk memungkinkan manipulasi browser. Channel Atom secara konseptual mirip dengan ViewAction, solusi mandiri yang melakukan tindakan di UI Anda. Anda mengekspos Atom menggunakan daftar metode yang ditentukan, seperti findElement() dan getElement(), untuk mendorong {i>browser<i} dari sudut pandang pengguna. Namun, jika Anda menggunakan {i>WebDriver<i} secara langsung, Atom perlu diorkestrasi dengan benar, membutuhkan logika yang cukup panjang.

Dalam Espresso, class Web dan Web.WebInteraction gabungkan boilerplate ini dan berikan sentuhan seperti Espresso untuk berinteraksi dengan WebView objek terstruktur dalam jumlah besar. Jadi dalam konteks WebView, Atom digunakan sebagai pengganti 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.

Mengimplementasikan WebView

Ikuti panduan yang ditampilkan di bagian berikut untuk menggunakan WebView dalam pengujian aplikasi Anda.

Paket

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

  1. Buka file build.gradle aplikasi Anda. Ini biasanya bukan file build.gradle tingkat atas tetapi app/build.gradle.
  2. Tambahkan baris berikut di dalam dependensi:

    Groovy

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

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  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 mengupdate juga garis:

    Groovy

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

Penggunaan API umum

onWebView() adalah titik entri utama saat bekerja dengan WebView di Android menggunakan Espresso. Anda akan menggunakan 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" dan mengkliknya. Alat ini kemudian memverifikasi bahwa WebView mengirim permintaan GET yang berisi string "navigation_2.html".

Dukungan JavaScript

Saat menjalankan pengujian, sistem melakukan semua interaksi WebView menggunakan pada 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 di uji, 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 mencakup hal berikut :

  • withElement() merujuk ke elemen DOM dalam WebView.

    Contoh:

    Kotlin

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

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • withContextualElement() mereferensikan elemen DOM terbatas di 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 kondisi, memastikan bahwa kondisi tersebut teratasi 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 mengeklik pada elemen.

    Contoh:

    Kotlin

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

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset() mengembalikan WebView ke keadaan awal. Hal ini diperlukan ketika tindakan, seperti klik, memperkenalkan perubahan navigasi yang membuat Objek ElementReference dan WindowReference tidak dapat diakses.

    Catatan: Meskipun menggunakan reset() berguna saat membuat pernyataan 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 Submit, teks yang sama akan muncul dalam elemen yang berbeda di 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 penggunaan Espresso-Web dalam pengujian Android, lihat referensi berikut.

Contoh

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