يقدّم هذا المستند معلومات مرجعية حول نصوص 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 البرمجية. تتشابه بنية نص Robo البرمجي لنظام التشغيل iOS+ مع بنية Android، وتتصرّف ميزات iOS+ المتوافقة بشكل مشابه لميزات Android المقابلة.
تتوفّر الإجراءات التالية في نظام التشغيل iOS والإصدارات الأحدث:
- التأكيد
- النقر
- النقر مع الاستمرار
- التمرير سريعًا
- تجاهل جميع العناصر
- انتظار
- أخذ لقطة شاشة
- إنهاء الزحف
تتوفّر سمات التعريف التالية في واصفات العناصر على أجهزة iOS والإصدارات الأحدث:
- اسم الصف
- اسم الفئة الأصل
- وصف المحتوى (والتعبير العادي)
- النص (والتعبير العادي)
تتوفّر شروط التفعيل في أوصاف السياق التالية في نظام التشغيل iOS والإصدارات الأحدث:
- عرض التطبيق قيد الاختبار
- العنصر الحالي
- تم تنفيذ إجراء غير تابع لـ Robo
البنية
يتضمّن نص Robo البرمجي عدة سمات تصف طريقة تنفيذه. معظم هذه السمات اختيارية وتتضمّن قيمًا تلقائية محدّدة مسبقًا:
| السمة | الوصف |
id
|
رقم صحيح يساعد في تتبُّع نص Robo هذا في نواتج الزحف.
يتضمّن Robo نصوصًا برمجية مدمجة مع id خاصة بها. مع أنّ id نفسه في نصوص Robo البرمجية المختلفة لا يؤثّر في سلوكها، قد يكون من الصعب التمييز بين الإجراءات من نصوص Robo البرمجية هذه في نواتج الزحف. ننصحك بتعيين id فريد بقيمة 1000 أو أعلى لبرامج Robo النصية لتجنُّب أي تعارضات.
|
description
|
مشابهة لـ id ولكنها أكثر وصفية.
|
crawlStage
|
مرحلة الزحف التي يطبّق فيها Robo نص Robo البرمجي هذا ويشكّل هذا القسم تلقائيًا المرحلة الرئيسية من عملية الزحف. |
priority
|
تمثّل هذه السمة أولوية نص Robo البرمجي هذا مقارنةً بنصوص Robo البرمجية الأخرى.
تكون أولوية جميع نصوص Robo البرمجية 1 تلقائيًا.
|
maxNumberOfRuns
|
تحدّد هذه السمة عدد المرات التي يمكن أن ينفّذ فيها 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
|
عدد إجراءات النصوص البرمجية غير التابعة لـ 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، يتم تخطّي هذا الإجراء عندما يتعذّر تنفيذه. على سبيل المثال، يتم تخطّي هذا الإجراء عندما يتعذّر العثور على عنصر واجهة المستخدم المستهدَف على الشاشة، وذلك بدون تعذُّر تنفيذ النص البرمجي الذي يتضمّنه. تكون القيمة التلقائية 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 البرمجي هذا لتنفيذه. تكون مَعلمات النموذج مسبوقة بشرطتين سفليتين متبوعتين بعلامة النسبة المئوية، وملحقة بعلامة النسبة المئوية متبوعة بشرطتين سفليتين.
تتيح نصوص 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
|
عدد المرات التي يمكن فيها تنفيذ هذا الإجراء الشرطي خلال عملية تنفيذ واحدة لنص 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 البرمجي على تعليمات لتجاهل عناصر واجهة مستخدم معيّنة أو جميع عناصر واجهة المستخدم على شاشة معيّنة. يتم تمثيل هذه التعليمات على أنّها تجاهل "الإجراءات" باستخدام eventType ELEMENT_IGNORED وALL_ELEMENTS_IGNORED على التوالي.
عندما تتطابق السمة contextDescriptor في نص Robo برمجي يتضمّن إجراءات تجاهل مع شاشة معيّنة، لا يتفاعل Robo مع أي أدوات واجهة مستخدم تستهدفها إجراءات التجاهل (إلا إذا كان إجراء آخر في نص Robo برمجي يجعل Robo ينفّذ إجراءً على إحدى أدوات واجهة المستخدم التي تم تجاهلها).
يمكن أن يحتوي نص Robo البرمجي على مجموعة من الإجراءات التي تتجاهل وتلك الشرطية وغير الشرطية. على عكس إجراءات نصوص Robo البرمجية الأخرى، يتم تطبيق إجراءات التجاهل طالما أنّ contextDescriptor لنص Robo البرمجي الذي يحتوي عليها يتطابق مع شاشة أثناء عملية زحف Robo، بغض النظر عن قيم السمات priority وmaxNumberOfRuns.
في ما يلي مثال على ملف يحتوي على نصَّين برمجيَّين من 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 script أيضًا مواضع البيانات المطلقة لعناصر AdapterView الفرعية التي تستهدفها إجراءات Robo script على النحو التالي: 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 Test.
التأكيد
إذا كانت الحالة المؤكَّدة صحيحة، ينتقل نص 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" على الشاشة باستخدام التعرّف الضوئي على الحروف:
{
"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
|
تحدّد هذه السمة العنصر الذي تم النقر عليه باستخدام تقنية التعرّف الضوئي على الحروف. لا يمكن استخدامها مع
elementDescriptors.
|
matchIndex
|
تحدّد هذه السمة فهرس تكرار العنصر المستهدف المطابِق، وذلك عندما يتم تحديد العنصر المستهدف باستخدام visionText. إذا كانت القيمة 0، سيختار إجراء النص البرمجي في Robo العنصر الأول المطابِق، وإذا كانت القيمة 1، سيختار العنصر الثاني المطابِق، وهكذا. يتم تحديد الترتيب من اليسار إلى اليمين ومن الأعلى إلى الأسفل. القيمة التلقائية هي 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" التي تم رصدها على الشاشة باستخدام التعرّف الضوئي على الحروف:
{
"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
|
أمر shell الذي سيتم تنفيذه باستخدام أداة Android Debug Bridge (adb). |
السمة التالية اختيارية:
expectedOutputRegex: الناتج المتوقّع للأمر كتعبير عادي في Java. وفي حال عدم تطابُق الناتج، سيتعذّر تنفيذ إجراء النص البرمجي في Robo. القيمة التلقائية هي سلسلة فارغة، ما يعني أنّه لا يتم التحقّق من الناتج.
في ما يلي مثال على إجراء نص Robo برمجي يمحو بيانات المستخدم في التطبيق قيد الاختبار:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
منح الأذونات
تسجِّل أداة تسجيل نصوص Robo البرمجية في "استوديو Android" هذا الإجراء لضمان التوافق مع الإصدارات القديمة من 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
|
تحديد العنصر الذي تم النقر عليه مع الاستمرار باستخدام تقنية التعرّف الضوئي على الحروف لا يمكن استخدامها مع
elementDescriptors.
|
matchIndex
|
تحدّد هذه السمة فهرس تكرار العنصر المستهدف المطابِق، وذلك عندما يتم تحديد العنصر المستهدف باستخدام visionText. إذا كانت القيمة 0، سيختار إجراء النص البرمجي في Robo العنصر الأول المطابِق، وإذا كانت القيمة 1، سيختار العنصر الثاني المطابِق، وهكذا. يتم تحديد الترتيب من اليسار إلى اليمين ومن الأعلى إلى الأسفل. القيمة التلقائية هي 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 Test للأمام في عنصر واجهة المستخدم الذي يتطابق مع 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
|
الإحداثي الصادي للنقطة التي تم النقر عليها، معبّرًا عنه كنسبة مئوية يستبعد كلُّ من الحقلَين 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"
}
]
}