يوفّر هذا المستند معلومات مرجعية حول نصوص 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"
}
]
}
]
إتاحة نصوص Robo البرمجية على أجهزة iOS+
يوفّر Robo لنظام التشغيل iOS+ (إصدار تجريبي) دعمًا محدودًا لنصوص Robo البرمجية. The Robo script syntax for iOS+ is identical to Android syntax, and supported iOS+ features behave similarly to their Android counterparts.
تتوفّر الإجراءات التالية في iOS+:
- Assertion
- النقر
- النقر مع الاستمرار
- التمرير سريعًا
- تجاهُل كل العناصر
- انتظار
- أخذ لقطة شاشة
- إنهاء الزحف
تتوفّر السمات التعريفية التالية في واصفات العناصر في نظام التشغيل iOS+:
- اسم الصف
- اسم الفئة الأصل
- وصف المحتوى (والتعبير النمطي)
- النص (والتعبير النمطي)
تتوفّر شروط التفعيل التالية في واصفات السياق في نظام التشغيل iOS والإصدارات الأحدث:
- يظهر التطبيق قيد الاختبار
- العنصر متوفّر
- تم تنفيذ إجراء نص برمجي غير آلي
البنية
يحتوي نص Robo البرمجي على عدة سمات تصف كيفية تنفيذه من خلال Robo. معظم هذه السمات اختيارية وتتضمّن قيمًا تلقائية محدّدة مسبقًا:
| السمة | الوصف |
id
|
عدد صحيح يساعد في تتبُّع نص Robo البرمجي هذا في نتائج الزحف
يحتوي Robo على نصوص Robo برمجية مدمجة مع id الخاصة بها. ومع أنّ استخدام id نفسه في نصوص Robo البرمجية المختلفة لا يؤثر في سلوكها، قد يكون من الصعب تمييز الإجراءات من نصوص Robo البرمجية هذه في نتائج الزحف. ننصحك بتعيين id فريد بقيمة 1000 أو أعلى لنصوص Robo البرمجية لتجنُّب أي تعارضات.
|
description
|
تشبه السمة id ولكنّها أكثر وصفية.
|
crawlStage
|
مرحلة الزحف التي يطبّق فيها 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"
}
]
}
]
وصف السياق
يحدّد واصف السياق السياق أو الشرط الذي يؤدي إلى تشغيل نص برمجي لبرنامج Robo باستخدام سمة واحدة أو مجموعة من السمات:
| السمة | الوصف |
|---|---|
"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 ليس من إجراءات نص Robo البرمجي.
|
negateCondition
|
في حال ضبطها على true، يتم إلغاء condition. على سبيل المثال، يمكنك استخدام هذه السمة للتحقّق مما إذا كان تطبيق واجهة المستخدم المصغّر غير معروض على الشاشة، أو أنّ التطبيق قيد الاختبار لا يعمل في المقدّمة.
|
elementDescriptors
|
يشير ذلك إلى واصف عنصر واحد أو أكثر يحدّد تطبيق واجهة مستخدم مصغّر على الشاشة.
ويتم استخدامها مع الشروط element_present وelement_disabled وelement_checked. لا يمكن استخدامها مع visionText. لمزيد من المعلومات، يُرجى الاطّلاع على أوصاف العناصر.
|
visionText
|
يتم رصد النص على الشاشة باستخدام واجهة برمجة التطبيقات "التعرّف البصري على الأحرف" (OCR). يتم استخدام السمة visionText مع الشرط element_present. لا يمكن استخدامها مع elementDescriptors.
|
nonRoboscriptActionCount
|
عدد إجراءات النصوص البرمجية غير الآلية المتتالية التي تم تنفيذها سابقًا. ويتم استخدامه مع الشرط 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
}
]
مَعلمات النماذج
مَعلمة النموذج هي عنصر نائب في نص 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 إجراء نص Robo البرمجي الحالي (ولن يعود إليه أبدًا) وينفّذ الإجراء اللاحق.
تتيح هذه الطريقة التعامل مع السيناريوهات التي يتغيّر فيها سلوك التطبيق بين الإصدارات أو يكون غير مستقر، على سبيل المثال، عندما يظهر مربّع حوار متقطّع على شاشات مختلفة أثناء تسجيل نص Robo البرمجي مقابل إعادة تشغيله. |
| تعليق | إذا تعذّرت مطابقة إجراءات نص Robo البرمجي الحالية أو اللاحقة كليًا أو جزئيًا، يتم تعليق نص Robo البرمجي مؤقتًا ويختار اختبار Robo إجراءً لتنفيذه باستخدام استراتيجياته الأخرى. بعد اكتمال هذا الإجراء،
يستأنف اختبار Robo تنفيذ نص Robo البرمجي.
طالما أنّه لا يمكن مطابقة إجراءات نصوص Robo البرمجية الحالية أو اللاحقة، سيظل نص Robo البرمجي معلّقًا لأي عدد من الإجراءات. وبالتالي، لا يلزم بالضرورة أن تكون نصوص Robo البرمجية مقدمة لاختبار Robo، ويمكنك تداخل إجراءات نصوص Robo البرمجية مع إجراءات اختبار Robo العادية. تتيح هذه الطريقة التعامل مع السيناريوهات التي يكون فيها سلوك التطبيق غير مستقر، أو عندما تكون التغييرات بين إصدارات التطبيق كبيرة بما يكفي لكي يحتاج اختبار Robo إلى "ملء الفجوات" بإجراءاته العادية. |
الأولويات
إذا وصل نص 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 من الزحف إلى التطبيق قيد الاختبار يجب ألا تتجاوز مدة نص Robo البرمجي post_crawl 15 ثانية، وإلا قد يتم إنهاء الزحف بسبب انتهاء المهلة.
|
crawl
|
مرحلة الزحف الرئيسية، عندما يزحف Robo إلى التطبيق قيد الاختبار. |
close_screen
|
عندما يحاول Robo العودة (التتبع العكسي) من شاشة معيّنة، بعد استكشاف جميع الإجراءات الممكنة على هذه الشاشة يضغط 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" كلما حاول الرجوع (التراجع) من مربّع حوار
تأكيد:
{
"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
|
How many times this conditional action can be performed during one execution of its containing Robo script. بشكل تلقائي، يمكن تنفيذ جميع الإجراءات الشرطية مرة واحدة على الأكثر في عملية تنفيذ واحدة لملف Robo script الذي يحتوي عليها. |
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 لتجاهل تطبيقات مصغّرة معيّنة لواجهة المستخدم أو جميع التطبيقات المصغّرة لواجهة المستخدم على شاشة معيّنة. يتم تمثيل هذه التعليمات على أنّها تجاهل "الإجراءات" باستخدام 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 يتجاهل التطبيقات المصغّرة لواجهة المستخدم التي تتطابق معرّفات مواردها مع تعبير Java النمطي ".*:id/done" على شاشة تحتوي على تطبيق مصغّر لواجهة المستخدم بمعرّف المورد "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" وتشغيله في Test Lab
يمكنك إنشاء نص برمجي Robo في "استوديو Android"، والذي يحفظ النص البرمجي كملف JSON. يمكنك بعد ذلك تحميل ملف JSON إلى Firebase Test Lab مع التطبيق وإجراء الاختبار وفقًا لذلك.
عند إجراء اختبار Robo مع إرفاق نص برمجي، ينفِّذ اختبار Robo أولاً الإجراءات التي تشتمل على نص برمجي، ثم يستكشف التطبيق كالمعتاد.
لإنشاء ملف JSON لنص Robo البرمجي في "استوديو Android"، اتّبِع الخطوات الواردة في مقالة تسجيل نص Robo البرمجي باستخدام Test Lab في "استوديو Android".
إجراءات نصوص Robo البرمجية
تنطبق السمة الاختيارية الشائعة التالية على جميع الإجراءات:
-
description: يساعد في تتبُّع تنفيذ إجراء نص Robo البرمجي هذا في مخرجات اختبار Robo.
Assertion
إذا كان الشرط المُثبَت صحيحًا، يواصل نص Robo البرمجي الإجراء التالي، والذي قد يكون تأكيدًا آخر. وإلا، سيتم إيقاف تنفيذ نص Robo البرمجي بسبب فشل التأكيد.
يعرض الجدول التالي السمات المطلوبة:
| السمة | الوصف |
"eventType": "ASSERTION"
|
-- |
contextDescriptor
|
يصف السياق أو الشرط الذي تم تأكيده. وله البنية نفسها ويوفّر إمكانات مشابهة لـ contextDescriptor الخاص بنص Robo البرمجي. |
في ما يلي مثال على تأكيد في نص برمجي لبرنامج Robo يتحقّق من أنّ التطبيق قيد الاختبار في المقدّمة:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
في ما يلي مثال على تأكيد نص برمجي لبرنامج Robo يتحقّق من أنّ تطبيق واجهة المستخدم المصغّر الذي يحمل رقم تعريف المورد "com.google.samples.apps.topeka:id/done" موجود على الشاشة:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
في ما يلي مثال على تأكيد في نص برمجي لـ Robo يتحقّق من عدم رصد "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" للنقر على عناصر القائمة. |
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
يعرض الجدول التالي السمات المطلوبة:
| السمة | الوصف |
"eventType": "ADB_SHELL_COMMAND"
|
-- |
command
|
أمر واجهة Android Debug Bridge (adb) المطلوب تنفيذه |
السمة التالية اختيارية:
-
expectedOutputRegex: الناتج المتوقّع للأمر كتعبير عادي في Java وفي حال عدم تطابُق الناتج، سيتعذّر تنفيذ إجراء نص Robo البرمجي. وتكون القيمة التلقائية هي سلسلة فارغة، ما يعني أنّه لا يتم التحقّق من الناتج.
في ما يلي مثال على إجراء نص Robo برمجي يمحو بيانات مستخدم التطبيق قيد الاختبار:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
منح الأذونات
يتم تسجيل هذا الإجراء من خلال مسجّل نصوص Robo البرمجية في "استوديو Android" للتوافق مع الأنظمة القديمة من خلال مسجّل اختبار Espresso. يمنح اختبار 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" للضغط على زر الرجوع في واجهة برمجة التطبيقات 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 ينتظر ظهور عنصر على الشاشة حتى انتهاء المهلة المحدّدة.
يعرض الجدول التالي السمات المطلوبة:
| السمة | الوصف |
"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"
}
]
}