במסמך הזה מופיע מידע על סקריפטים של Robo, כולל מבנה, יכולות, שימוש, הקלטה ופעולות. תסריטי Robo הם בדיקות שמבצעות אוטומציה של משימות ידניות של בקרת איכות (QA) באפליקציות לנייד, ומאפשרות אינטגרציה רציפה (CI) ואסטרטגיות בדיקה לפני השקה. סקריפט Robo הוא קובץ JSON שמתאר רצף של פעולות בממשק המשתמש (UI) ופעולות אחרות.
אפשר ליצור תסריט Robo בדרכים הבאות:
להשתמש בתכונה של הקלטת סקריפט של Robo. (Android בלבד)
יוצרים את סקריפט ה-Robo באופן ידני. (Android ו-iOS+)
מצלמים את סקריפט ה-Robo ואז עורכים אותו באופן ידני. (Android בלבד)
מידע נוסף על שימוש בסקריפטים של Robo זמין במאמר הרצת סקריפט של Robo.
מבוא
סקריפט Robo מסופק לבדיקת Robo לצד קלט אחר, כמו חבילת האפליקציה ל-Android (APK) שנבדקת.
הדוגמה הבאה היא של סקריפט Robo שמכניס משתמש לאפליקציה, והוא מופעל כשהאפליקציה שנבדקת מופעלת:
[
{
"crawlStage": "crawl",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "user123",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/username"
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "12345",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/password"
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/login"
}
]
}
]
}
]
אם יש קובץ עם סקריפט Robo אחד, והוא כולל את תנאי ההפעלה app_under_test_shown שמוגדר כברירת מחדל, כמו בדוגמה שלמעלה, אפשר לציין את סקריפט Robo בקובץ בפורמט פשוט יותר – פשוט כרצף של הפעולות שלו:
[
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "user123",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/username"
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "12345",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/password"
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/login"
}
]
}
]
תמיכה ב-iOS+ בסקריפטים של Robo
ל-Robo for iOS+ (בטא) יש תמיכה מוגבלת בסקריפטים של Robo. התחביר של סקריפט Robo ל-iOS+ זהה לתחביר ל-Android, והתכונות הנתמכות ב-iOS+ פועלות באופן דומה לתכונות המקבילות ב-Android.
הפעולות הבאות נתמכות ב-iOS ומעלה:
- טענת נכוֹנוּת (assertion
- קליק
- לחיצה ארוכה
- החלקה
- התעלמות מכל האלמנטים
- המתן
- צילום מסך
- סיום הסריקה
ב-iOS+ יש תמיכה במאפייני הזיהוי הבאים בתיאורי רכיבים:
- שם הכיתה
- שם מחלקת האב
- תיאור תוכן (וביטוי רגולרי)
- טקסט (וביטוי רגולרי)
המערכת תומכת בתנאי ההפעלה הבאים בתיאורי ההקשר ב-iOS ומעלה:
- האפליקציה שנבדקת מוצגת
- האלמנט קיים
- בוצעה פעולת סקריפט שלא קשורה ל-Robo
מבנה
לסקריפט Robo יש כמה מאפיינים שמתארים איך Robo מבצע אותו. רוב המאפיינים האלה הם אופציונליים, ויש להם ערכי ברירת מחדל מוגדרים מראש:
| מאפיין | תיאור |
id
|
מספר שלם שעוזר לעקוב אחרי סקריפט Robo הזה בפלט של הסריקה.
ל-Robo יש סקריפטים מובנים של Robo עם id משלהם. למרות ש-id זהה בסקריפטים שונים של Robo ולא משפיע על ההתנהגות שלהם, יכול להיות שיהיה קשה להבחין בין פעולות מהסקריפטים האלה בתוצאות הסריקה. כדי למנוע התנגשויות, מומלץ להקצות לסקריפטים של Robo ערך ייחודי של id 1000 או יותר.
|
description
|
דומה לid אבל יותר תיאורי.
|
crawlStage
|
השלב שבו סקריפט Robo מופעל על ידי Robo. כברירת מחדל, זהו שלב הסריקה הראשי. |
priority
|
העדיפות של סקריפט Robo הזה בהשוואה לסקריפטים אחרים של Robo.
כברירת מחדל, לכל תסריטי Robo יש עדיפות של 1.
|
maxNumberOfRuns
|
מציין כמה פעמים במהלך סריקה, Robo יכול להריץ את סקריפט Robo הזה. כברירת מחדל, Robo יכול להריץ סקריפט Robo פעם אחת. |
contextDescriptor
|
מתאר את ההקשר או התנאי שמפעילים את סקריפט ה-Robo הזה. אם לא מציינים תנאי, התנאי להפעלת סקריפט ה-Robo הזה נחשב כמתקיים תמיד. במילים אחרות, סקריפט ה-Robo הוא ללא תנאי. |
actions
|
כל הפעולות של סקריפט ה-Robo הזה. |
קובץ יחיד מכיל אוסף של סקריפטים של Robo.
הדוגמה הבאה היא של קובץ עם שני סקריפטים של Robo ללא תנאים, שלכל אחד מהם יש פעולה אחת שמופעלת פעם אחת בתחילת הסריקה:
[
{
"id": 1000,
"description": "My first Robo script",
"actions": [
{
"eventType": "DISABLE_KEYBOARD"
}
]
},
{
"id": 1001,
"description": "My second Robo script",
"actions": [
{
"eventType": "PRESSED_BACK"
}
]
}
]
תווית לתיאור ההקשר
מתאר הקשר מגדיר את ההקשר או התנאי שמפעילים RoboScript באמצעות מאפיין אחד או שילוב של כמה מאפיינים:
| מאפיין | תיאור |
|---|---|
"condition": "always"
|
תמיד מפעיל סקריפט של Robo. |
"condition": "element_present"
|
ההוראה בודקת אם ווידג'ט של ממשק משתמש שתואם ל-elementDescriptors או לטקסט שצוין על ידי visionText מופיע במסך.
|
"condition": "element_disabled"
|
בודק אם ווידג'ט בממשק המשתמש שתואם ל-elementDescriptors מוצג במסך ואי אפשר לבצע איתו אינטראקציה.
|
"condition": "element_checked"
|
הוראת המאקרו הזו בודקת אם ווידג'ט בממשק המשתמש שתואם ל-elementDescriptors מוצג במסך ומסומן.
|
"condition": "app_under_test_shown"
|
בודקת שהאפליקציה שנבדקת פועלת בחזית. |
"condition": "default_launcher_shown"
|
בודק אם מסך הבית של המכשיר מוצג, כלומר שאף אפליקציה לא פועלת בחזית. |
"condition": "non_roboscript_action_performed"
|
בודק שnonRoboscriptActionCount הפעולות הרצופות האחרונות שבוצעו על ידי Robo test לא היו פעולות של Robo script.
|
negateCondition
|
אם הערך הוא true, מתבצעת שלילה של condition. לדוגמה, אפשר להשתמש במאפיין הזה כדי לבדוק אם רכיב של ממשק המשתמש לא מוצג במסך, או אם האפליקציה שנבדקת לא פועלת בחזית.
|
elementDescriptors
|
תיאור אלמנט אחד או יותר שמזהה ווידג'ט בממשק המשתמש במסך.
הוא משמש בשילוב עם התנאים element_present, element_disabled ו-element_checked. לא ניתן להשתמש בו עם visionText. מידע נוסף זמין במאמר Element descriptors.
|
visionText
|
טקסט במסך מזוהה באמצעות Optical Character Recognition
(OCR) API. visionText משמש בשילוב עם התנאי element_present. בלעדיות הדדית עם
elementDescriptors.
|
nonRoboscriptActionCount
|
מספר הפעולות הרצופות בסקריפט שאינן פעולות של Robo שבוצעו לפני כן. הוא משמש בשילוב עם התנאי non_roboscript_action_performed להפעלת סקריפט Robo אחרי כל nonRoboscriptActionCount פעולות Robo. ערך ברירת המחדל הוא 1.
|
זוהי דוגמה לסקריפט Robo שמופעל על ידי ווידג'ט בממשק משתמש עם מזהה משאב "my.app.package:id/page_header" שמופיע במסך:
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/page_header"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Settings"
}
]
}
]
}
זוהי דוגמה לסקריפט Robo שמופעל על ידי "Privacy Policy" שזוהה על ידי זיהוי תווים אופטי (OCR):
{
"id": 1000,
"description": "Vision text Robo script",
"contextDescriptor": {
"condition": "element_present",
"visionText": "Privacy Policy"
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
]
}
הדוגמה הבאה היא של סקריפט Robo שממתין 5 שניות אחרי כל פעולת Robo שאינה סקריפט:
{
"contextDescriptor": {
"condition": "non_roboscript_action_performed"
},
"maxNumberOfRuns" : 1000,
"actions" : [
{
"eventType" : "WAIT",
"delayTime" : 5000
}]
}
פעולות
כל פעולה בסקריפט של Robo מיוצגת כחבילה של צמד אחד או יותר של מאפיין-ערך, שמתוארים בטבלה הבאה:
| מאפיין | תיאור |
eventType
|
מציין את סוג הפעולה, לדוגמה, קליק, עריכת טקסט וכו'. חובה לכל פעולה. |
elementDescriptors
|
תיאורים שמזהים רכיב גרפי בממשק משתמש. חובה לכל הפעולות שיש להן ווידג'ט של ממשק משתמש כיעד, כמו לחיצה על לחצן מסוים. |
optional
|
אם המדיניות מוגדרת לערך true, המערכת מדלגת על הפעולה הזו אם אי אפשר לבצע אותה. לדוגמה, הפעולה הזו תדלג אם היא לא תוכל למצוא את ווידג'ט ממשק המשתמש של היעד במסך – בלי שהסקריפט של Robo ייכשל. ערך ברירת המחדל הוא false.
|
replacementText
|
הטקסט שצריך להזין בווידג'ט של ממשק המשתמש של היעד. נדרש לפעולות של עריכת טקסט. |
swipeDirection
|
מציינת את כיוון ההחלקה. נדרש לפעולות החלקה. |
delayTime
|
מציינת את משך ההמתנה באלפיות השנייה. נדרש לפעולות המתנה. |
pointTapXCoordinate וגם pointTapYCoordinate
|
קואורדינטות X ו-Y של הפיקסל בנקודה שבה לוחצים על המסך. ההגדרות האלה לא יכולות להיות מופעלות בו-זמנית עם pointTapXPercent ועם pointTapYPercent.
חובה לציין את המאפיין הזה לפעולות הקשה על נקודה.
|
pointTapXPercent וגם pointTapYPercent
|
קואורדינטות X ו-Y באחוזים של הנקודה שבה התרחשה ההקשה. הם לא יכולים להיות מופעלים בו-זמנית עם pointTapXCoordinate ועם pointTapYCoordinate. חובה לציין את המאפיין הזה לפעולות הקשה על נקודה.
|
הדוגמה הבאה היא של סקריפט Robo עם שתי פעולות בלי ווידג'טים של ממשק משתמש יעד, כלומר הפעולות האלה לא פועלות על ווידג'ט ספציפי של ממשק משתמש:
[
{
"eventType": "WAIT",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
תיאורי רכיבים
מתאר רכיב מזהה ווידג'ט בממשק המשתמש באמצעות אחד או יותר מהמאפיינים המזהים הבאים:
| מאפיין | תיאור |
className
|
– |
ancestorClassName
|
שם המחלקה של רכיב האב בהיררכיית ממשק המשתמש של הרכיב. אלמנט אב קדמון הוא כל אחד מצומתי האב בהיררכיית ממשק המשתמש של האלמנט, כולל האלמנט עצמו. |
resourceId
|
– |
resourceIdRegex
|
ביטוי רגולרי ב-Java שמתאים ל-resourceId.
|
contentDescription
|
– |
contentDescriptionRegex
|
ביטוי רגולרי ב-Java שמתאים ל-contentDescription.
|
text (שמופיע במסך)
|
– |
textRegex
|
ביטוי רגולרי ב-Java שמתאים ל-text.
|
groupViewChildPosition,
recyclerViewChildPosition, או
adapterViewChildPosition
|
מייצג את מיקום הצאצא של רכיב גרפי בממשק המשתמש, בהתאם לסוג של רכיב האב שלו. |
לעתים קרובות, המאפיינים האלה לא מוגדרים. לדוגמה, יכול להיות שללחצן אין טקסט ותיאור תוכן. גם אם חלק מערכי המאפיינים קיימים, יכול להיות שהם לא ייחודיים במסך נתון באפליקציה (כולל resourceId).
לדוגמה, בדרך כלל אפשר להבחין בין פריטים ברשימה רק באמצעות המיקומים השונים של רכיבי הצאצא בתוך הווידג'ט של רכיב האב. כלומר, בדרך כלל לא מספיק להשתמש רק בתיאור של רכיב אחד כדי לזהות ווידג'ט בממשק המשתמש. לכן, מאפיין elementDescriptors של פעולה מכיל רצף של מתארי רכיבים שמסודרים כך שהראשון מתאים לווידג'ט של ממשק המשתמש של היעד, השני מתאים לווידג'ט האב של ממשק המשתמש של היעד וכן הלאה. התאמה של ווידג'ט ממשק משתמש של פעולה מתבצעת כשכל מתארי הרכיבים שלה תואמים להיררכיית המשנה של ווידג'ט ממשק המשתמש המתאים.
הדוגמה הבאה מציגה סקריפט Robo עם שינוי טקסט ופעולות קליק. כדי להשתמש בסקריפט הזה, צריך לזהות את הווידג'ט של ממשק המשתמש באמצעות תיאורי הרכיבים שמופיעים בו:
[
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"className": "android.support.v7.widget.AppCompatEditText",
"groupViewChildPosition": 0,
"resourceId": "com.google.samples.apps.topeka:id/first_name"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 0
},
{
"className": "android.support.design.widget.TextInputLayout",
"groupViewChildPosition": 1
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "android.support.design.widget.FloatingActionButton",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/done"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/content"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 0,
"resourceId": "com.google.samples.apps.topeka:id/sign_in_content"
}
]
}
]
אפשרויות הביצוע
אופציונלית, אפשר להוסיף לרשימת הפעולות בסקריפט Robo קידומת של אובייקט JSON שמציינת את אפשרויות ההפעלה של סקריפט Robo. כותרת ההגדרה הזו מתחילה במילת המפתח roboscript ואחריה ייצוג JSON של אפשרויות ההפעלה הרצויות.
תסריטי Robo תומכים באפשרויות ההרצה הבאות:
-
executionMode– אפשרויות הביצוע שמוחלות כשמריצים סקריפט Robo:-
strict– אם הערך הואtrue, סקריפט Robo לא משתמש בהתאמה חלקית, מדלג על הפעולה הנוכחית ומשעה את הפעולה. כלומר, סקריפט Robo מופעל כבדיקת אינסטרומנטציה רגילה ונכשל ברגע שלא ניתן לבצע אף אחת מהפעולות שלו. ערך ברירת המחדל הואfalse. -
dismiss_popups– אם הערך הואtrue, בדיקת Robo סוגרת תיבות דו-שיח לא צפויות במהלך הביצוע של סקריפט Robo, גם במצבstrict. לאפשרות הזו אין השפעה כשלא נמצאים במצבstrict. ערך ברירת המחדל הואfalse. -
notify– אם הערך מוגדר כ-false, סקריפט Robo לא מציג התראות במסך בתחילת הביצוע ובסופו. ערך ברירת המחדל הואtrue.
-
-
postscript– אפשרויות ביצוע שמוחלות אחרי שסקריפט Robo מסתיים:-
terminate– אם הערך הואtrue, בדיקת Robo מפסיקה לסרוק אחרי שסקריפט Robo מסתיים. ערך ברירת המחדל הואfalse.
-
הדוגמה הבאה היא של סקריפט Robo שמופעל במצב strict בלי התראות במסך. הסקריפט ממתין שלוש שניות, ואז הסריקה מפסיקה:
"roboscript": {
"executionMode": {
"strict": true,
"notify": false
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "WAIT",
"delayTime": 3000
}
]
פרמטרים של תבניות
פרמטר תבנית הוא placeholder בתסריט Robo שמוחלף בערך בפועל כשהבדיקה של Robo טוענת את תסריט ה-Robo הזה לביצוע. לפרמטרים של תבנית יש קידומת של שני קווים תחתונים ואז סימן אחוז, וסיומת של סימן אחוז ואז שני קווים תחתונים.
תסריטי Robo תומכים בפרמטר התבנית הבא:
-
__%APP_PACKAGE_NAME%__– שם החבילה של האפליקציה שנבדקת.
הדוגמה הבאה מציגה סקריפט Robo שמפסיק את התהליך של האפליקציה שנבדקת:
[
{
"eventType": "ADB_SHELL_COMMAND",
"command": "am force-stop __%APP_PACKAGE_NAME%__"
}
]
תגובות
סקריפט Robo יכול להכיל שורות של הערות, שהן שורות שמתחילות ב-# או ב-//.
זו דוגמה לסקריפט Robo עם כמה הערות:
# Confirm a user account.
[
{
// Click the DONE button.
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
]
יכולות
כברירת מחדל, סקריפט Robo נשאר פעיל עד שכל הפעולות שלו מסתיימות (או לפחות עד שמנסים לבצע אותן). בכל פעם ש-בדיקת Robo בוחרת פעולה לביצוע, היא מנסה להתאים אותה לפעולה בסקריפט של Robo. תסריט Robo משתמש בטכניקות הבאות כדי לשפר את החוסן:
| טכניקה | תיאור |
| התאמה חלקית | אם אי אפשר להתאים באופן מלא את הפעולה הנוכחית בסקריפט של Robo, הקריטריונים להתאמה מורחבים ומנסים להתאים שוב. ההתאמה החלקית לא מתייחסת לתיאור האלמנט החיצוני ביותר בזמן ההתאמה של ווידג'ט ממשק המשתמש של יעד הפעולה בסקריפט Robo.
אם ההתאמה החלקית מצליחה, הפעולה המתאימה בסקריפט של Robo מתבצעת כרגיל. הטכניקה הזו תומכת בתרחישים שבהם מבנה האפליקציה משתנה, למשל בין גרסאות שונות של האפליקציה, כשאלמנטים במסך מסודרים מחדש. |
| דילוג על הפעולה הנוכחית | אם אי אפשר להתאים את הפעולה הנוכחית בסקריפט של Robo באופן מלא או חלקי,
Robo מנסה להתאים את הפעולה הבאה בסקריפט של Robo. אם הפעולה הבאה תואמת באופן מלא או חלקי, Robo test מדלג על הפעולה הנוכחית בסקריפט Robo (ולא חוזר אליה לעולם) ומבצע את הפעולה הבאה.
הטכניקה הזו תומכת בתרחישים שבהם ההתנהגות של האפליקציה משתנה בין גרסאות או שהיא לא יציבה, למשל, כשדיאלוג לסירוגין עשוי להופיע במסכים שונים במהלך ההקלטה לעומת ההפעלה מחדש של סקריפט Robo. |
| השעיה | אם אף אחת מהפעולות הנוכחיות או הבאות בסקריפט Robo לא תואמת באופן מלא או חלקי, סקריפט Robo מושעה באופן זמני ובדיקת Robo בוחרת פעולה לביצוע באמצעות האסטרטגיות האחרות שלה. אחרי שהפעולה הזו מסתיימת, Robo test ממשיך להריץ את סקריפט Robo.
כל עוד לא ניתן להתאים את הפעולות הנוכחיות או הבאות של סקריפט Robo, סקריפט Robo יישאר מושהה לכל מספר של פעולות. לכן, סקריפטים של Robo לא צריכים להיות בהכרח הקדמה לבדיקת Robo, ואפשר לשלב פעולות של סקריפט Robo עם פעולות רגילות של בדיקת Robo. הטכניקה הזו תומכת בתרחישים שבהם התנהגות האפליקציה לא יציבה, או כששינויים בין גרסאות האפליקציה גדולים מספיק כדי ש-Robo test יצטרך "למלא את הפערים" באמצעות הפעולות הרגילות שלו. |
עדיפויות
אם סקריפט Robo מגיע לmaxNumberOfRuns, אי אפשר יותר להפעיל אותו בסריקה נתונה. אם יותר מסקריפט Robo יכולים להיות מופעלים על ידי ההקשר הנוכחי, תינתן עדיפות לבחירה, בסדר הבא, של סקריפט Robo ש:
- כולל מאפיין
contextDescriptor. - הסקריפט עם
priorityהכי גבוה (כברירת מחדל, לכל סקריפטי Robo יש אותוpriorityשל1). - מופיע הכי מוקדם ברשימת סקריפטים של Robo, אם העדיפויות של סקריפטים של Robo זהות.
בדוגמה הבאה מוצג קובץ עם שלושה סקריפטים של Robo שמבצעים את אותה פעולה ומופעלים על ידי אותו תנאי – האפליקציה שנבדקת נמצאת בחזית:
[
{
"id": 1000,
"description": "Robo script 1",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1001,
"description": "Robo script 2",
"priority": "2",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1002,
"description": "Robo script 3",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
}
]
כשהאפליקציה שנבדקת פתוחה בחזית המכשיר, Robo מפעיל את הפעולות הבאות, לפי הסדר:
-
"Robo script 2"כי יש לה את העדיפות הכי גבוהה. "Robo script 1"כי הוא מופיע מוקדם יותר בין סקריפטים רלוונטיים של Robo שנותרו עם אותה עדיפות.-
"Robo script 3"בתור סקריפט Robo האחרון שרלוונטי.
הרצות חוזרות
כברירת מחדל, Robo מפעיל סקריפט של Robo פעם אחת לכל היותר במהלך סריקה. אפשר לשנות את זה באמצעות מאפיין maxNumberOfRuns.
בדוגמה הבאה מוצג סקריפט Robo שמעביר את האפליקציה שנבדקת לרקע עד 10 פעמים:
{
"id": 1000,
"maxNumberOfRuns": 10,
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "GO_HOME"
}
]
}
שלב הסריקה
תסריטי Robo רלוונטיים בשלבים שונים של סריקת Robo נתונה:
| שלב הסריקה | תיאור |
pre_crawl
|
לפני ש-Robo מופעל ומתחיל לסרוק את האפליקציה שנבדקת. |
post_crawl
|
אחרי ש-Robo מסיים לסרוק את האפליקציה שנבדקת. post_crawlאורך הסרטון של סקריפט Robo לא יכול להיות יותר מ-15 שניות, אחרת יכול להיות שהסריקה תסתיים בטיימ-אאוט.
|
crawl
|
שלב הסריקה הראשי, שבו Robo סורק את האפליקציה שנבדקת. |
close_screen
|
כש-Robo מנסה לחזור (backtrack) ממסך מסוים, אחרי שהוא בודק את כל הפעולות האפשריות במסך הזה. כברירת מחדל, Robo לוחץ על 'הקודם', וזה לא רצוי בתרחישים מסוימים. |
אם לא מציינים את המאפיין crawlStage של סקריפט Robo, ברירת המחדל היא crawl.
בדוגמה הבאה מוצג סקריפט Robo שמנקה את נתוני המשתמש של האפליקציה שנבדקת לפני ש-Robo מתחיל לסרוק אותה:
{
"id": 1000,
"crawlStage": "pre_crawl",
"actions": [
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
]
}
זו דוגמה לסקריפט של Robo שמורה ל-Robo ללחוץ על "Cancel" בכל פעם שהוא מנסה לחזור (backtrack) מתיבת דו-שיח לאישור:
{
"id": 1000,
"crawlStage": "close_screen",
"maxNumberOfRuns": 999,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_dialog"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Cancel"
}
]
}
]
}
פעולות מותנות
סקריפט Robo יכול להכיל פעולות מותנות. לפעולות מותנות יש שלושה מאפיינים נוספים שמתארים איך Robo מבצע אותן:
| מאפיין | תיאור |
priority
|
העדיפות של הפעולה המותנית הזו בהשוואה לפעולות מותנות אחרות בסקריפט Robo שמכיל אותה. כברירת מחדל, לכל הפעולות המותנות יש עדיפות של 1.
|
maxNumberOfRuns
|
כמה פעמים אפשר לבצע את הפעולה המותנית הזו במהלך ביצוע אחד של סקריפט Robo שמכיל אותה. כברירת מחדל, אפשר לבצע את כל הפעולות המותנות פעם אחת לכל היותר בהרצה אחת של סקריפט Robo שמכיל אותן. |
contextDescriptor
|
ההקשר או התנאי שמפעילים את הפעולה המותנית הזו. המבנה שלו זהה לזה של ה-contextDescriptor של סקריפט Robo, והוא מציע יכולות דומות. |
כשמופעל סקריפט Robo, הוא מבצע את הפעולות הלא מותנות שלו אחת אחרי השנייה לפי הסדר שבו הן מופיעות. אם סקריפט Robo מכיל פעולות מותנות, המערכת בודקת אותן בכל פעם לפני שהיא בוחרת פעולה לא מותנית לביצוע. אם מופעלת פעולה מותנית כלשהי והיא נבחרת על סמך העדיפות שלה ומספר ההפעלות שנותר, סקריפט Robo מבצע את הפעולה המותנית הזו. אחרת, סקריפט Robo מבצע את הפעולה הלא מותנית הבאה. כדי שתסריט Robo יהיה תקין, הוא צריך להכיל לפחות פעולה אחת לא מותנית.
הדוגמה הבאה היא של תסריט Robo ללא תנאים עם פעולה מותנית שמבטלת חלונות קופצים של תיבות דו-שיח אם הם מופיעים בשלב כלשהו במהלך ההפעלה של תסריט Robo:
{
"id": 1000,
"actions": [
{
"description": "Dismiss popup",
"maxNumberOfRuns": 100,
"contextDescriptor": {
"condition": "default_launcher_shown",
"negateCondition": true
},
"eventType": "GO_HOME"
},
{
"description": "Screen off",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 26"
},
{
"description": "Wait for 10 seconds",
"eventType": "WAIT",
"delayTime": 10000
},
{
"description": "Screen on",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 82"
},
{
"description": "Wait for 10 seconds",
"eventType": "WAIT",
"delayTime": 10000
}
}
התעלמות מפעולות
תסריט Robo יכול להכיל הוראות ל-Robo להתעלם מרכיבי UI ספציפיים או מכל רכיבי ה-UI במסך מסוים. ההוראות האלה מיוצגות כהתעלמות מ'פעולות' באמצעות eventType ELEMENT_IGNORED ו-ALL_ELEMENTS_IGNORED בהתאמה.
בכל פעם שהמאפיין contextDescriptor של סקריפט Robo שמכיל פעולות התעלמות תואם למסך נתון, Robo לא מקיים אינטראקציה עם אף אחד מהווידג'טים של ממשק המשתמש שמיועדים לפעולות ההתעלמות (אלא אם פעולה אחרת של סקריפט Robo גורמת ל-Robo לבצע פעולה באחד מהווידג'טים של ממשק המשתמש שהמערכת מתעלמת מהם).
תסריט Robo יכול להכיל שילוב של פעולות התעלמות, פעולות מותנות ופעולות לא מותנות. בניגוד לפעולות אחרות בסקריפט Robo, פעולות התעלמות מוחלות כל עוד המחרוזת contextDescriptor של סקריפט Robo שמכיל אותן תואמת למסך במהלך סריקת Robo, ללא קשר לערכים של המאפיינים priority ו-maxNumberOfRuns.
זו דוגמה לקובץ עם שני סקריפטים של Robo. הסקריפט הראשון של Robo גורם ל-Robo להתעלם מכל הווידג'טים של ממשק המשתמש במסך שמכיל ווידג'ט של ממשק משתמש עם מזהה משאב "my.app.package:id/ignored_screen". הסקריפט השני של Robo גורם ל-Robo להתעלם מרכיבי UI שהמזהים שלהם תואמים לביטוי הרגולרי ".*:id/done" ב-Java במסך שמכיל רכיב UI עם מזהה "my.app.package:id/main_screen":
[
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/ignored_screen"
}
]
},
"actions": [
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
]
},
{
"id": 1001,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/main_screen"
}
]
},
"actions": [
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"resourceIdRegex": ".*:id/done"
}
]
}
]
}
]
תמיכה ב-RecyclerView וב-AdapterView
ווידג'טים מסוג RecyclerView ו-AdapterView הם צאצאים של ווידג'טים אחרים, והם נטענים באופן דינמי. יכול להיות שיהיה צורך להחליק הרבה פעמים כדי להגיע אליהם מהמסך הנוכחי. גודל המסך ומספר ההחלקות שנדרשות כדי להגיע לצאצא שונים בהתאם לסוג המכשיר, ולכן עדיף להסתמך על מיקום הנתונים של הצאצא, שהוא מוחלט. הסתמכות על מספר ההחלקות שנדרשות כדי להציג את הילד במסך ואז על מיקום המסך שלו היא גישה פחות אמינה.
לכן, סקריפט Robo מתעד את מיקומי הנתונים המוחלטים של רכיבי RecyclerView צאצאים שהם יעדים של פעולות סקריפט Robo בתור recyclerViewChildPosition. סקריפט Robo גם מתעד את מיקומי הנתונים המוחלטים של רכיבי צאצא של AdapterView שהם יעדים של פעולות סקריפט Robo בתור adapterViewChildPosition.
הפעולות על רכיבי צאצא של RecyclerView ו-AdapterView מתבצעות בשלבים הבאים:
בדיקת Robo מוודאת שהילד המתאים מוצג במסך באמצעות פעולת מיקום ב-RecyclerView או ב-AdapterView שמכילים אותו.
בדיקת Robo מבצעת את הפעולה המתועדת ישירות ברכיב הצאצא, כי הוא כבר מוצג במסך.
הדוגמה הבאה מציגה פעולת קליק על רכיב צאצא של AdapterView
(android.widget.GridView):
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "com.google.samples.apps.topeka.widget.AvatarView",
"adapterViewChildPosition": 5,
"resourceId": "com.google.samples.apps.topeka:id/avatar",
"contentDescription": "Avatar 6"
},
{
"className": "android.widget.GridView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/avatars"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 1
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
הדוגמה הבאה מציגה פעולת קליק ברכיב צאצא של RecyclerView (android.support.v7.widget.RecyclerView):
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "android.support.v7.widget.AppCompatTextView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_title"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": 8,
"resourceId": "com.google.samples.apps.topeka:id/category_item"
},
{
"className": "android.support.v7.widget.RecyclerView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/categories"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_container"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
איך מקליטים סקריפט של Robo ב-Android Studio ומריצים אותו ב-Test Lab
אפשר ליצור סקריפט Robo ב-Android Studio, והסקריפט יישמר כקובץ JSON. לאחר מכן אפשר להעלות את קובץ ה-JSON אל Firebase Test Lab עם האפליקציה ולהריץ את הבדיקה בהתאם.
כשמריצים בדיקת Robo עם סקריפט מצורף, בדיקת Robo קודם מבצעת את הפעולות שמוגדרות מראש בסקריפט ואז בודקת את האפליקציה כרגיל.
כדי ליצור קובץ JSON של Robo Script ב-Android Studio, פועלים לפי השלבים במאמר תיעוד של Robo Script באמצעות Test Lab ב-Android Studio.
פעולות בסקריפט של רובו
המאפיין האופציונלי הנפוץ הבא רלוונטי לכל הפעולות:
-
description– עוזר לעקוב אחרי הביצוע של פעולת הסקריפט הזו של Robo בפלט של RoboTest.
טענת נכוֹנוּת (assertion
אם התנאי שצוין הוא True, סקריפט ה-Robo ממשיך לפעולה הבאה, שיכולה להיות טענה נוספת. אחרת, ההרצה של סקריפט Robo תיפסק בגלל טענת נכוֹנוּת שנכשלה.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "ASSERTION"
|
-- |
contextDescriptor
|
מתאר את ההקשר או התנאי שצוינו. המבנה שלו זהה לזה של ה-contextDescriptor של סקריפט Robo, והוא מציע יכולות דומות. |
בדוגמה הבאה מוצגת טענת Robo Script שבודקת אם האפליקציה שנבדקת נמצאת בחזית:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
הדוגמה הבאה מציגה טענת Robo script שבודקת אם ווידג'ט של ממשק משתמש עם מזהה המשאב "com.google.samples.apps.topeka:id/done" מוצג במסך:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
הדוגמה הבאה היא של טענת Robo Script שבודקת אם "Settings" לא מזוהה במסך באמצעות OCR:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
קליק
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
eventType
|
מציין את סוג הפעולה של סקריפט Robo. |
"eventType": "VIEW_CLICKED"
|
לחיצה על אלמנט היעד של האפליקציה שנבדקת. |
"eventType": "SOFT_KEYBOARD_CLICK"
|
לחיצה על אלמנט היעד של המקלדת הווירטואלית. |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK"
|
קליקים על רכיבים אקראיים במקלדת הווירטואלית עד maxNumberOfRuns פעמים.
|
"eventType": "LIST_ITEM_CLICKED"
|
המאפיין הזה משמש את כלי ההקלטה של תסריטי Robo ב-Android Studio ללחיצה על פריטים ברשימה. |
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש שנלחץ באמצעות ההיררכיה של ממשק המשתמש של Android.
לא ניתן להשתמש בו עם visionText.
|
visionText
|
מזהה את האלמנט שנלחץ באמצעות OCR. בלעדיות הדדית עם
elementDescriptors.
|
matchIndex
|
מציין את האינדקס של המופע של אלמנט היעד התואם, כשאלמנט היעד מזוהה באמצעות visionText. אם הוא 0, פעולת התסריט של Robo בוחרת את הרכיב הראשון שתואם, אם הוא 1, פעולת התסריט של Robo בוחרת את הרכיב השני שתואם, וכן הלאה. הסדר נקבע משמאל לימין ומלמעלה למטה. ערך ברירת המחדל הוא 0 (ההתאמה הראשונה נבחרת).
|
maxNumberOfRuns
|
מציין כמה פעמים ללחוץ על אלמנט אקראי במקלדת הווירטואלית, אם הערך של eventType הוא SOFT_KEYBOARD_RANDOM_CLICK.
ערך ברירת המחדל הוא 1.
|
הנה דוגמה לפעולה בסקריפט Robo שלוחצת על לחצן עם מזהה המשאב "com.google.samples.apps.topeka:id/done":
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
הדוגמה הבאה היא של פעולת סקריפט של Robo שמתבצעת בלחיצה על המופע השני של המילה "Search" שזוהתה במסך באמצעות OCR:
{
"eventType": "VIEW_CLICKED",
"visionText": "Search",
"matchIndex": 1
}
הדוגמה הבאה מתארת פעולה בסקריפט Robo שכוללת קליק על אלמנט במקלדת וירטואלית עם תיאור תוכן "Emoji button":
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
הנה דוגמה לפעולה של סקריפט Robo שבו מבוצעת הקלקה על רכיבים אקראיים במקלדת וירטואלית עד חמש פעמים:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
השבתת המקלדת הווירטואלית
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "DISABLE_KEYBOARD"
|
-- |
הדוגמה הבאה מציגה פעולה בסקריפט Robo שמשביתה את המקלדת הרכה:
{
"eventType": "DISABLE_KEYBOARD"
}
הרצת פקודת adb shell
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "ADB_SHELL_COMMAND"
|
-- |
command
|
פקודת המעטפת של ממשק הגישור של Android (adb) להפעלה. |
המאפיין הבא הוא אופציונלי:
-
expectedOutputRegex– הפלט הצפוי של הפקודה כביטוי רגולרי של Java. אם הפלט לא תואם, פעולת הסקריפט של Robo נכשלת. כברירת מחדל, זהו מחרוזת ריקה, כלומר הפלט לא נבדק.
הדוגמה הבאה מציגה פעולה בסקריפט Robo שמנקה את נתוני המשתמש של האפליקציה שנבדקת:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
מתן הרשאות
הפעולה הזו מתועדת על ידי כלי ההקלטה של סקריפטים של Robo ב-Android Studio לצורך תאימות לאחור עם Espresso Test Recorder. במהלך בדיקת Robo, כל ההרשאות ניתנות לאפליקציה שנבדקת בתחילת כל סריקה, ולכן הפעולה הזו לא משפיעה. אל תשתמשו בפעולה הזו בסקריפטים של Robo.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "PERMISSIONS_REQUEST"
|
-- |
התעלמות מכל הרכיבים במסך
הפעולה הזו גורמת ל-Robo להתעלם מכל האלמנטים בכל מסך שמפעיל את סקריפט Robo שמכיל את הפעולה.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "ALL_ELEMENTS_IGNORED"
|
-- |
הדוגמה הבאה מציגה פעולה בסקריפט Robo שגורמת ל-Robo להתעלם מכל הרכיבים במסך:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
התעלמות מרכיב
הפעולה הזו גורמת ל-Robo להתעלם מרכיב (או מרכיבים) שתואם לelementDescriptors שצוין.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "ELEMENT_IGNORED"
|
-- |
elementDescriptors
|
מזהה את הווידג'טים של ממשק המשתמש שהמערכת התעלמה מהם באמצעות ההיררכיה של ממשק המשתמש ב-Android. |
המאפיין הבא הוא אופציונלי:
-
ignoreChildren– אם ההגדרה היאtrue, Robo מתעלם גם מכל צאצאי הווידג'טים של ממשק המשתמש שהוגדרו להתעלמות. ערך ברירת המחדל הואfalse.
הדוגמה הבאה מציגה פעולה בסקריפט של Robo שגורמת ל-Robo להתעלם מכל הרכיבים שהתיאורים שלהם מתחילים ב-"Avatar":
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
טקסט קלט
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
eventType
|
מציין את סוג הפעולה של סקריפט Robo. |
"eventType": "VIEW_TEXT_CHANGED"
|
הזנת הטקסט שצוין בווידג'ט של ממשק המשתמש של היעד. |
"eventType": "ENTER_TEXT"
|
מזין את הטקסט הנתון בווידג'ט של ממשק המשתמש של היעד, ואז שולח אירוע KEYCODE_ENTER לווידג'ט הזה של ממשק המשתמש.
|
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש של היעד באמצעות ההיררכיה של ממשק המשתמש של Android. |
replacementText
|
הטקסט שצריך להזין בווידג'ט של ממשק המשתמש של היעד. |
בדוגמה הבאה מוצגת פעולת סקריפט של Robo שמזינה את הערך "John" לווידג'ט בממשק המשתמש עם מזהה המשאב "com.google.samples.apps.topeka:id/first_name":
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
לחיצה ארוכה
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "VIEW_LONG_CLICKED"
|
-- |
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש של היעד באמצעות ההיררכיה של ממשק המשתמש של Android. בלעדית הדדית עם visionText.
|
visionText
|
מזהה את האלמנט שלחיצה ארוכה בוצעה עליו באמצעות OCR. בלעדיות הדדית עם
elementDescriptors.
|
matchIndex
|
מציין את האינדקס של המופע של אלמנט היעד התואם, כשאלמנט היעד מזוהה באמצעות visionText. אם הוא 0, פעולת התסריט של Robo בוחרת את הרכיב הראשון שתואם, אם הוא 1, פעולת התסריט של Robo בוחרת את הרכיב השני שתואם, וכן הלאה. הסדר נקבע משמאל לימין ומלמעלה למטה. ערך ברירת המחדל הוא 0 (ההתאמה הראשונה נבחרת).
|
המאפיין הבא הוא אופציונלי:
-
delayTime– מציין את משך הזמן של הלחיצה הארוכה, באלפיות שנייה.
הנה דוגמה לפעולה בסקריפט Robo שמבצעת לחיצה של חמש שניות על ווידג'ט בממשק המשתמש עם תיאור תוכן "Avatar 8":
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
ביצוע תנועה עם נקודה אחת
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
"eventType": "ONE_POINT_GESTURE"
|
-- |
coordinates
|
שתי קואורדינטות של תנועת מגע בנקודה אחת, בפורמט (x1,y1)->(x2,y2) כאחוזים או כפיקסלים. |
המאפיין הבא הוא אופציונלי:
-
dragAndDrop– אם מוגדר הערךtrue, תנועת האצבע האחת מבצעת פעולת גרירה ושחרור. ערך ברירת המחדל הואfalse.
הדוגמה הבאה היא של פעולת מחוות של נקודה אחת בסקריפט Robo שמבצעת החלקה כלפי מטה:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
ביצוע תנועה עם שתי אצבעות
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
"eventType": "TWO_POINT_GESTURE"
|
-- |
coordinates
|
ארבע קואורדינטות של תנועת מגע בשתי נקודות, בפורמט "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" כאחוזים או כפיקסלים. |
הדוגמה הבאה מציגה פעולה בסקריפט Robo שמבצעת תנועת צביטה להגדלה:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
ביצוע פעולה ב-IME
הפעולה הזו לוחצת על לחצן הפעולה הנוכחי, למשל 'הבא', 'סיום' ו'חיפוש', בעורך שיטות הקלט (IME) של הווידג'ט המיועד בממשק המשתמש.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
"eventType": "PRESSED_EDITOR_ACTION"
|
-- |
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש של היעד באמצעות ההיררכיה של ממשק המשתמש של Android. |
הדוגמה הבאה היא של פעולת סקריפט של Robo שמבצעת פעולת IME בווידג'ט של ממשק משתמש עם מזהה המשאב "com.google.samples.apps.topeka:id/first_name":
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
לחיצה על 'חזרה'
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
eventType
|
מציין את סוג הפעולה של סקריפט Robo. |
"eventType": "PRESSED_BACK"
|
שולח אירוע KEYCODE_BACK למכשיר.
|
"eventType": "PRESSED_BACK_EMULATOR_28"
|
המאפיין הזה משמש את כלי ההקלטה של סקריפטים של Robo ב-Android Studio ללחיצה על 'הקודם' באמולטורים API 28. |
הדוגמה הבאה מציגה פעולה בסקריפט Robo שבה לוחצים על 'הקודם':
{
"eventType": "PRESSED_BACK"
}
לחיצה על הכפתור הראשי
הפעולה הזו שולחת אירוע KEYCODE_HOME למכשיר.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "GO_HOME"
|
-- |
הדוגמה הבאה מציגה פעולה בתסריט Robo של לחיצה על מקש הבית:
{
"eventType": "GO_HOME"
}
גלילה של רכיב עד שהוא גלוי
הפעולה הזו גורמת לבדיקת Robo לגלול קדימה את הווידג'ט של ממשק המשתמש שתואם לelementDescriptors שצוין, עד שהווידג'ט של ממשק המשתמש שתואם לchildElementDescriptors שצוין מופיע על המסך, או עד שלא ניתן יותר לגלול את הווידג'ט שנגלל, או עד שמגיעים למספר המקסימלי של 50 גלילות.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "ELEMENT_SCROLL_INTO_VIEW"
|
-- |
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש שבו מתבצעת הגלילה באמצעות היררכיית ממשק המשתמש של Android. |
childElementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש שאליו רוצים לגלול באמצעות ההיררכיה של ממשק המשתמש של Android. |
הדוגמה הבאה מציגה פעולה של סקריפט Robo שמגללת את הווידג'ט של ממשק המשתמש עם מזהה המשאב "my.app.package:id/scrollable_card_container" עד שהווידג'ט של ממשק המשתמש עם הטקסט "Orange" מוצג במסך (או עד שלא ניתן לבצע עוד גלילות, או עד שמגיעים למספר המקסימלי של 50 גלילות):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
החלקה
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
"eventType": "VIEW_SWIPED"
|
-- |
swipeDirection
|
מציינים את כיוון ההחלקה:
|
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש של היעד באמצעות ההיררכיה של ממשק המשתמש של Android. |
הדוגמה הבאה מציגה פעולה של סקריפט Robo שמבצעת החלקה כלפי מעלה בווידג'ט של ממשק משתמש עם מזהה המשאב "my.app.package:id/custom_content":
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
צילום מסך
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "TAKE_SCREENSHOT"
|
-- |
screenshotName
|
מציין את שם הקובץ של צילום המסך. |
דוגמה לפעולה של סקריפט Robo שמצלמת צילום מסך:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
מקישים על נקודה במסך
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
"eventType": "POINT_TAP"
|
-- |
pointTapXCoordinate
|
קואורדינטת ה-X של הפיקסל בנקודה שבה התבצעה ההקשה. אי אפשר להשתמש בו עם
pointTapXPercent ועם pointTapYPercent.
|
pointTapYCoordinate
|
קואורדינטת ה-Y של הפיקסל בנקודה שבה התבצעה ההקשה. אי אפשר להשתמש בו עם
pointTapXPercent ועם pointTapYPercent.
|
pointTapXPercent
|
קואורדינטת X של הנקודה שבה לוחצים על המסך, באחוזים. אי אפשר להשתמש בו עם
pointTapXCoordinate ועם pointTapYCoordinate.
|
pointTapYPercent
|
קואורדינטת Y של הנקודה שבה הקשתם, באחוזים. אי אפשר להשתמש בו עם pointTapXCoordinate ועם pointTapYCoordinate.
|
הדוגמה הבאה מציגה פעולה בסקריפט של Robo שמקישה באמצע המסך:
{
"eventType": "POINT_TAP",
"pointTapXPercent": 50,
"pointTapYPercent": 50
}
הקשה על נקודה בתוך אלמנט
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "POINT_TAP_ELEMENT"
|
-- |
pointTapXPercent
|
קואורדינטת ה-X באחוזים בתוך רכיב היעד. |
pointTapYPercent
|
קואורדינטת ה-Y באחוזים בתוך רכיב היעד. |
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש של היעד באמצעות היררכיית ממשק המשתמש של Android. |
הדוגמה הבאה מציגה פעולה בסקריפט Robo שמזיזה את פס ההזזה של פס חיפוש ימינה:
{
"eventType": "POINT_TAP_ELEMENT",
"pointTapXPercent": 80,
"pointTapYPercent": 50,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/my_seekbar"
}
]
}
סיום הסריקה
הפעולה הזו מפסיקה את בדיקת Robo.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
|---|---|
"eventType": "TERMINATE_CRAWL"
|
-- |
הדוגמה הבאה מציגה פעולה בסקריפט Robo שמפסיקה בדיקת Robo:
{
"eventType": "TERMINATE_CRAWL"
}
המתן
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "WAIT" (or "DELAYED_MESSAGE_POSTED")
|
-- |
delayTime
|
מציינת את משך ההמתנה באלפיות השנייה. |
בדוגמה הבאה מוצגת פעולה בסקריפט Robo שממתינה שלוש שניות:
{
"eventType": "WAIT",
"delayTime": 3000
}
המתנה לרכיב
הפעולה הזו גורמת ל-Robo test להמתין עד שרכיב יופיע במסך, עד לזמן הקצוב לתפוגה שצוין.
בטבלה הבאה מפורטים מאפייני החובה:
| מאפיין | תיאור |
"eventType": "WAIT_FOR_ELEMENT"
|
-- |
delayTime
|
מציין את הזמן הקצוב לתפוגה של ההמתנה, באלפיות השנייה. |
elementDescriptors
|
מזהה את הווידג'ט של ממשק המשתמש שהמתין באמצעות היררכיית ממשק המשתמש של Android. |
הדוגמה הבאה מציגה פעולה של סקריפט Robo שממתינה עד 30 שניות להופעת ווידג'ט בממשק המשתמש עם מזהה המשאב "my.app.package:id/confirmation_button" במסך:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}