UI Automator — bu Google tomonidan Android ilovalarining avtomatlashtirilgan UI-testi uchun framework bo'lib, tizim darajasida ishlaydi va bitta ilovadan tashqari interfeys elementlari bilan o'zaro aloqada bo'la oladi. Espresso'dan farqli o'laroq, UI Automator ma'lum bir ilova jarayoniga bog'lanmagan: u tizim dialoglarini, Bildirishnomalar panelini ochishi va ilovalar o'rtasida almashishi mumkin. Google Android Developers ma'lumotlariga ko'ra, UI Automator qurilmaning UI daraxtiga kirish uchun standart Accessibility Service-dan foydalanadi.
Asosiy fikrlar
UI Automator — operatsion tizim darajasida ishlaydigan Android-ning funksional UI-testi uchun framework. U qurilma ekranidagi istalgan elementga, qaysi ilovaga tegishli bo'lishidan qat'i nazar — tizim holat paneli, ruxsat dialoglari, bosh ekran va uchinchi tomon ilovalari bilan — kirish uchun API taqdim etadi. Bu uni bitta ilovadan tashqariga chiqadigan stsenariylarni testlash uchun ajralmas qiladi.
Arxitektura jihatidan UI Automator Accessibility Service-dan foydalanadi — TalkBack, Switch Access va boshqa qulaylik vositalari tomonidan ishlatiladigan xuddi shu xizmat. Ushbu xizmat orqali framework joriy ekranning to'liq UI komponentlar daraxtini oladi va ular ustida harakatlarni bajarishga imkon beradi: bosish, surish, matn kiritish, uzoq bosish.
UI Automator birinchi marta Android 4.3 (API 18) da paydo bo'ldi va shu vaqtdan beri Android Testing Support Library tarkibiga Google-ning ko'p ilovalik testlash uchun rasmiy vositasi sifatida kiradi. AndroidX Test-da u alohida androidx.test.uiautomator:uiautomator 2.3.0 (2024) versiyasi artefakti sifatida mavjud bo'lib, API 18 dan boshlab barcha Android versiyalarini qo'llab-quvvatlaydi.
Ish printsipi UI Automator joriy ekranning Accessibility daraxtini skanerlashga asoslangan. findObject(selector) metodi chaqirilganda, framework View iyerarxiyasini aylanadi, UiSelector shartlariga mos keladigan birinchi elementni topadi va real View bilan o'zaro aloqa uchun UiObject obyektini qaytaradi.
Oddiy UI Automator testi jismoniy qurilmani ifodalovchi UiDevice nusxasini olish bilan boshlanadi. UiDevice elementlarni qidirish, tugmalarni bosishni (Home, Back, Recent) boshqarish, ekranni aylantirish va skrinshot olish uchun metodlarni taqdim etadi. UiSelector orqali element topilgandan so'ng, UiObject ustida harakatlar bajariladi.
Quyidagi misolda test Settings ilovasini ochadi, “Batareya” bandini matn bo'yicha topadi va ustiga bosadi. UI Automator Activity-ni ishga tushirishni talab qilmaydi — u qurilmaning istalgan ekrani, jumladan uchinchi tomon ilovalari bilan ishlaydi.
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// Sozlamalar ekranini och
device.pressHome()
device.wait(Until.hasObject(UiSelector().text("Sozlamalar")), 2000)
// “Batareya” bandini top va bos
val batteryItem = device.findObject(
UiSelector().text("Batareya")
)
batteryItem.clickAndWait(Until.newWindow(), 3000)
UiDevice — qurilma bilan o'zaro aloqa uchun asosiy sinf. U elementlarni qidirish, apparat tugmalarini bosishni simulyatsiya qilish (Home, Back, Menu, Volume), quvvatni boshqarish, skrinshot olish va ma'lum ekran holatlarini kutish uchun metodlarni taqdim etadi. UiDevice test uchun bir marta yaratiladi va barcha operatsiyalar uchun qayta ishlatiladi.
UiSelector — UI elementlarini qidirish uchun fluent API. Espresso ViewMatchers-dan farqli o'laroq, UiSelector kompilyatsiyani talab qilmaydi — qidirish shartlari metodlar zanjiri orqali shakllantiriladi: text(), className(), description(), resourceId(), index(). Bir nechta shartlar avtomatik ravishda mantiqiy AND orqali birlashtiriladi.
| UiSelector metodi | Vazifasi |
|---|---|
| text(String) | Elementning aniq matni bo'yicha qidirish |
| textContains(String) | Matn qismi bo'yicha qidirish |
| resourceId(String) | Resurs ID si bo'yicha qidirish (mas. com.example:id/button) |
| className(String) | View sinfi nomi bo'yicha qidirish |
| description(String) | Content-description bo'yicha qidirish |
| childSelector(selector) | Konternerda bola elementni qidirish |
Ekranda bir xil matnli bir nechta elementlar mavjud bo'lganda, UiSelector mezonlarni birlashtirishga imkon beradi: konternerni ID bo'yicha topish, keyin uning ichida — matn va sinf bo'yicha elementni topish. Bu kerakli komponentning noyob identifikatsiyasini ta'minlaydi. childSelector metodi qidirish maydonini belgilangan konternergacha toraytiradi, bu UI daraxti bo'ylab navigatsiyani tezlashtiradi.
val scrollView = device.findObject(
UiSelector().resourceId("android:id/list")
)
// Ro'yxat ichida “Wi-Fi” matnli elementni top
val wifiItem = scrollView.findObject(
UiSelector().text("Wi-Fi")
wifiItem.click()
Cross-application (ilovalararo) test — UI Automator tanlanishining asosiy sababi bo'lgan asosiy funksiya. Framework ilovalar o'rtasida almashishi, brauzer orqali OAuth kirishini testlashi, tizim dialoglarini (ruxsatlar, ilova tanlash) tekshirishi va tizim holat paneli, bildirishnomalar paneli va qulflangan ekran bilan o'zaro aloqada bo'lishi mumkin.
Cross-app testining odatiy stsenariysi: ilova OAuth avtorizatsiyasi uchun brauzerni ochadi, foydalanuvchi login va parolni kiritadi, brauzer ilovaga qayta yo'naltiradi. UI Automator jarayonlar o'rtasida almashadi, brauzerda kiritish maydonlarini topadi, ularni to'ldiradi va “Kirish” tugmasini bosadi.
// Brauzerning paydo bo'lishini kut
device.wait(Until.hasObject(
UiSelector().packageName("com.android.chrome")
), 5000)
// Brauzerda email kiritish maydonini qidir
val emailField = device.findObject(
UiSelector().className("android.widget.EditText").instance(0)
)
emailField.text = "user@example.com"
UI Automator tizim dialoglarini tekshirishi va yopishi mumkin — geolokatsiya ruxsatlari, bildirishnomalar, fayllarga kirish. Bu ilovaning birinchi ishga tushirilishini testlash uchun juda muhim, chunki tizim ketma-ket bir nechta ruxsatlarni so'raydi. UI Automatorsiz bunday stsenariylarni avtomatlashtirish mumkin emas, chunki tizim dialoglari ilova jarayoniga tegishli emas.
Tanlov UI Automator va Espresso o'rtasida test stsenariysiga bog'liq. Espresso avtomatik sinxronizatsiya va minimal boilerplate bilan bitta ilovani testlash uchun optimallashtirilgan. UI Automator tizim, brauzer yoki bir nechta ilovalar bilan o'zaro aloqa talab qiladigan stsenariylar uchun mos keladi.
| Mezon | UI Automator | Espresso |
|---|---|---|
| Qamrov | Butun qurilma, bir nechta ilovalar | Bitta ilova |
| Sinxronizatsiya | Qo'lda (wait, sleep) | Avtomatik (Idling Resource) |
| Tezlik | Sekinroq (xizmat orqali kirish) | Tezroq (jarayon ichida ishlaydi) |
| System UI | Qo'llab-quvvatlaydi (Notifications, Quick Settings) | Qo'llab-quvvatlamaydi |
| Qidirish aniqligi | Atributlar bo'yicha UiSelector | Tur va iyerarxiya bo'yicha ViewMatchers |
| Barqarorlik | Past (vaqtga bog'liq) | Yuqori (avtomatik kutish) |
Amalda, bu frameworklar ko'pincha birgalikda ishlatiladi: Espresso yuqori barqarorlik bilan asosiy ilovaning UI testlarini qamrab oladi, UI Automator esa ilova chegaralaridan tashqari stsenariylar — OAuth kirishi, tizim ruxsatlari, Share Intent bilan ishlash uchun ulanadi. Bunday kombinatsiya testlarni saqlash uchun minimal xarajat bilan maksimal UI qamrovini beradi.
Ulanish UI Automator build.gradle ga bog'liqlik qo'shish orqali amalga oshiriladi. Framework AndroidX Test tarkibiga kiradi va manifestda qo'shimcha ruxsatlarni talab qilmaydi — Accessibility Service ga kirish instrumental test ishga tushganda avtomatik sozlanadi.
Minimal konfiguratsiya uiautomator artefakti va standart AndroidJUnitRunner test runnerini o'z ichiga oladi. UI Automator testlari src/androidTest katalogiga joylashtiriladi va Android API 18+ bo'lgan emulator yoki jismoniy qurilmada ishga tushiriladi.
dependencies {
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test:runner:1.6.1")
}
UiDevice nusxasini olish uchun InstrumentationRegistry.getInstrumentation() ishlatiladi. UiDevice qurilma resurslarini tejash uchun setUp() metodida bir marta yaratilishi va sinfning barcha testlarida qayta ishlatilishi kerak. Shuni hisobga olish kerakki, UiDevice thread-safe emas — barcha operatsiyalar test metodining bir oqimida bajarilishi kerak. Har bir testda yangi UiDevice yaratish qo'shimcha yuk va ijroning sekinlashishiga olib keladi. UiDevice ni beforeClass metodida bir marta yaratish va test sinfining barcha testlari uchun qayta ishlatish tavsiya etiladi.
Espressodan farqli o'laroq, UI Automatorda avtomatik sinxronizatsiya mavjud emas. Elementlarning paydo bo'lishini kutish uchun UiDevice.wait(condition, timeout) metodi Until obyekti bilan ishlatiladi: Until.findObject(selector), Until.hasObject(selector), Until.gone(selector). To'g'ri kutishlarsiz testlar race condition sababli ishonchsiz bo'ladi — element qidirish vaqtigacha ekranda paydo bo'lmasligi mumkin. Barqarorlik uchun kamida 3-5 soniya kutish vaqtini belgilash tavsiya etiladi.
Tez-tez so'raladigan savollar
UI Automator Accessibility Service darajasida ishlaydi va istalgan ilovalar bilan o'zaro aloqada bo'lishi mumkin. Espresso bitta ilova jarayoni ichida ishlaydi va UI oqimi bilan avtomatik sinxronizatsiyadan foydalanadi. UI Automator ilovalararo stsenariylar uchun yaxshiroq, Espresso — bitta ilovaning barqaror testlari uchun.
Ha, UI Automator Android API 18+ bo'lgan barcha qurilmalarda ishlaydi. U root kirishni talab qilmaydi — testlar ishga tushirilganda Instrumentation orqali faollashtiriladigan standart Accessibility Service ishlatiladi.
UI Automator joriy ekranning to'liq UI komponentlar daraxtini olish uchun Accessibility Service-dan foydalanadi. Keyin UiSelector bu daraxtni aylanadi va berilgan mezonlarga ko'ra elementlarni topadi: matn, sinf, ID, content-description yoki ularning kombinatsiyasi.
Ha, UiDevice.takeScreenshot(storePath) metodi joriy ekranning skrinshotini olish va faylga saqlash imkonini beradi. Bu disk raskadrovka uchun foydali: test muvaffaqiyatsiz bo'lganda skrinshot saqlanishi va ekran holati tahlil qilinishi mumkin.
UI Automatorda avtomatik sinxronizatsiya yo'q, shuning uchun testlar vaqtga sezgir. Agar animatsiya tugamagan bo'lsa yoki View render bo'lishga ulgurmagan bo'lsa, findObject elementni topa olmasligi mumkin. Yechim — yetarli timeout bilan UiDevice.wait() dan foydalanish.
Xulosa
UI Automator vositalar to'plami ilovalararo testlashning barcha asosiy stsenariylarini qamrab oladi va tizim darajasida Android avtomatlashtirish uchun standart hisoblanadi.
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.