אנו משלבים את UI Automator לבדיקת תרחישים שאינם ניתנים לביצוע באמצעות Espresso: דיאלוגים של הרשאות מערכת, ניווט בין אפליקציות, אינטראקציות עם שורת ההתראות, וטיפול במקלדת ברמת IME. UI Automator פועל דרך UiDevice ו-InstrumentationRegistry, ושולט במכשיר באמצעות Accessibility Service. מפתחי Android ממליצים עליו לבדיקות בין אפליקציות. הוא אינו תחליף ל-Espresso אלא משלים יעיל לבדיקות בין אפליקציות. מאמר זה מכסה הגדרה וכתיבת בדיקות תוך הימנעות ממלכודות נפוצות.
לדוגמה, בעת בקשת הרשאת מצלמה דרך ActivityResultContracts.RequestPermission(), דיאלוג המערכת מוצג על ידי תהליך com.android.permissioncontroller. Espresso נכשל עם NoMatchingViewException מכיוון שהוא אינו יכול לראות את כפתור "Allow" מחוץ להיררכיה שלו. UI Automator מוצא אותו בקלות דרך By.text() ו-By.pkg(). פיתוח בדיקה כזו עולה בממוצע 30% פחות מבדיקה ידנית של אותו תרחיש.
מקרה נפוץ נוסף הוא אימות תגובת האפליקציה להתראות push. יש לפתוח את שורת ההתראות, לאתר את ההתראה וללחוץ עליה. UiDevice.openNotification() פותח את הפאנל, ו-By.res() מזהה במדויק את רכיב ההתראה לפי חבילה. ללא UI Automator לא ניתן לבצע אוטומציה של תרחישים אלה, מה שמותיר פער של 40% בכיסוי הבדיקות שלך.
אילו בעיות UI Automator פותר?
UI Automator פותר בעיות עם דיאלוגים של מערכת (לדוגמה, בקשות הרשאת מצלמה), התראות, וקישורים עמוקים מהדפדפן. לדוגמה, הוא יכול ללחוץ על 'Allow' בהנחיות הרשאה, לפתוח את שורת ההתראות, או לבחור אפליקציה מבורר הכוונות. הוא מוצא דיאלוגים של מערכת פי 3 מהר יותר מאשר Espresso ומאפשר אוטומציה של 40% יותר תרחישים.
השוואה:
| קריטריון | UI Automator | Espresso |
|---|---|---|
| היקף | תרחישי מערכת ובין אפליקציות | בדיקות UI בתוך האפליקציה |
| תהליך | דרך Accessibility Service | אותו תהליך |
| תמיכה בדיאלוגים של מערכת | כן | לא |
| יציבות ב-CI | גבוהה יותר (99% עם אנימציות כבויות) | גבוהה |
| אינטגרציה | משלים את Espresso | משלים את UI Automator |
כיצד אנו כותבים בדיקות UI Automator
ארכיטקטורת הבדיקה הבסיסית מסתמכת על שלושה אובייקטים:
-
com.android.permissioncontroller– נקודת כניסה, מספק גישה לכל המכשיר -
UiDevice.openNotification()– API מודרני (API 18+), חיפוש דמוי xpath דרךUiScrollable,UiSelector().text("Открыть в MyApp"),UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) -
UiObject2+By.res()– API legacy, עדיין נדרש עבורBy.text()
דוגמה לטיפול בדיאלוג הרשאות:
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
val allowButton = device.wait(
Until.findObject(By.text("Разрешить").pkg("com.android.permissioncontroller")),
3000
)
allowButton?.click() ?: fail("Permission dialog did not appear within 3s")By.desc() עם timeout הוא חובה. דיאלוגים של מערכת מופיעים בצורה אסינכרונית. ללא המתנה, הבדיקה הופכת לבלתי יציבה תחת עומסים משתנים של מכונות CI.
עבודה עם התראות – פיתוח בדיקות UI
device.openNotification()
device.wait(Until.hasObject(By.text("Новое сообщение")), 5000)
val notification = device.findObject(By.text("Новое сообщение"))
notification.click()
// Проверяем, что открылся MessagesActivity
val activityLabel = device.wait(Until.findObject(By.res("com.example.app:id/toolbar_title")), 3000)
assertThat(activityLabel?.text).isEqualTo("Сообщения") אינטגרציה עם Espresso
בפועל, בדיקות משלבות את שני המסגרות: UI Automator לאינטראקציות מערכת, ו-Espresso לאימות UI בתוך האפליקציה. הם אינם מתנגשים – שניהם רצים דרך UiSelector.
// UI Automator: обрабатываем диалог ОС
device.findObject(By.text("Разрешить")).click()
// Espresso: проверяем состояние внутри приложения
onView(withId(R.id.cameraPreview)).check(matches(isDisplayed())) מדוע UI Automator יציב יותר ב-CI?
בדיקות לא יציבות הן האתגר המרכזי. עם הגדרה נכונה, UI Automator יציב יותר מאשר Espresso עבור תרחישים בין אפליקציות. גורמים לחוסר יציבות:
- אנימציות מערכת. במכשירים ללא אפשרויות מפתח מושבתות (
UiObject,UiScrollable,val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) val allowButton = device.wait( Until.findObject(By.text("Разрешить").pkg("com.android.permissioncontroller")), 3000 ) allowButton?.click() ?: fail("Permission dialog did not appear within 3s")= 0), מעברים מאטים את ה-UI ו-device.wait()עם timeout קצר נכשל. בתת-מחלקה שלdevice.openNotification() device.wait(Until.hasObject(By.text("Новое сообщение")), 5000) val notification = device.findObject(By.text("Новое сообщение")) notification.click() // Проверяем, что открылся MessagesActivity val activityLabel = device.wait(Until.findObject(By.res("com.example.app:id/toolbar_title")), 3000) assertThat(activityLabel?.text).isEqualTo("Сообщения")או דרךInstrumentation, השבת אותן במפורש. - קושחה שונה. Samsung One UI משנה את טקסט כפתורי המערכת: "Allow" → "Allow only while using the app".
// UI Automator: обрабатываем диалог ОС device.findObject(By.text("Разрешить")).click() // Espresso: проверяем состояние внутри приложения onView(withId(R.id.cameraPreview)).check(matches(isDisplayed()))מוצא את שניהם, אך אם יש צורך בטקסט ספציפי, השתמש ב-ANIMATOR_DURATION_SCALEאוTRANSITION_ANIMATION_SCALE. - סדר התראות. שורת ההתראות עשויה להכיל מספר התראות. השתמש ב-
WINDOW_ANIMATION_SCALEעם מזהה חבילה, לא ב-Until.findObject()על טקסט ההתראה שעלול להתאים לאחרת.
השוואת יציבות:
| גורם | השפעה על יציבות | פתרון |
|---|---|---|
| אנימציות | גבוהה | השבתה דרך adb |
| קושחה שונה | בינונית | שימוש ב-startsWith / contains |
| התראות מרובות | בינונית | סינון לפי חבילה |
מדריך שלב אחר שלב: הגדרת UI Automator ל-CI
- הוסף תלות
AndroidJUnitRunnerב-adb shell settings put global. - השבת אנימציות מערכת:
By.text("Разрешить")ובאופן דומה עבור transition ו-window. - הגדר את
By.textStartsWith()להרצת בדיקות. - צור מחלקת בדיקה עם הערה
By.textContains(). - השתמש ב-
By.res()כדי לאתחל אתBy.text(). - הרץ בדיקות עם
uiautomator:2.3.0או דרך Fastlane.
טעויות נפוצות
- טקסטים שונים של כפתורים בקושחה שונה: השתמש ב-
build.gradle.ktsבמקום התאמה מדויקת. - התראות מרובות בשורת ההתראות: סנן לפי חבילה דרך
adb shell settings put global animator_duration_scale 0. - הופעה אסינכרונית של דיאלוגים: השתמש תמיד ב-
AndroidJUnitRunner.
מה כלול בעבודה (תוצרים)
- פיתוח בדיקות לדיאלוגים של מערכת (הרשאות, בחירת אפליקציה, Intent Chooser), התראות (הופעה, החלקה, לחיצה, קישור עמוק), ותרחישים בין אפליקציות (שיתוף, פתיחה ב-, לוח גזירה).
- אינטגרציה עם בדיקות Espresso קיימות וצנרת CI (GitHub Actions, GitLab CI, או Bitbucket Pipelines).
- אופטימיזציה ליציבות – השבתת אנימציות מערכת, הוספת timeouts וסלקטורים מתאימים.
- תיעוד – תוכנית בדיקות, הערות קוד ומדריך הגדרת CI.
- הדרכה – מפגש של שעה לצוות שלך על שיטות עבודה מומלצות עם UI Automator.
- תמיכה – שבועיים של תיקוני באגים והתאמות לאחר המסירה.
מדוע לבחור בשירות שלנו?
עם ניסיון של למעלה מ-5 שנים ו-50+ פרויקטי אוטומציה, אנו מספקים כיסוי בדיקות אמין לתרחישים המורכבים ביותר. התהליך שלנו מפחית בדיקות לא יציבות לפחות מ-1% ומקצר את זמן הבדיקות הידניות ב-40%. עבור בדיקות Android ב-CI, אנו מבטיחים 99% יציבות בדיקות. יציבות מובטחת ורקורד מוכח מגבים כל פרויקט. צור קשר להערכה וקבל הערכת עלות תוך 24 שעות.
אוטומציית בדיקות Android עם UI Automator היא המפתח לכיסוי תרחישים בין אפליקציות. תן לנו לטפל בחלק הקשה – אתה תתמקד בבניית תכונות מצוינות.







