UI Automator adalah framework pengujian UI yang cocok untuk UI fungsional lintas aplikasi
pengujian di seluruh sistem dan aplikasi yang terinstal. UI Automator API memungkinkan Anda berinteraksi
dengan elemen yang terlihat di perangkat, terlepas dari Activity
yang berada
sehingga Anda dapat melakukan operasi seperti membuka menu Setelan
atau peluncur aplikasi di perangkat pengujian. Pengujian Anda dapat mencari
komponen UI dengan
menggunakan deskriptor yang mudah seperti teks yang ditampilkan dalam komponen itu atau
deskripsi konten.
Framework pengujian UI Automator adalah API berbasis instrumentasi dan berfungsi
dengan runner pengujian AndroidJUnitRunner
. Ini sangat cocok
untuk menulis
pengujian otomatis bergaya kotak buram, yang kode pengujiannya tidak bergantung pada
detail implementasi aplikasi target.
Fitur utama framework pengujian UI Automator meliputi:
- API untuk mengambil informasi status dan melakukan operasi pada target perangkat seluler. Untuk informasi selengkapnya, lihat Mengakses status perangkat.
- API yang mendukung pengujian UI lintas-aplikasi. Untuk informasi selengkapnya, lihat UI Automator API.
Mengakses status perangkat
Framework pengujian UI Automator menyediakan class UiDevice
untuk diakses
dan melakukan operasi pada perangkat tempat aplikasi target berjalan. Anda dapat
memanggil metodenya untuk mengakses properti
perangkat seperti orientasi saat ini atau
ukuran tampilan. Class UiDevice
juga memungkinkan Anda melakukan hal berikut
tindakan:
- Mengubah rotasi perangkat.
- Tekan tombol hardware, seperti "naikkan volume".
- Menekan tombol Kembali, Layar Utama, atau Menu
- Membuka menu notifikasi
- Mengambil screenshot dari jendela saat ini.
Misalnya, untuk menyimulasikan penekanan tombol Layar utama, panggil UiDevice.pressHome()
.
UI Automator API
UI Automator API memungkinkan Anda untuk membuat pengujian yang tangguh tanpa perlu mengetahui detail penerapan aplikasi yang Anda targetkan. Anda dapat menggunakan API ini untuk menangkap dan memanipulasi komponen UI di beberapa aplikasi:
UiObject2
: Mewakili elemen UI yang terlihat di perangkat.BySelector
: Menentukan kriteria untuk elemen UI yang cocok.By
: MenyusunBySelector
secara ringkas.Configurator
: Memungkinkan Anda menetapkan parameter utama untuk menjalankan pengujian UI Automator.
Misalnya, kode berikut menunjukkan cara menulis skrip pengujian yang membuka aplikasi Gmail di perangkat:
Kotlin
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.pressHome() val gmail: UiObject2 = device.findObject(By.text("Gmail")) // Perform a click and wait until the app is opened. val opened: Boolean = gmail.clickAndWait(Until.newWindow(), 3000) assertThat(opened).isTrue()
Java
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.pressHome(); UiObject2 gmail = device.findObject(By.text("Gmail")); // Perform a click and wait until the app is opened. Boolean opened = gmail.clickAndWait(Until.newWindow(), 3000); assertTrue(opened);
Menyiapkan UI Automator
Sebelum membangun pengujian UI dengan UI Automator, pastikan untuk mengonfigurasi pengujian Anda lokasi kode sumber dan dependensi project, seperti yang dijelaskan dalam Menyiapkan project untuk AndroidX Test.
Dalam file build.gradle
modul aplikasi Android, Anda harus menetapkan dependensi
referensi ke library UI Automator:
Kotlin
dependencies {
...
androidTestImplementation('androidx.test.uiautomator:uiautomator:2.3.0-alpha03')
}
Groovy
dependencies {
...
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0-alpha03'
}
Untuk mengoptimalkan pengujian UI Automator, Anda harus terlebih dahulu memeriksa komponen UI dan memastikannya dapat diakses. Kiat pengoptimalan tersebut adalah yang akan dijelaskan dalam dua bagian berikutnya.
Memeriksa UI pada perangkat
Sebelum mendesain pengujian, periksa komponen UI yang terlihat pada
perangkat seluler. Untuk memastikan bahwa pengujian UI Automator Anda bisa mengakses komponen ini,
memeriksa apakah komponen-komponen ini
memiliki label teks yang terlihat,
Nilai android:contentDescription
, atau keduanya.
Alat uiautomatorviewer
menyediakan antarmuka visual yang mudah untuk diperiksa
hierarki tata letak dan menampilkan properti komponen UI yang terlihat
di latar depan perangkat. Informasi ini memungkinkan Anda membuat
pengujian terperinci menggunakan UI Automator. Misalnya, Anda dapat membuat pemilih UI
yang cocok dengan
properti tertentu yang dapat dilihat.
Untuk meluncurkan fitur uiautomatorviewer
:
- Luncurkan aplikasi target di perangkat fisik.
- Hubungkan perangkat ke mesin pengembangan Anda.
- Buka jendela terminal dan buka direktori
<android-sdk>/tools/
. - Jalankan fitur tersebut dengan perintah ini:
$ uiautomatorviewer
Untuk melihat properti UI untuk aplikasi Anda:
- Di antarmuka
uiautomatorviewer
, klik tombol Screenshot Perangkat. - Arahkan kursor ke snapshot di panel sebelah kiri untuk melihat komponen UI
yang diidentifikasi oleh alat
uiautomatorviewer
. Properti tercantum dalam lebih rendah panel sebelah kanan dan hierarki tata letak di panel kanan atas. - Anda juga dapat mengklik tombol Beralih NAF Nodes untuk melihat komponen UI yang tidak bisa diakses oleh UI Automator. Hanya informasi terbatas yang yang tersedia untuk komponen-komponen ini.
Untuk mempelajari jenis umum komponen UI yang disediakan oleh Android, lihat Pengguna Antarmuka.
Memastikan aktivitas Anda dapat diakses
Framework pengujian UI Automator berperforma lebih baik pada aplikasi yang telah diimplementasikan
Fitur aksesibilitas Android. Saat Anda menggunakan elemen UI jenis View
, atau
subclass View
dari SDK, Anda tidak perlu menerapkan aksesibilitas
IT {i>support<i}, karena kelas-kelas ini telah melakukannya untuk Anda.
Namun, beberapa aplikasi menggunakan elemen UI kustom untuk memberikan pengalaman pengguna yang lebih kaya.
Elemen tersebut tidak akan memberikan dukungan aksesibilitas secara otomatis. Jika aplikasi Anda
berisi instance subclass View
yang tidak berasal dari SDK, buat
pastikan Anda menambahkan fitur aksesibilitas ke elemen-elemen ini dengan
langkah-langkah berikut:
- Buat class konkret yang memperluas ExploreByTouchHelper.
- Mengaitkan instance class baru Anda dengan elemen UI kustom tertentu dengan memanggil setAccessibilityDelegate().
Untuk panduan tambahan tentang cara menambahkan fitur aksesibilitas ke tampilan kustom , lihat Membuat Tampilan Kustom yang Dapat Diakses. Untuk mempelajari lebih lanjut tentang praktik terbaik umum untuk aksesibilitas di Android, lihat Membuat Aplikasi Lebih Banyak Mudah diakses.
Membuat class pengujian UI Automator
Class pengujian UI Automator Anda harus ditulis dengan cara yang sama seperti pengujian JUnit 4 . Untuk mempelajari lebih lanjut cara membuat class pengujian JUnit 4 dan menggunakan JUnit 4 pernyataan dan anotasi, lihat Membuat Class Pengujian Unit Berinstrumen.
Tambahkan anotasi @RunWith(AndroidJUnit4.class) di awal pengujian Anda definisi kelas. Anda juga perlu menentukan class AndroidJUnitRunner, yang disediakan di AndroidX Test, sebagai runner pengujian default Anda. Langkah ini dijelaskan secara lebih mendetail dalam Menjalankan pengujian UI Automator pada perangkat atau emulator.
Implementasikan model pemrograman berikut ke class pengujian UI Automator Anda:
- Dapatkan objek
UiDevice
untuk mengakses perangkat yang ingin Anda uji, dengan memanggil metode getInstance() dan meneruskan objek Instrumentation ke dalamnya sebagai argumen. - Dapatkan objek
UiObject2
untuk mengakses komponen UI yang ditampilkan di perangkat (misalnya, tampilan saat ini di latar depan), dengan memanggil findObject(). - Menyimulasikan interaksi pengguna tertentu untuk dilakukan pada komponen UI tersebut, dengan
memanggil metode
UiObject2
; misalnya, panggil scrollReach() untuk men-scroll, dan setText() untuk mengedit kolom teks. Anda dapat memanggil API di langkah 2 dan 3 berulang kali jika diperlukan untuk menguji interaksi pengguna yang lebih kompleks yang melibatkan beberapa komponen UI atau urutan tindakan pengguna. - Periksa apakah UI mencerminkan status atau perilaku yang diharapkan, setelah pengguna ini interaksi dilakukan.
Langkah ini dibahas lebih detail di bagian di bawah ini.
Mengakses komponen UI
Objek UiDevice
adalah cara utama untuk mengakses dan memanipulasi
status perangkat. Dalam pengujian, Anda dapat memanggil metode UiDevice
untuk memeriksa
status berbagai properti, seperti orientasi saat ini atau ukuran tampilan.
Pengujian Anda dapat menggunakan objek UiDevice
untuk melakukan tindakan tingkat perangkat,
seperti memaksa perangkat ke rotasi tertentu, menekan perangkat keras D-pad
dan menekan tombol Beranda dan Menu.
Sebaiknya mulai pengujian Anda dari Layar utama perangkat. Dari layar Utama (atau lokasi awal lainnya yang telah Anda pilih di perangkat), Anda dapat memanggil metode yang disediakan oleh UI Automator API untuk memilih dan berinteraksi dengan elemen UI tertentu.
Cuplikan kode berikut menunjukkan cara pengujian Anda mendapatkan instance
UiDevice
dan simulasikan penekanan tombol Layar utama:
Kotlin
import org.junit.Before import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.By import androidx.test.uiautomator.Until ... private const val BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample" private const val LAUNCH_TIMEOUT = 5000L private const val STRING_TO_BE_TYPED = "UiAutomator" @RunWith(AndroidJUnit4::class) @SdkSuppress(minSdkVersion = 18) class ChangeTextBehaviorTest2 { private lateinit var device: UiDevice @Before fun startMainActivityFromHomeScreen() { // Initialize UiDevice instance device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) // Start from the home screen device.pressHome() // Wait for launcher val launcherPackage: String = device.launcherPackageName assertThat(launcherPackage, notNullValue()) device.wait( Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT ) // Launch the app val context = ApplicationProvider.getApplicationContext<Context>() val intent = context.packageManager.getLaunchIntentForPackage( BASIC_SAMPLE_PACKAGE).apply { // Clear out any previous instances addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } context.startActivity(intent) // Wait for the app to appear device.wait( Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT ) } }
Java
import org.junit.Before; import androidx.test.runner.AndroidJUnit4; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.By; import androidx.test.uiautomator.Until; ... @RunWith(AndroidJUnit4.class) @SdkSuppress(minSdkVersion = 18) public class ChangeTextBehaviorTest { private static final String BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample"; private static final int LAUNCH_TIMEOUT = 5000; private static final String STRING_TO_BE_TYPED = "UiAutomator"; private UiDevice device; @Before public void startMainActivityFromHomeScreen() { // Initialize UiDevice instance device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // Start from the home screen device.pressHome(); // Wait for launcher final String launcherPackage = device.getLauncherPackageName(); assertThat(launcherPackage, notNullValue()); device.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); // Launch the app Context context = ApplicationProvider.getApplicationContext(); final Intent intent = context.getPackageManager() .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE); // Clear out any previous instances intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent); // Wait for the app to appear device.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT); } }
Dalam contoh, pernyataan @SdkSuppress(minSdkVersion = 18) membantu memastikan pengujian hanya akan berjalan pada perangkat dengan Android 4.3 (API level 18) atau yang lebih tinggi, seperti yang diwajibkan oleh framework UI Automator.
Gunakan metode findObject()
untuk mengambil UiObject2
yang mewakili
tampilan yang cocok dengan kriteria pemilih tertentu. Anda dapat menggunakan kembali UiObject2
yang telah dibuat di bagian lain pengujian aplikasi, sesuai kebutuhan.
Perhatikan, kerangka kerja pengujian UI Automator mencari tampilan saat ini untuk
cocok setiap kali pengujian Anda menggunakan instance UiObject2
untuk mengklik UI
elemen atau melakukan kueri properti.
Cuplikan berikut menunjukkan cara pengujian Anda dapat membuat UiObject2
{i>instance<i} yang mewakili tombol {i>Cancel<i}
dan tombol OK di aplikasi.
Kotlin
val okButton: UiObject2 = device.findObject( By.text("OK").clazz("android.widget.Button") ) // Simulate a user-click on the OK button, if found. if (okButton != null) { okButton.click() }
Java
UiObject2 okButton = device.findObject( By.text("OK").clazz("android.widget.Button") ); // Simulate a user-click on the OK button, if found. if (okButton != null) { okButton.click(); }
Menentukan pemilih
Jika Anda ingin mengakses komponen UI tertentu dalam aplikasi, gunakan
Class By
untuk membuat instance BySelector
. BySelector
mewakili kueri untuk elemen tertentu dalam UI yang ditampilkan.
Jika ditemukan lebih dari satu elemen yang cocok, elemen pencocokan pertama dalam
hierarki tata letak ditampilkan sebagai UiObject2
target. Saat menyusun
BySelector
, Anda dapat menggabungkan beberapa properti untuk meningkatkan
cari. Jika tidak ditemukan elemen UI yang cocok, null
akan ditampilkan.
Anda dapat menggunakan metode hasChild()
atau hasDescendant()
untuk membuat susunan bertingkat
beberapa instance BySelector
. Misalnya, contoh kode berikut menunjukkan
cara pengujian Anda dapat menentukan penelusuran untuk menemukan ListView
pertama yang
memiliki elemen UI turunan dengan properti teks.
Kotlin
val listView: UiObject2 = device.findObject( By.clazz("android.widget.ListView") .hasChild( By.text("Apps") ) )
Java
UiObject2 listView = device.findObject( By.clazz("android.widget.ListView") .hasChild( By.text("Apps") ) );
Hal tersebut mungkin berguna untuk menentukan status objek dalam kriteria pemilih Anda. Sebagai
jika Anda ingin memilih daftar dari semua elemen
yang dicentang sehingga Anda dapat
menghapus centangnya, panggil metode checked()
dengan argumen yang ditetapkan ke true.
Melakukan tindakan
Setelah pengujian mendapatkan objek UiObject2
, Anda dapat memanggil metode di
class UiObject2
untuk menjalankan interaksi pengguna pada komponen UI
yang diwakili oleh objek tersebut. Anda dapat menentukan tindakan seperti:
click()
: Mengklik di tengah batas elemen UI yang terlihat.drag()
: Menarik objek ini ke koordinat arbitrer.setText()
: Menetapkan teks di kolom yang dapat diedit, setelah menghapus konten field tersebut. Sebaliknya, metodeclear()
menghapus teks yang ada di kolom yang dapat diedit.swipe()
: Melakukan tindakan geser ke arah yang ditentukan.scrollUntil()
: Melakukan tindakan scroll ke arah yang ditentukan hinggaCondition
atauEventCondition
terpenuhi.
Framework pengujian UI Automator memungkinkan Anda mengirim Intent atau meluncurkan
Activity tanpa menggunakan perintah shell, dengan mendapatkan Context
melalui getContext()
.
Cuplikan berikut menunjukkan cara pengujian Anda menggunakan Intent untuk meluncurkan aplikasi yang sedang diuji. Pendekatan ini berguna jika Anda hanya tertarik untuk menguji aplikasi kalkulator, dan tidak peduli dengan peluncur.
Kotlin
fun setUp() { ... // Launch a simple calculator app val context = getInstrumentation().context val intent = context.packageManager.getLaunchIntentForPackage(CALC_PACKAGE).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } // Clear out any previous instances context.startActivity(intent) device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT) }
Java
public void setUp() { ... // Launch a simple calculator app Context context = getInstrumentation().getContext(); Intent intent = context.getPackageManager() .getLaunchIntentForPackage(CALC_PACKAGE); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // Clear out any previous instances context.startActivity(intent); device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT); }
Memverifikasi hasil
InstrumentationTestCase memperluas TestCase, sehingga Anda dapat menggunakan metode Assert JUnit standar untuk menguji apakah komponen UI dalam aplikasi menampilkan hasil yang diharapkan.
Cuplikan berikut menunjukkan bagaimana pengujian Anda dapat menemukan beberapa tombol dalam kalkulator, klik secara berurutan, lalu verifikasi bahwa hasil yang benar ditampilkan.
Kotlin
private const val CALC_PACKAGE = "com.myexample.calc" fun testTwoPlusThreeEqualsFive() { // Enter an equation: 2 + 3 = ? device.findObject(By.res(CALC_PACKAGE, "two")).click() device.findObject(By.res(CALC_PACKAGE, "plus")).click() device.findObject(By.res(CALC_PACKAGE, "three")).click() device.findObject(By.res(CALC_PACKAGE, "equals")).click() // Verify the result = 5 val result: UiObject2 = device.findObject(By.res(CALC_PACKAGE, "result")) assertEquals("5", result.text) }
Java
private static final String CALC_PACKAGE = "com.myexample.calc"; public void testTwoPlusThreeEqualsFive() { // Enter an equation: 2 + 3 = ? device.findObject(By.res(CALC_PACKAGE, "two")).click(); device.findObject(By.res(CALC_PACKAGE, "plus")).click(); device.findObject(By.res(CALC_PACKAGE, "three")).click(); device.findObject(By.res(CALC_PACKAGE, "equals")).click(); // Verify the result = 5 UiObject2 result = device.findObject(By.res(CALC_PACKAGE, "result")); assertEquals("5", result.getText()); }
Menjalankan pengujian UI Automator pada perangkat atau emulator
Anda dapat menjalankan pengujian UI Automator dari Android Studio atau dari
command line. Pastikan untuk menentukan AndroidJUnitRunner
sebagai default
instrumentasi dalam project Anda.
Contoh lainnya
Berinteraksi dengan UI Sistem
UI Automator bisa berinteraksi dengan semua yang ada di layar, termasuk sistem di luar aplikasi Anda, seperti yang ditampilkan dalam cuplikan kode berikut:
Kotlin
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.executeShellCommand("am start -a android.settings.SETTINGS")
Java
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.executeShellCommand("am start -a android.settings.SETTINGS");
Kotlin
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openNotification()
Java
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openNotification();
Kotlin
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openQuickSettings()
Java
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openQuickSettings();
Kotlin
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")) print(clock.getText())
Java
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")); print(clock.getText());
Menunggu transisi
Transisi layar bisa memakan waktu dan memprediksi durasinya tidak dapat diandalkan, jadi Anda harus menunggu UI Automator setelah menjalankan operasi. UI Automator menyediakan beberapa metode untuk ini:
UiDevice.performActionAndWait(Runnable action, EventCondition<U> condition, long timeout)
: Misalnya, untuk mengklik tombol dan menunggu hingga jendela baru muncul, panggildevice.performActionAndWait(() -> button.click(), Until.newWindow(), timeout)
UiDevice.wait(Condition<Object, U> condition, long timeout)
: Misalnya, untuk menunggu hingga adaUiObject2
tertentu di perangkat, panggildevice.wait(device.hasObject(By.text("my_text")), timeout);
UiObject2.wait(@NonNull Condition<Object, U> condition, long timeout)
: Misalnya, untuk menunggu hingga kotak centang dicentang, panggilcheckbox.wait(Until.checked(true), timeout);
UiObject2.clickAndWait(@NonNull EventCondition<U> condition, long timeout)
: Misalnya untuk mengklik tombol dan menunggu hingga jendela baru muncul, panggilbutton.clickAndWait(Until.newWindow(), timeout);
UiObject2.scrollUntil(@NonNull Direction direction, @NonNull Condition<Object, U> condition)
: Misalnya untuk men-scroll ke bawah hingga objek baru muncul, panggilobject.scrollUntil(Direction.DOWN, Until.hasObject(By.text('new_obj')));
UiObject2.scrollUntil(@NonNull Direction direction, @NonNull EventCondition<U> condition)
: Misalnya untuk men-scroll ke bawah, panggilobject.scrollUntil(Direction.DOWN, Until.scrollFinished(Direction.DOWN));
Cuplikan kode berikut menunjukkan cara menggunakan UI Automator untuk menonaktifkan Do Not
Mode Ganggu di setelan Sistem menggunakan metode performActionAndWait()
yang
menunggu transisi:
Kotlin
@Test @SdkSuppress(minSdkVersion = 21) @Throws(Exception::class) fun turnOffDoNotDisturb() { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.performActionAndWait({ try { device.executeShellCommand("am start -a android.settings.SETTINGS") } catch (e: IOException) { throw RuntimeException(e) } }, Until.newWindow(), 1000) // Check system settings has been opened. Assert.assertTrue(device.hasObject(By.pkg("com.android.settings"))) // Scroll the settings to the top and find Notifications button var scrollableObj: UiObject2 = device.findObject(By.scrollable(true)) scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)) val notificationsButton = scrollableObj.findObject(By.text("Notifications")) // Click the Notifications button and wait until a new window is opened. device.performActionAndWait({ notificationsButton.click() }, Until.newWindow(), 1000) scrollableObj = device.findObject(By.scrollable(true)) // Scroll down until it finds a Do Not Disturb button. val doNotDisturb = scrollableObj.scrollUntil( Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb")) ) device.performActionAndWait({ doNotDisturb.click() }, Until.newWindow(), 1000) // Turn off the Do Not Disturb. val turnOnDoNotDisturb = device.findObject(By.text("Turn on now")) turnOnDoNotDisturb?.click() Assert.assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)) }
Java
@Test @SdkSuppress(minSdkVersion = 21) public void turnOffDoNotDisturb() throws Exception{ device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.performActionAndWait(() -> { try { device.executeShellCommand("am start -a android.settings.SETTINGS"); } catch (IOException e) { throw new RuntimeException(e); } }, Until.newWindow(), 1000); // Check system settings has been opened. assertTrue(device.hasObject(By.pkg("com.android.settings"))); // Scroll the settings to the top and find Notifications button UiObject2 scrollableObj = device.findObject(By.scrollable(true)); scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)); UiObject2 notificationsButton = scrollableObj.findObject(By.text("Notifications")); // Click the Notifications button and wait until a new window is opened. device.performActionAndWait(() -> notificationsButton.click(), Until.newWindow(), 1000); scrollableObj = device.findObject(By.scrollable(true)); // Scroll down until it finds a Do Not Disturb button. UiObject2 doNotDisturb = scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb"))); device.performActionAndWait(()-> doNotDisturb.click(), Until.newWindow(), 1000); // Turn off the Do Not Disturb. UiObject2 turnOnDoNotDisturb = device.findObject(By.text("Turn on now")); if(turnOnDoNotDisturb != null) { turnOnDoNotDisturb.click(); } assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)); }
Referensi lainnya
Untuk informasi selengkapnya tentang menggunakan UI Automator dalam pengujian Android, lihat referensi berikut.
Dokumen referensi:
Contoh
- BasicSample: Contoh dasar UI Automator.