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 native 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 Anda hanya perlu menguji WebView
, dan bukan
interaksi antara WebView
dan komponen native di aplikasi, pertimbangkan
untuk 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. Dengan demikian, Espresso-Web memungkinkan Anda menggunakan kembali atom WebDriver kustom, yang memberi Anda banyak fleksibilitas, terutama saat menulis pengujian yang ingin dijalankan pada aplikasi dan aplikasi web mandiri yang menyertakan UI Android.
Cara kerja
Demikian pula dengan metode onData()
Espresso, interaksi WebView
terdiri dari beberapa Atom.
Interaksi WebView
menggunakan kombinasi bahasa pemrograman Java dan
bridge JavaScript untuk melakukan tugasnya. Karena tidak ada peluang memperkenalkan kondisi race dengan mengekspos data dari lingkungan JavaScript—semua yang dilihat Espresso di sisi berbasis Java adalah salinan yang terisolasi—menampilkan data dari objek Web.WebInteraction
didukung sepenuhnya, sehingga memungkinkan Anda memverifikasi semua data yang ditampilkan dari sebuah 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. Secara konseptual, Atom mirip dengan ViewAction
, yakni unit mandiri yang melakukan tindakan di UI Anda. Anda mengekspos 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 diorkestrasi dengan benar, sehingga memerlukan logika yang
cukup panjang.
Dalam Espresso, class Web
dan Web.WebInteraction
menggabungkan boilerplate ini dan memberikan nuansa seperti Espresso untuk berinteraksi dengan objek
WebView. 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 ditunjukkan di bagian berikut untuk bekerja dengan
WebView
di pengujian aplikasi Anda.
Paket
Untuk menyertakan Espresso-Web dalam project Anda, lakukan langkah-langkah berikut:
- Buka file
build.gradle
aplikasi Anda. File ini biasanya bukan filebuild.gradle
level teratas, tetapiapp/build.gradle
. 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')
Espresso-Web hanya kompatibel dengan Espresso 2.2 atau yang lebih tinggi dan library pengujian versi 0.3 atau yang lebih tinggi, jadi pastikan Anda juga memperbarui baris tersebut:
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
Metode onWebView()
adalah titik entri utama saat menggunakan WebView di Android menggunakan
Espresso. Gunakan metode ini untuk melakukan pengujian Espresso-Web, seperti
berikut:
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. Alat tersebut kemudian memverifikasi bahwa WebView mengirim permintaan GET
yang berisi string "navigation_2.html"
.
Dukungan JavaScript
Saat menjalankan pengujian, sistem melakukan semua interaksi WebView menggunakan JavaScript. Oleh karena itu, untuk mendukung evaluasi JavaScript, WebView yang diuji harus mengaktifkan JavaScript.
Anda dapat memaksa JavaScript 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
mencakup hal 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 memanggilwithElement()
terlebih dahulu untuk membuat referensi objekWeb.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 ditetapkan ketrue
.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 status awal. Hal ini diperlukan saat 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 berfokus 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 penggunaan Espresso-Web dalam pengujian Android, lihat referensi berikut.
Contoh
- WebBasicSample:
Menggunakan Espresso-Web untuk berinteraksi dengan objek
WebView
.