UI Automator — Google tərəfindən Android proqramlarının avtomatlaşdırılmış UI-testi üçün framework-dür, sistem səviyyəsində işləyir və bir proqramdan kənar interfeys elementləri ilə qarşılıqlı əlaqədə ola bilər. Espresso-dan fərqli olaraq, UI Automator müəyyən bir proqramın prosesinə bağlı deyil: o, sistem dialoqlarını, Bildiriş panelini aça və proqramlar arasında keçid edə bilər. Google Android Developers-a görə, UI Automator cihazın UI ağacına daxil olmaq üçün standart Accessibility Service-dən istifadə edir.
Əsas məqamlar
UI Automator — əməliyyat sistemi səviyyəsində işləyən Android-in funksional UI-testi üçün framework-dür. O, cihazın ekranındakı istənilən elementə, hansı proqrama aid olmasından asılı olmayaraq — sistem status paneli, icazə dialoqları, ana ekran və üçüncü tərəf proqramları daxil olmaqla — daxil olmaq üçün API təqdim edir. Bu onu bir proqramdan kənara çıxan ssenarilərin testi üçün əvəzolunmaz edir.
Memarlıq baxımından UI Automator Accessibility Service-dən istifadə edir — TalkBack, Switch Access və digər əlçatanlıq alətləri tərəfindən istifadə olunan eyni xidmət. Bu xidmət vasitəsilə framework cari ekranın tam UI komponentlər ağacını əldə edir və onlar üzərində hərəkətlər yerinə yetirməyə imkan verir: toxunma, sürüşdürmə, mətn daxiletmə, uzun toxunma.
UI Automator ilk dəfə Android 4.3-də (API 18) ortaya çıxdı və o vaxtdan Android Testing Support Library-nin bir hissəsi olaraq Google-ın çoxproqramlı test üçün rəsmi alətidir. AndroidX Test-də o, API 18-dən bütün Android versiyalarını dəstəkləyən ayrıca androidx.test.uiautomator:uiautomator versiya 2.3.0 (2024) artifaktı kimi mövcuddur.
İş prinsipi UI Automator cari ekranın Accessibility ağacının skan edilməsinə əsaslanır. findObject(selector) metodu çağırıldıqda, framework View iyerarxiyasını gəzir, UiSelector şərtlərinə uyğun ilk elementi tapır və real View ilə qarşılıqlı əlaqə üçün UiObject obyektini qaytarır.
Tipik UI Automator testi fiziki cihazı təmsil edən UiDevice nümunəsinin əldə edilməsi ilə başlayır. UiDevice elementləri axtarmaq, düymə basmalarını (Home, Back, Recent) idarə etmək, ekranı döndərmək və ekran görüntüləri çəkmək üçün metodlar təqdim edir. UiSelector vasitəsilə element tapıldıqdan sonra UiObject üzərində hərəkətlər yerinə yetirilir.
Aşağıdakı nümunədə test Settings proqramını açır, „Batareya“ bəndini mətnə görə tapır və üzərinə klik edir. UI Automator Activity-nin işə salınmasını tələb etmir — o, cihazın istənilən ekranı, o cümlədən üçüncü tərəf proqramları ilə işləyir.
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// Parametrlər ekranını aç
device.pressHome()
device.wait(Until.hasObject(UiSelector().text("Parametrlər")), 2000)
// „Batareya“ bəndini tap və bas
val batteryItem = device.findObject(
UiSelector().text("Batareya")
)
batteryItem.clickAndWait(Until.newWindow(), 3000)
UiDevice — cihazla qarşılıqlı əlaqə üçün əsas sinif. O, elementləri axtarmaq, aparat düymələrinin basılmasını simulyasiya etmək (Home, Back, Menu, Volume), enerjini idarə etmək, ekran görüntüləri çəkmək və müəyyən ekran vəziyyətlərini gözləmək üçün metodlar təqdim edir. UiDevice test başına bir dəfə yaradılır və bütün əməliyyatlar üçün təkrar istifadə olunur.
UiSelector — UI elementlərini axtarmaq üçün fluent API-dir. Espresso ViewMatchers-dən fərqli olaraq, UiSelector kompilasiya tələb etmir — axtarış şərtləri metodlar zənciri ilə formalaşır: text(), className(), description(), resourceId(), index(). Bir neçə şərt avtomatik olaraq məntiqi AND vasitəsilə birləşdirilir.
| UiSelector metodu | Təyinatı |
|---|---|
| text(String) | Elementin dəqiq mətninə görə axtarış |
| textContains(String) | Mətn hissəsinə görə axtarış |
| resourceId(String) | Resurs ID-sinə görə axtarış (məs. com.example:id/button) |
| className(String) | View sinifinin adına görə axtarış |
| description(String) | Content-description-a görə axtarış |
| childSelector(selector) | Konteynerdə uşaq elementin axtarışı |
Ekranda eyni mətnə malik bir neçə element olduqda, UiSelector meyarları birləşdirməyə imkan verir: konteyneri ID-ə görə tapmaq, sonra onun içərisində — mətn və sinifə görə elementi tapmaq. Bu, lazımi komponentin unikal identifikasiyasını təmin edir. childSelector metodu axtarış sahəsini göstərilən konteynerə qədər daraldır ki, bu da UI ağacında naviqasiyanı sürətləndirir.
val scrollView = device.findObject(
UiSelector().resourceId("android:id/list")
)
// Siyahının içərisində „Wi-Fi“ mətni olan elementi tap
val wifiItem = scrollView.findObject(
UiSelector().text("Wi-Fi")
wifiItem.click()
Cross-application (proqramlararası) test — UI Automator-un seçilməsinin əsas səbəbi olan əsas funksiyadır. Framework proqramlar arasında keçid edə, brauzer vasitəsilə OAuth girişini test edə, sistem dialoqlarını (icazələr, proqram seçimi) yoxlaya və sistem status paneli, bildiriş paneli və bloklama ekranı ilə qarşılıqlı əlaqədə ola bilər.
Cross-app testinin tipik ssenarisi: proqram OAuth autorizasiyası üçün brauzeri açır, istifadəçi login və şifrəni daxil edir, brauzer geri proqrama yönləndirir. UI Automator proseslər arasında keçid edir, brauzerdə daxiletmə sahələrini tapır, onları doldurur və „Daxil ol“ düyməsini klik edir.
// Brauzerin görünməsini gözlə
device.wait(Until.hasObject(
UiSelector().packageName("com.android.chrome")
), 5000)
// Brauzerdə e-poçt daxiletmə sahəsini axtar
val emailField = device.findObject(
UiSelector().className("android.widget.EditText").instance(0)
)
emailField.text = "user@example.com"
UI Automator sistem dialoqlarını yoxlaya və bağlaya bilər — geolokasiya icazələri, bildirişlər, fayllara giriş. Bu, proqramın ilk işə salınmasının testi üçün kritik əhəmiyyət daşıyır, çünki sistem ardıcıl olaraq bir neçə icazə tələb edir. UI Automator olmadan belə ssenariləri avtomatlaşdırmaq mümkün deyil, çünki sistem dialoqları proqramın prosesinə aid deyil.
Seçim UI Automator və Espresso arasında test ssenarisindən asılıdır. Espresso avtomatik sinxronizasiya və minimal boilerplate ilə bir proqramın testi üçün optimallaşdırılmışdır. UI Automator sistem, brauzer və ya bir neçə proqramla qarşılıqlı əlaqə tələb edən ssenarilər üçün uyğundur.
| Meyar | UI Automator | Espresso |
|---|---|---|
| Əhatə | Bütün cihaz, bir neçə proqram | Bir proqram |
| Sinxronizasiya | Əl ilə (wait, sleep) | Avtomatik (Idling Resource) |
| Sürət | Daha yavaş (xidmət vasitəsilə giriş) | Daha sürətli (proses daxilində işləyir) |
| System UI | Dəstəkləyir (Notifications, Quick Settings) | Dəstəkləmir |
| Axtarış dəqiqliyi | Atributlara görə UiSelector | Növ və iyerarxiyaya görə ViewMatchers |
| Sabitlik | Aşağı (vaxtlamadan asılıdır) | Yüksək (avtomatik gözləmə) |
Praktikada bu framework-lər tez-tez birlikdə istifadə olunur: Espresso yüksək sabitliklə əsas proqramın UI testlərini əhatə edir, UI Automator isə proqram hüdudlarından kənar ssenarilər — OAuth girişi, sistem icazələri, Share Intent ilə iş üçün qoşulur. Belə kombinasiya testlərin saxlanması üçün minimal xərclə maksimum UI əhatəsi verir.
Qoşulma UI Automator build.gradle-ə asılılıq əlavə etməklə həyata keçirilir. Framework AndroidX Test-ə daxildir və manifestdə əlavə icazələr tələb etmir — Accessibility Service-ə giriş instrumental test işə salındıqda avtomatik konfiqurasiya olunur.
Minimal konfiqurasiya uiautomator artifaktını və standart AndroidJUnitRunner test runner-nı əhatə edir. UI Automator testləri src/androidTest kataloqunda yerləşdirilir və Android API 18+ olan emulator və ya fiziki cihazda işə salınır.
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 nümunəsini əldə etmək üçün InstrumentationRegistry.getInstrumentation() istifadə olunur. UiDevice cihaz resurslarına qənaət etmək üçün setUp() metodunda bir dəfə yaradılmalı və sinfin bütün testlərində təkrar istifadə olunmalıdır. Nəzərə almaq lazımdır ki, UiDevice thread-safe deyil — bütün əməliyyatlar test metodunun bir axınında yerinə yetirilməlidir. Hər testdə yeni UiDevice yaratmaq əlavə yükə və icranın yavaşlamasına gətirib çıxarır. UiDevice-i beforeClass metodunda bir dəfə yaratmaq və test sinfinin bütün testləri üçün təkrar istifadə etmək tövsiyə olunur.
Espresso-dan fərqli olaraq, UI Automator-da avtomatik sinxronizasiya yoxdur. Elementlərin görünməsini gözləmək üçün UiDevice.wait(condition, timeout) metodu Until obyekti ilə istifadə olunur: Until.findObject(selector), Until.hasObject(selector), Until.gone(selector). Düzgün gözləmələr olmadan testlər race condition səbəbindən etibarsız olur — element axtarış anına qədər ekranda görünməyə bilər. Sabitlik üçün ən azı 3-5 saniyə vaxt limiti təyin etmək tövsiyə olunur.
Tez-tez verilən suallar
UI Automator Accessibility Service səviyyəsində işləyir və istənilən proqramlarla qarşılıqlı əlaqədə ola bilər. Espresso bir proqramın prosesi daxilində işləyir və UI axını ilə avtomatik sinxronizasiyadan istifadə edir. UI Automator proqramlararası ssenarilər üçün daha yaxşıdır, Espresso — bir proqramın sabit testləri üçün.
Bəli, UI Automator Android API 18+ olan bütün cihazlarda işləyir. O, root girişi tələb etmir — testlər işə salındıqda Instrumentation vasitəsilə aktivləşdirilən standart Accessibility Service istifadə olunur.
UI Automator cari ekranın tam UI komponentlər ağacını əldə etmək üçün Accessibility Service-dən istifadə edir. Sonra UiSelector bu ağacı gəzir və verilmiş meyarlara görə elementləri tapır: mətn, sinif, ID, content-description və ya onların kombinasiyası.
Bəli, UiDevice.takeScreenshot(storePath) metodu cari ekranın görüntüsünü çəkməyə və fayla saxlamağa imkan verir. Bu, debug üçün faydalıdır: test uğursuz olduqda ekran görüntüsü saxlanıla və ekranın vəziyyəti təhlil edilə bilər.
UI Automator-da avtomatik sinxronizasiya yoxdur, buna görə testlər vaxtlamaya həssasdır. Animasiya bitməyibsə və ya View render olunmayıbsa, findObject elementi tapa bilməz. Həll yolu — kifayət qədər timeout ilə UiDevice.wait() istifadə etməkdir.
Nəticə
UI Automator alətlər dəsti proqramlararası testin bütün əsas ssenarilərini əhatə edir və sistem səviyyəsində Android avtomatlaşdırması üçün standartdır.
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun