يقدّم هذا المستند معلومات مرجعية حول نصوص 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 ، سيتم تخطّي هذا الإجراء عندما يتعذّر تنفيذه. على سبيل المثال، يتم تخطّي هذا الإجراء عندما يتعذّر العثور على عنصر واجهة المستخدم المستهدَف على الشاشة، بدون أن يؤدي ذلك إلى تعذُّر تنفيذ نص 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 البرمجي هذا لتنفيذه. يتم وضع شرطتَين سفليتَين قبل معلَمات النموذج متبوعتَين بعلامة النسبة المئوية، ويتم وضع علامة النسبة المئوية بعدهما متبوعة بشرطتَين سفليتَين.
تتيح نصوص 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 إلى 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 يتجاهل عناصر واجهة المستخدم التي تتطابق معرّفات مواردها مع التعبير العادي ".*:id/done"
في Java على شاشة تحتوي على عنصر واجهة مستخدم يحمل معرّف المورد "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 Studio، ما يؤدي إلى حفظ النص البرمجي كملف 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
|
تحدِّد هذه السمة العنصر الذي تم النقر عليه مع الاستمرار باستخدام تقنية التعرّف البصري على الحروف (OCR). لا يمكن استخدامها مع السمة 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
|
الإحداثي 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"
}
]
}