يوفّر هذا المستند معلومات مرجعية عن نصوص Robo، بما في ذلك البنية والإمكانات والاستخدام والتسجيل والإجراءات. نصوص Robo هي اختبارات تؤتمت مهام ضمان الجودة اليدوية للتطبيقات المتوافقة مع الأجهزة الجوّالة، و تفعّل استراتيجيات التكامل المستمر (CI) واختبار الإطلاق التجريبي. ملف Robo script هو ملف 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 والإصدارات الأحدث المتوافقة مع ملف برمجة Robo بالطريقة نفسها التي تعمل بها نظيراتها في Android.
الإجراءات التالية متاحة في نظام التشغيل iOS والإصدارات الأحدث:
- التأكيد
- النقر
- النقر مع الاستمرار
- التمرير باللمس
- تجاهل كل العناصر
- انتظار
- أخذ لقطة شاشة
- إنهاء عملية الزحف
تتوفّر السمات التعريفية التالية في أوصاف العناصر في الإصدار 11 من نظام التشغيل iOS والإصدارات الأحدث:
- اسم الصف
- اسم فئة السلف
- وصف المحتوى (والتعبير العادي)
- النص (والتعبير العادي)
تتوفّر شروط التفعيل في أوصاف السياق التالية في الإصدار 11 من نظام التشغيل iOS والإصدارات الأحدث:
- تم عرض التطبيق قيد الاختبار
- العنصر متوفّر
- تم تنفيذ إجراء نص برمجي غير تابع لـ Robo
البنية
يحتوي نص Robo البرمجي على عدة سمات تصف كيفية تنفيذ Robo له. تكون معظم هذه السمات اختيارية مع قيم تلقائية محدّدة مسبقًا:
السمة | الوصف |
id
|
رقم صحيح يساعد في تتبُّع نص 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 هذا |
يحتوي ملف واحد على مجموعة من نصّ Roboscript واحد أو أكثر.
في ما يلي مثال على ملف يحتوي على نصَّين برمجيَين غير مشروطَين في 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
|
يتم رصد النص على الشاشة باستخدام واجهة برمجة التطبيقات Optical Character Recognition
(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" : "DELAYED_MESSAGE_POSTED",
"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": "DELAYED_MESSAGE_POSTED",
"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": "DELAYED_MESSAGE_POSTED",
"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": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
},
{
"id": 1001,
"description": "Robo script 2",
"priority": "2",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
},
{
"id": 1002,
"description": "Robo script 3",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"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"
كلما حاول الرجوع (backtrack) من مربّع حوار التأكيد:
{
"id": 1000,
"crawlStage": "close_screen",
"maxNumberOfRuns": 999,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_dialog"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Cancel"
}
]
}
]
}
الإجراءات الشَرطية
يمكن أن يحتوي نص Robo البرمجي على إجراءات شرطية. تحتوي الإجراءات الشَرطية على ثلاث سمات إضافية تصف كيفية تنفيذ Robo لها:
السمة | الوصف |
priority
|
أولوية هذا الإجراء الشَرطي مقارنةً بالإجراءات
الشَرطية الأخرى ضمن نص Robo الذي يحتوي عليه بشكل تلقائي، يكون لكل
الإجراءات الشرطية أولوية بقيمة 1 .
|
maxNumberOfRuns
|
عدد المرات التي يمكن فيها تنفيذ هذا الإجراء الشَرطي خلال تنفيذ واحد للنص البرمجي Robo الذي يحتوي عليه. وحسب الإعدادات التلقائية، يمكن تنفيذ جميع الإجراءات الشرطية مرة واحدة على الأكثر في عملية تنفيذ واحدة لمحتوى Robo برمجي. |
contextDescriptor
|
السياق أو الشرط الذي يؤدي إلى تنفيذ هذا الإجراء الشَرطي ويحتوي على البنية نفسها ويوفّر إمكانات مشابهة المتوفّرة في سياق 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": "DELAYED_MESSAGE_POSTED",
"delayTime": 10000
},
{
"description": "Screen on",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 82"
},
{
"description": "Wait for 10 seconds",
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 10000
}
}
تجاهل الإجراءات
يمكن أن يحتوي نص Robo البرمجي على تعليمات لتطبيق Robo بتجاهل عناصر واجهة مستخدم معيّنة
أو جميع عناصر واجهة المستخدم على شاشة معيّنة. يتم تمثيل هذه التعليمات
باعتبارها تتجاهل "الإجراءات" باستخدام eventType
ELEMENT_IGNORED
و
ALL_ELEMENTS_IGNORED
على التوالي.
عندما تتطابق سمة contextDescriptor
لنص Robo برمجي يحتوي على إجراءات تجاهل
مع شاشة معيّنة، لا يتفاعل Robo مع أي تطبيقات مصغّرة لواجهة المستخدم
تستهدفها إجراءات تجاهله (ما لم يُجري أحد إجراءات Robo البرمجية الأخرى
إجراءً على أحد التطبيقات المصغّرة لواجهة المستخدم التي تم تجاهلها).
يمكن أن يحتوي نص Robo برمجي على مزيج من
الإجراءات التي تتجاهل الشروط والإجراءات الشَرطية وغير الشَرطية. على عكس إجراءات نص Robo الأخرى، يتم تطبيق إجراءات تجاهل المحتوى ما دام contextDescriptor
في نص Robo الذي يحتوي عليها يتطابق مع شاشة أثناء الزحف باستخدام Robo، بغض النظر عن قيم السمتَين priority
وmaxNumberOfRuns
.
في ما يلي مثال على ملف يحتوي على نصّي Robo برمجيَّين. نص Robo البرمجي الأول يجعل Robo يتجاهل جميع تطبيقات واجهة المستخدم على شاشة تحتوي على أداة واجهة مستخدم بها معرّف مورد "my.app.package:id/ignored_screen"
. يُجري النص البرمجي الثاني لبرنامج 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 Studio، ما يؤدي إلى حفظ النص البرمجي كملف JSON. يمكنك بعد ذلك تحميل ملف JSON إلى Firebase Test Lab باستخدام التطبيق وإجراء الاختبار وفقًا لذلك.
عند إجراء اختبار Robo مع إرفاق نص برمجي، ينفِّذ اختبار Robo أولاً الإجراءات التي تشتمل على نص برمجي، ثم يستكشف التطبيق كالمعتاد.
لإنشاء ملف JSON لنص Robo برمجي في "استوديو Android"، اتّبِع الخطوات الواردة في مقالة تسجيل نص Robo برمجي باستخدام Test Lab في "استوديو Android".
إجراءات نص Robo البرمجي
تنطبق السمة الاختيارية الشائعة التالية على جميع الإجراءات:
-
description
- يساعد في تتبُّع تنفيذ إجراء نص Robo البرمجي هذا في نتائج اختبار Robo.
التأكيد
إذا كان الشرط الذي تم تأكيده صحيحًا، ينتقل نص Robo البرمجي إلى الخطوة التالية ، والتي قد تكون عبارة عن تأكيد آخر. بخلاف ذلك، يتم إيقاف تنفيذ ملف Robo script بسبب تعذُّر إجراء التأكيد.
يعرض الجدول التالي السمات المطلوبة:
السمة | الوصف |
"eventType": "ASSERTION"
|
-- |
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 ، سيختار إجراء نص Roboscript العنصر الأول الذي يتطابق مع القيمة، وإذا كانت القيمة هي
1 ، سيختار إجراء نص Roboscript العنصر الثاني الذي يتطابق مع القيمة،
وهكذا. يتم تحديد الترتيب من اليسار إلى اليمين ومن أعلى إلى أسفل. القيمة التلقائية هي
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 ينقر على عناصر keypadبرمجي عشوائية يصل إلى خمس مرات:
{
"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 ، سيختار إجراء نص Roboscript العنصر الأول الذي يتطابق معه، وإذا كان الرمز هو
1 ، سيختار إجراء نص Roboscript العنصر الثاني الذي يتطابق معه،
وهكذا. يتم تحديد الترتيب من اليسار إلى اليمين، ومن أعلى إلى أسفل. وتكون القيمة التلقائية هي 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": "DELAYED_MESSAGE_POSTED"
|
-- |
delayTime
|
تحدّد مدة الانتظار بالملي ثانية. |
في ما يلي مثال على إجراء نص Robo برمجي ينتظر لمدة ثلاثة ثواني:
{
"eventType": "DELAYED_MESSAGE_POSTED",
"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"
}
]
}