UI Automator adalah framework dari Google untuk pengujian UI otomatis aplikasi Android, yang bekerja di tingkat sistem dan dapat berinteraksi dengan elemen antarmuka di luar satu aplikasi. Tidak seperti Espresso, UI Automator tidak terikat pada proses aplikasi tertentu: ia dapat membuka dialog sistem, panel notifikasi, dan beralih antar aplikasi. Menurut Google Android Developers, UI Automator menggunakan Accessibility Service standar untuk mengakses pohon UI perangkat.
Poin Penting
UI Automator adalah framework untuk pengujian UI fungsional Android yang bekerja di tingkat sistem operasi. Framework ini menyediakan API untuk mengakses elemen apa pun di layar perangkat, terlepas dari aplikasi mana elemen tersebut berada — termasuk bilah status sistem, dialog izin, layar beranda, dan aplikasi pihak ketiga. Hal ini membuatnya sangat diperlukan untuk menguji skenario yang melampaui satu aplikasi.
Secara arsitektur, UI Automator menggunakan Accessibility Service — layanan yang sama yang digunakan oleh TalkBack, Switch Access, dan alat aksesibilitas lainnya. Melalui layanan ini, framework mendapatkan pohon lengkap komponen UI dari layar saat ini dan memungkinkan eksekusi tindakan pada mereka: klik, geser, input teks, tekan lama.
UI Automator pertama kali muncul di Android 4.3 (API 18) dan sejak saat itu menjadi bagian dari Android Testing Support Library sebagai alat resmi Google untuk pengujian lintas-aplikasi. Di AndroidX Test, tersedia sebagai artefak terpisah androidx.test.uiautomator:uiautomator versi 2.3.0 (2024), yang mendukung semua versi Android dari API 18.
Prinsip kerja UI Automator didasarkan pada pemindaian pohon Accessibility dari layar saat ini. Ketika metode findObject(selector) dipanggil, framework menelusuri hierarki View, menemukan elemen pertama yang memenuhi kondisi UiSelector, dan mengembalikan objek UiObject — sebuah proxy untuk berinteraksi dengan View yang sebenarnya.
Pengujian UI Automator yang tipikal dimulai dengan mendapatkan instance UiDevice, yang mewakili perangkat fisik. UiDevice menyediakan metode untuk mencari elemen, mengelola penekanan tombol (Home, Back, Recent), memutar layar, dan mengambil tangkapan layar. Setelah elemen ditemukan melalui UiSelector, tindakan dilakukan pada UiObject.
Pada contoh di bawah, pengujian membuka aplikasi Settings, menemukan item “Baterai” melalui teks, dan menekannya. UI Automator tidak memerlukan Activity untuk dimulai — ia bekerja dengan layar perangkat apa pun, termasuk aplikasi pihak ketiga.
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// Buka layar pengaturan
device.pressHome()
device.wait(Until.hasObject(UiSelector().text("Pengaturan")), 2000)
// Temukan item “Baterai” dan tekan
val batteryItem = device.findObject(
UiSelector().text("Baterai")
)
batteryItem.clickAndWait(Until.newWindow(), 3000)
UiDevice — kelas utama untuk berinteraksi dengan perangkat. Ini menyediakan metode untuk mencari elemen, mensimulasikan penekanan tombol hardware (Home, Back, Menu, Volume), mengelola daya, mengambil tangkapan layar, dan menunggu status layar tertentu. UiDevice dibuat sekali per pengujian dan digunakan kembali untuk semua operasi.
UiSelector — adalah fluent API untuk mencari elemen UI. Tidak seperti ViewMatchers di Espresso, UiSelector tidak memerlukan kompilasi — kondisi pencarian dibentuk melalui rantai metode: text(), className(), description(), resourceId(), index(). Beberapa kondisi digabungkan secara otomatis melalui AND logis.
| Metode UiSelector | Tujuan |
|---|---|
| text(String) | Pencarian berdasarkan teks tepat elemen |
| textContains(String) | Pencarian berdasarkan sebagian teks |
| resourceId(String) | Pencarian berdasarkan ID sumber daya (mis. com.example:id/button) |
| className(String) | Pencarian berdasarkan nama kelas View |
| description(String) | Pencarian berdasarkan content-description |
| childSelector(selector) | Pencarian elemen anak di dalam wadah |
Ketika ada beberapa elemen dengan teks yang sama di layar, UiSelector memungkinkan penggabungan kriteria: menemukan wadah berdasarkan ID, kemudian di dalamnya — elemen berdasarkan teks dan kelas. Ini menjamin identifikasi unik dari komponen yang diperlukan. Metode childSelector mempersempit area pencarian ke wadah yang ditentukan, yang mempercepat navigasi melalui pohon UI.
val scrollView = device.findObject(
UiSelector().resourceId("android:id/list")
)
// Di dalam daftar, temukan elemen dengan teks “Wi-Fi”
val wifiItem = scrollView.findObject(
UiSelector().text("Wi-Fi")
wifiItem.click()
Cross-application (pengujian antar-aplikasi) — fungsi utama mengapa UI Automator dipilih. Framework dapat beralih antar aplikasi, menguji login OAuth melalui browser, memeriksa dialog sistem (izin, pemilihan aplikasi), dan berinteraksi dengan bilah status sistem, panel notifikasi, dan layar kunci.
Skenario khas pengujian cross-app: aplikasi membuka browser untuk otorisasi OAuth, pengguna memasukkan nama pengguna dan kata sandi, browser mengarahkan kembali ke aplikasi. UI Automator beralih antar proses, menemukan bidang input di browser, mengisinya, dan menekan “Masuk”.
// Menunggu browser muncul
device.wait(Until.hasObject(
UiSelector().packageName("com.android.chrome")
), 5000)
// Cari bidang input email di browser
val emailField = device.findObject(
UiSelector().className("android.widget.EditText").instance(0)
)
emailField.text = "user@example.com"
UI Automator dapat memeriksa dan menutup dialog sistem — izin geolokasi, notifikasi, akses ke file. Ini sangat penting untuk menguji peluncuran pertama aplikasi, ketika sistem secara berurutan meminta beberapa izin. Tanpa UI Automator, skenario seperti itu tidak dapat diotomatisasi karena dialog sistem bukan milik proses aplikasi.
Pilihan antara UI Automator dan Espresso tergantung pada skenario pengujian. Espresso dioptimalkan untuk menguji satu aplikasi dengan sinkronisasi otomatis dan boilerplate minimal. UI Automator cocok untuk skenario yang memerlukan interaksi dengan sistem, browser, atau beberapa aplikasi.
| Kriteria | UI Automator | Espresso |
|---|---|---|
| Cakupan | Seluruh perangkat, banyak aplikasi | Satu aplikasi |
| Sinkronisasi | Manual (wait, sleep) | Otomatis (Idling Resource) |
| Kecepatan | Lebih lambat (akses melalui layanan) | Lebih cepat (bekerja di dalam proses) |
| System UI | Mendukung (Notifications, Quick Settings) | Tidak mendukung |
| Akurasi Pencarian | UiSelector berdasarkan atribut | ViewMatchers berdasarkan tipe dan hierarki |
| Stabilitas | Lebih rendah (tergantung waktu) | Lebih tinggi (penantian otomatis) |
Dalam praktiknya, framework ini sering digunakan bersama: Espresso mencakup pengujian UI aplikasi utama dengan stabilitas tinggi, dan UI Automator digunakan untuk skenario di luar batas aplikasi — login OAuth, izin sistem, bekerja dengan Share Intent. Kombinasi ini memberikan cakupan UI maksimal dengan biaya pemeliharaan pengujian minimal.
Koneksi UI Automator dilakukan dengan menambahkan dependensi di build.gradle. Framework ini adalah bagian dari AndroidX Test dan tidak memerlukan izin tambahan di manifes — akses ke Accessibility Service dikonfigurasi secara otomatis saat pengujian instrumental dimulai.
Konfigurasi minimal mencakup artefak uiautomator dan runner pengujian standar AndroidJUnitRunner. Pengujian UI Automator ditempatkan di direktori src/androidTest dan dijalankan pada emulator atau perangkat fisik dengan Android API 18+.
dependencies {
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test:runner:1.6.1")
}
Untuk mendapatkan instance UiDevice, digunakan InstrumentationRegistry.getInstrumentation(). UiDevice harus dibuat sekali dalam metode setUp() dan digunakan kembali di semua pengujian kelas untuk menghemat sumber daya perangkat. Penting untuk diingat bahwa UiDevice tidak thread-safe — semua operasi harus dilakukan dalam satu thread dari metode pengujian. Membuat UiDevice baru di setiap pengujian menyebabkan overhead dan memperlambat eksekusi. Disarankan untuk membuat UiDevice sekali dalam metode beforeClass dan menggunakannya kembali untuk semua pengujian kelas pengujian.
Tidak seperti Espresso, UI Automator tidak memiliki sinkronisasi otomatis. Untuk menunggu kemunculan elemen, digunakan metode UiDevice.wait(condition, timeout) dengan objek Until: Until.findObject(selector), Until.hasObject(selector), Until.gone(selector). Tanpa penantian yang benar, pengujian menjadi tidak stabil karena race condition — elemen mungkin tidak muncul di layar pada saat pencarian. Disarankan untuk mengatur waktu tunggu setidaknya 3-5 detik untuk stabilitas.
Pertanyaan yang Sering Diajukan
UI Automator bekerja di tingkat Accessibility Service dan dapat berinteraksi dengan aplikasi apa pun. Espresso bekerja di dalam proses satu aplikasi dan menggunakan sinkronisasi otomatis dengan thread UI. UI Automator lebih baik untuk skenario antar-aplikasi, Espresso — untuk pengujian stabil satu aplikasi.
Ya, UI Automator bekerja di semua perangkat dengan Android API 18+. Ini tidak memerlukan akses root — Accessibility Service standar digunakan, yang diaktifkan melalui Instrumentation saat pengujian dimulai.
UI Automator menggunakan Accessibility Service untuk mendapatkan pohon lengkap komponen UI dari layar saat ini. Kemudian UiSelector menelusuri pohon ini dan menemukan elemen berdasarkan kriteria yang diberikan: teks, kelas, ID, content-description, atau kombinasinya.
Ya, metode UiDevice.takeScreenshot(storePath) memungkinkan pengambilan tangkapan layar dari layar saat ini dan menyimpannya ke file. Ini berguna untuk debugging: ketika pengujian gagal, tangkapan layar dapat disimpan dan status layar dapat dianalisis.
UI Automator tidak memiliki sinkronisasi otomatis, sehingga pengujian sensitif terhadap waktu. Jika animasi belum selesai atau View belum sempat dirender, findObject mungkin tidak menemukan elemen. Solusinya — gunakan UiDevice.wait() dengan waktu tunggu yang cukup.
Kesimpulan
Seperangkat alat UI Automator mencakup semua skenario kunci pengujian antar-aplikasi dan merupakan standar untuk otomatisasi Android di tingkat sistem.
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga