Saya mencoba menulis beberapa pengujian dengan android-test-kit (Espresso) baru . Tetapi saya tidak dapat menemukan informasi apa pun tentang cara memeriksa apakah sebuah dialog ditampilkan dan melakukan beberapa tindakan di dalamnya (seperti mengklik tombol positif dan negatif, dll). Perhatikan bahwa dialog juga dapat ditampilkan oleh a WebView
, bukan oleh aplikasi itu sendiri.
Bantuan apa pun akan dihargai. Saya hanya butuh tautan, atau beberapa kode contoh untuk dasar-dasarnya:
- Periksa apakah dialog muncul
- Lakukan klik pada tombol dialog
- Berinteraksi dengan tampilan dalam dialog (jika itu tampilan kustom)
- Preform klik di luar dialog, dan periksa apakah itu ditampilkan atau tidak (misalnya jika
setCancelable(false)
dipanggil pada pembuat dialog dan kami ingin memeriksanya)
Terima kasih atas sarannya!
android
android-espresso
Serj Lotutovici
sumber
sumber
Jawaban:
Untuk memverifikasi apakah dialog muncul, Anda cukup memeriksa apakah Tampilan dengan teks yang ada di dalam dialog ditampilkan:
onView(withText("dialogText")).check(matches(isDisplayed()));
atau, berdasarkan teks dengan id
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
Untuk mengklik tombol dialog lakukan ini (tombol1 - OK, tombol2 - Batal):
onView(withId(android.R.id.button1)).perform(click());
MEMPERBARUI
sumber
Saat ini saya menggunakan ini dan sepertinya berfungsi dengan baik.
onView(withText(R.string.my_title)) .inRoot(isDialog()) // <--- .check(matches(isDisplayed()));
sumber
Jika Anda memiliki AlertDialog seperti itu:
Anda dapat memeriksa apakah komponen ditampilkan:
int titleId = mActivityTestRule.getActivity().getResources() .getIdentifier( "alertTitle", "id", "android" ); onView(withId(titleId)) .inRoot(isDialog()) .check(matches(withText(R.string.my_title))) .check(matches(isDisplayed())); onView(withId(android.R.id.text1)) .inRoot(isDialog()) .check(matches(withText(R.string.my_message))) .check(matches(isDisplayed())); onView(withId(android.R.id.button2)) .inRoot(isDialog()) .check(matches(withText(android.R.string.no))) .check(matches(isDisplayed())); onView(withId(android.R.id.button3)) .inRoot(isDialog()) .check(matches(withText(android.R.string.yes))) .check(matches(isDisplayed()));
dan melakukan tindakan:
onView(withId(android.R.id.button3)).perform(click());
sumber
android.R.id.message
dan judul memiliki id tersembunyiandroid.R.id.alertTitle
.int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
check()
tampilan yang tidak ada dan lihat hierarki tata letak di logcat. Anda akan melihat banyak dari inidefType = name
. Misalnya,message=hello world
parameter Anda akan terlihat seperti"hello world", "message", "your package name"
Untuk menjawab pertanyaan 4, yang jawaban yang diterima tidak, saya memodifikasi kode berikut, yang saya temukan di sini di Stack Overflow ( tautan ) untuk menguji apakah Toast ditampilkan.
@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) { return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
Yang
id
diteruskan adalah id dari yangView
sedang ditampilkan dalam dialog Anda. Anda juga bisa menulis metode seperti ini:@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) { return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
Dan sekarang sedang mencari yang
View
mengandung string teks tertentu.Gunakan seperti ini:
getRootView(getActivity(), R.id.text_id).perform(click());
sumber
Tombol Id R.id.button1 dan R.id.button2 tidak akan sama di semua perangkat. Id dapat berubah dengan versi OS.
Cara yang benar untuk mencapai ini adalah dengan menggunakan UIAutomator. Sertakan dependensi UIAutomator di build.gradle Anda
// Set this dependency to build and run UI Automator tests androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
dan gunakan
// Initialize UiDevice instance UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // Search for correct button in the dialog. UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText")); if (button.exists() && button.isEnabled()) { button.click(); }
sumber
android.R.id.button1
,android.R.id.button2
danandroid.R.id.button3
untuk "positif", "netral" dan "negatif", adalah simbol global yang dapat digunakan. Jika Anda memilih untuk memilih tombol melalui teksnya - yang sama sekali tidak masalah - Anda tidak memerlukan UIAutomator, tetapi dapat melakukan hal yang sama dengan EspressoonView(withText("ButtonTest")).perform(click())
.Untuk berjaga-jaga jika ada yang tersandung pada pertanyaan ini seperti yang saya lakukan. Semua jawaban hanya akan berfungsi untuk dialog DENGAN tombol dialog. Jangan mencoba dan menggunakan ini untuk dialog kemajuan tanpa interaksi pengguna. Espresso terus menunggu aplikasi memasuki keadaan diam. Selama dialog kemajuan terlihat, aplikasi tidak menganggur.
sumber