בדיקות חוצות-אפליקציות אמינות עם Android UI Automator

כאשר כלים סטנדרטיים אינם יכולים לראות דיאלוגים והתראות מערכת, אוטומציית הבדיקות של Android נתקעת. אנו מפתחים בדיקות UI עם UI Automator החורגות מאפליקציה בודדת ומכסות תרחישים שאינם נגישים ל-Espresso. הצוות שלנו מספק פרויקטים סוהריים, מהגדרת הסביבה ועד תמיכה בבדיקות מוכנות, ומבטיח כיסוי אמין של נתיבי משתמש קריטיים.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
בדיקות חוצות-אפליקציות אמינות עם Android UI Automator
בינוני
~3-5 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

אנו משלבים את 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

  1. הוסף תלות AndroidJUnitRunner ב-adb shell settings put global.
  2. השבת אנימציות מערכת: By.text("Разрешить") ובאופן דומה עבור transition ו-window.
  3. הגדר את By.textStartsWith() להרצת בדיקות.
  4. צור מחלקת בדיקה עם הערה By.textContains().
  5. השתמש ב-By.res() כדי לאתחל את By.text().
  6. הרץ בדיקות עם 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 היא המפתח לכיסוי תרחישים בין אפליקציות. תן לנו לטפל בחלק הקשה – אתה תתמקד בבניית תכונות מצוינות.