الدليل المرجعي لنصوص Robo البرمجية

يوفّر هذا المستند معلومات مرجعية حول نصوص Robo البرمجية، بما في ذلك البنية والإمكانات والاستخدام والتسجيل والإجراءات. نصوص Robo البرمجية هي اختبارات تعمل على أتمتة مهام تأكيد الجودة اليدوية لتطبيقات الأجهزة الجوّالة، وتتيح استراتيجيات الدمج المستمر واختبار الإطلاق التجريبي. نص Robo البرمجي هو ملف JSON يصف سلسلة من واجهة المستخدم (UI) وإجراءات أخرى.

يمكنك إنشاء نص برمجي لـ Robo بالطرق التالية:

  • استخدِم ميزة تسجيل نصوص Robo البرمجية. (على أجهزة Android فقط)

  • أنشئ نص Robo البرمجي يدويًا. (Android وiOS+)

  • سجِّل نص Robo البرمجي ثم عدِّله يدويًا. (على أجهزة Android فقط)

لمزيد من المعلومات حول استخدام نصوص Robo البرمجية، يُرجى الاطّلاع على مقالة تشغيل نص Robo برمجي.

مقدمة

يتم توفير نص Robo البرمجي لاختبار Robo إلى جانب الإدخالات الأخرى، مثل حزمة تطبيق Android‏ (APK) قيد الاختبار.

في ما يلي مثال على نص برمجي لبرنامج Robo يسجّل دخول المستخدم إلى أحد التطبيقات، ويتم تشغيله عند تشغيل التطبيق قيد الاختبار:

[
  {
    "crawlStage": "crawl",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "VIEW_TEXT_CHANGED",
        "replacementText": "user123",
        "elementDescriptors": [
          {
            "resourceId": "my.app.package:id/username"
          }
        ]
      },
      {
        "eventType": "VIEW_TEXT_CHANGED",
        "replacementText": "12345",
        "elementDescriptors": [
          {
            "resourceId": "my.app.package:id/password"
          }
        ]
      },
      {
        "eventType": "VIEW_CLICKED",
        "elementDescriptors": [
          {
            "resourceId": "my.app.package:id/login"
          }
        ]
      }
    ]
  }
]

إذا كان هناك نص برمجي واحد لـ Robo في ملف وكان يتضمّن شرط التشغيل التلقائي app_under_test_shown، كما هو موضّح في المثال أعلاه، يمكنك تحديد النص البرمجي لـ Robo في ملف باستخدام تنسيق أبسط، مثل تسلسل إجراءاته:

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "user123",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/username"
      }
    ]
  },
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "12345",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/password"
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/login"
      }
    ]
  }
]

إتاحة نصوص Robo البرمجية على أجهزة iOS+

يوفّر Robo لنظام التشغيل iOS+‎ (الإصدار التجريبي) دعمًا محدودًا لنصوص Robo البرمجية. The Robo script syntax for iOS+ is identical to Android syntax, and supported iOS+ features behave similarly to their Android counterparts.

تتوفّر الإجراءات التالية في iOS+‎:

  • تأكيد
  • النقر
  • النقر مع الاستمرار
  • التمرير سريعًا
  • تجاهُل جميع العناصر
  • انتظار
  • أخذ لقطة شاشة
  • إنهاء الزحف

تتوفّر السمات التعريفية التالية في واصفات العناصر في iOS+‎:

  • اسم الصف
  • اسم الفئة الأصلية
  • وصف المحتوى (والتعبير النمطي)
  • النص (والتعبير النمطي)

تتوفّر شروط التفعيل التالية في واصفات السياق في نظام التشغيل iOS والإصدارات الأحدث:

  • يظهر التطبيق قيد الاختبار
  • العنصر متوفّر
  • تم تنفيذ إجراء نص برمجي غير Robo

البنية

يتضمّن نص Robo البرمجي عدة سمات تصف كيفية تنفيذه. معظم هذه السمات اختيارية وتتضمّن قيمًا تلقائية محدّدة مسبقًا:

السمة الوصف
id عدد صحيح يساعد في تتبُّع نص Robo البرمجي هذا في نتائج الزحف يحتوي Robo على نصوص Robo برمجية مدمجة مع id الخاصة بها. ومع أنّ استخدام id نفسه في نصوص Robo البرمجية المختلفة لا يؤثر في سلوكها، قد يكون من الصعب تمييز الإجراءات من نصوص Robo البرمجية هذه في نتائج الزحف. ننصحك بتعيين id فريد بقيمة 1000 أو أعلى لنصوص Robo البرمجية لتجنُّب أي تعارضات.
description تشبه السمة id ولكنّها أكثر وصفية.
crawlStage مرحلة الزحف التي يطبّق فيها Robo هذا النص البرمجي. وتكون هذه المرحلة تلقائيًا هي مرحلة الزحف الرئيسية.
priority أولوية نص Robo البرمجي هذا مقارنةً بالنصوص البرمجية الأخرى لـ Robo تكون أولوية جميع نصوص Robo البرمجية تلقائيًا هي 1.
maxNumberOfRuns يحدّد هذا الإجراء عدد المرات التي يمكن فيها لـ Robo تنفيذ نص Robo البرمجي هذا أثناء الزحف. بشكل تلقائي، يمكن لـ Robo تنفيذ نص Robo برمجي واحد في كل مرة.
contextDescriptor يصف السياق أو الشرط الذي يؤدي إلى تشغيل نص Robo البرمجي هذا. في حال حذف هذا الحقل، يُعتبَر شرط تفعيل نص Robo البرمجي مستوفى دائمًا، أي أنّ نص Robo البرمجي غير مشروط.
actions كل الإجراءات في نص Robo البرمجي هذا

يحتوي ملف واحد على مجموعة من نصوص Robo البرمجية.

في ما يلي مثال على ملف يتضمّن نصَّي Robo برمجيَّين غير مشروطَين، يتضمّن كلّ منهما إجراءً واحدًا يتم تنفيذه مرة واحدة في بداية الزحف:

[
  {
    "id": 1000,
    "description": "My first Robo script",
    "actions": [
      {
        "eventType": "DISABLE_KEYBOARD"
      }
    ]
  },
  {
    "id": 1001,
    "description": "My second Robo script",
    "actions": [
      {
        "eventType": "PRESSED_BACK"
      }
    ]
  }
]

Context descriptor

يحدّد واصف السياق السياق أو الشرط الذي يؤدي إلى تشغيل نص 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 البرمجية مَعلمة النموذج التالية:

  • ‫__%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 بالترتيب التالي:

  1. يحتوي على سمة contextDescriptor.
  2. أن يكون لها أعلى priority (وفقًا للإعدادات التلقائية، يكون لجميع نصوص Robo البرمجية priority التنفيذ نفسه وهو 1).
  3. يظهر أولاً في قائمة نصوص 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 ما يلي بالترتيب:

  1. "Robo script 2" لأنّها ذات الأولوية القصوى.
  2. "Robo script 1" لأنّه يظهر في وقت سابق من بين نصوص Robo البرمجية المتبقية القابلة للتطبيق والتي لها الأولوية نفسها.
  3. ‫"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 البرمجي على تعليمات لـ Robo لتجاهل تطبيقات مصغّرة معيّنة لواجهة المستخدم أو جميع التطبيقات المصغّرة لواجهة المستخدم على شاشة معيّنة. يتم تمثيل هذه التعليمات على أنّها تجاهل "الإجراءات" باستخدام eventType ELEMENT_IGNORED وALL_ELEMENTS_IGNORED على التوالي.

عندما تتطابق السمة contextDescriptor لنص Robo برمجي يحتوي على إجراءات تجاهل مع شاشة معيّنة، لا يتفاعل Robo مع أيّ من تطبيقات واجهة المستخدم المصغّرة التي تستهدفها إجراءات التجاهل (ما لم يؤدِّ إجراء آخر من نصوص Robo البرمجية إلى تنفيذ Robo لإجراء على أحد تطبيقات واجهة المستخدم المصغّرة التي تم تجاهلها).

يمكن أن يحتوي نص Robo البرمجي على مزيج من الإجراءات التي يتم تجاهلها والإجراءات الشرطية وغير الشرطية. على عكس إجراءات نصوص Robo البرمجية الأخرى، يتم تطبيق إجراءات التجاهل طالما أنّ السمة contextDescriptor لنص Robo البرمجي الذي يحتوي عليها تتطابق مع شاشة أثناء زحف Robo، بغض النظر عن قيم السمتَين priority وmaxNumberOfRuns.

في ما يلي مثال على ملف يتضمّن نصَّي Robo برمجيَّين. يجعل نص Robo البرمجي الأول Robo يتجاهل جميع تطبيقات واجهة المستخدم المصغّرة على شاشة تحتوي على تطبيق واجهة مستخدم مصغّر بمعرّف المورد "my.app.package:id/ignored_screen". يجعل نص Robo البرمجي الثاني Robo يتجاهل التطبيقات المصغّرة لواجهة المستخدم التي تتطابق معرّفات مواردها مع تعبير Java النمطي ".*:id/done" على شاشة تحتوي على تطبيق مصغّر لواجهة المستخدم بمعرّف المورد "my.app.package:id/main_screen":

[
  {
    "id": 1000,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/ignored_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ALL_ELEMENTS_IGNORED"
      }
    ]
  },
  {
    "id": 1001,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/main_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ELEMENT_IGNORED",
        "elementDescriptors": [
          {
            "resourceIdRegex": ".*:id/done"
          }
        ]
      }
    ]
  }
]

دعم RecyclerView وAdapterView

يتم تحميل العناصر الثانوية لقطع RecyclerView وAdapterView ديناميكيًا، وقد يتم عرضها بعد عدة تمريرات من الشاشة الحالية. بما أنّ حجم الشاشة وعدد مرات التمرير المطلوبة للوصول إلى هذا العنصر الفرعي يختلفان باختلاف أشكال الأجهزة، من الأفضل الاعتماد على موضع بيانات العنصر الفرعي، وهو موضع مطلق. يعد الاعتماد على عدد الضربات المطلوبة لإحضار هذا الطفل إلى الشاشة ثم استخدام موضع الشاشة نهجًا أقل قوة.

لذلك، يسجّل نص Robo البرمجي مواضع البيانات المطلقة لعناصر RecyclerView الفرعية التي تستهدفها إجراءات نص Robo البرمجي على أنّها recyclerViewChildPosition. يلتقط نص Robo أيضًا مواضع البيانات المطلقة للعناصر الثانوية في AdapterView التي تستهدفها إجراءات نص Robo كـ adapterViewChildPosition.

يتم تنفيذ الإجراءات على العناصر الفرعية في RecyclerView وAdapterView في الخطوات التالية:

  1. يضمن اختبار Robo عرض العنصر الفرعي المقابل على الشاشة من خلال إجراء تحديد الموضع على RecyclerView أو AdapterView الذي يتضمّنه.

  2. ينفّذ اختبار 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.

تأكيد

إذا كان الشرط المُثبَت صحيحًا، يواصل نص Robo البرمجي الإجراء التالي، والذي قد يكون تأكيدًا آخر. وإلا، سيتم إيقاف تنفيذ نص Robo البرمجي بسبب فشل التأكيد.

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "ASSERTION" --
contextDescriptor يصف السياق أو الشرط الذي تم تأكيده. وتتضمّن البنية نفسها وتوفّر إمكانات مشابهة لسمة contextDescriptor في نص Robo البرمجي.

في ما يلي مثال على تأكيد في نص برمجي لبرنامج Robo يتحقّق من أنّ التطبيق قيد الاختبار في المقدّمة:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  }
}

في ما يلي مثال على تأكيد في نص برمجي لبرنامج Robo يتحقّق من أنّ تطبيق واجهة مستخدم مصغّر يحمل رقم تعريف المورد "com.google.samples.apps.topeka:id/done" موجود على الشاشة:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
}

في ما يلي مثال على تأكيد في نص برمجي لبرنامج Robo يتحقّق من عدم رصد "Settings" على الشاشة باستخدام تقنية التعرّف البصري على الأحرف (OCR):

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "negateCondition": true,
    "visionText": "Settings"
  }
}

النقر

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
eventType تحدّد نوع إجراء نص Robo البرمجي.
"eventType": "VIEW_CLICKED" ينقر على العنصر المستهدَف في التطبيق قيد الاختبار.
"eventType": "SOFT_KEYBOARD_CLICK" ينقر على العنصر المستهدَف في لوحة المفاتيح الافتراضية.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" يتم النقر على عناصر عشوائية في لوحة المفاتيح الافتراضية لعدد مرات يصل إلى maxNumberOfRuns.
"eventType": "LIST_ITEM_CLICKED" يستخدمه مسجِّل نصوص Robo البرمجية في "استوديو Android" للنقر على عناصر القائمة.
elementDescriptors يحدّد هذا الإجراء التطبيق المصغّر لواجهة المستخدم الذي تم النقر عليه باستخدام التسلسل الهرمي لواجهة مستخدم Android. لا يمكن استخدامها مع visionText.
visionText يحدّد العنصر الذي تم النقر عليه باستخدام تقنية التعرّف البصري على الأحرف (OCR). لا يمكن استخدامها مع elementDescriptors.
matchIndex تحدّد هذه السمة فهرس تكرار عنصر الاستهداف المطابق، عندما يتم تحديد عنصر الاستهداف باستخدام visionText. إذا كانت القيمة 0، يختار إجراء نص Robo البرمجي أول عنصر مطابق، وإذا كانت القيمة 1، يختار إجراء نص Robo البرمجي ثاني عنصر مطابق، وهكذا. يتم تحديد الترتيب من اليسار إلى اليمين، ومن الأعلى إلى الأسفل. القيمة التلقائية هي 0 (يتم اختيار المطابقة الأولى).
maxNumberOfRuns يحدّد هذا الإعداد عدد المرات التي يتم فيها النقر على عنصر عشوائي في لوحة المفاتيح الافتراضية، عندما تكون قيمة eventType هي SOFT_KEYBOARD_RANDOM_CLICK. تكون القيمة التلقائية 1.

في ما يلي مثال على إجراء في نص برمجي لـ Robo ينقر على زر يحمل معرّف المورد "com.google.samples.apps.topeka:id/done":

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/done"
    }
  ]
}

في ما يلي مثال على إجراء في نص برمجي لبرنامج Robo ينقر على الموضع الثاني لكلمة "Search" التي تم رصدها على الشاشة باستخدام تقنية التعرّف البصري على الأحرف (OCR):

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Search",
  "matchIndex": 1
}

في ما يلي مثال على إجراء في نص Robo البرمجي ينقر على عنصر في لوحة المفاتيح الافتراضية يتضمّن وصف المحتوى "Emoji button":

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

في ما يلي مثال على إجراء في نص Robo البرمجي ينقر على عناصر عشوائية في لوحة المفاتيح الافتراضية خمس مرات كحد أقصى:

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

إيقاف لوحة المفاتيح الافتراضية

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "DISABLE_KEYBOARD" --

في ما يلي مثال على إجراء في نص Robo البرمجي يوقف لوحة المفاتيح الافتراضية:

{
  "eventType": "DISABLE_KEYBOARD"
}

تنفيذ أمر adb shell

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "ADB_SHELL_COMMAND" --
command أمر واجهة Android Debug Bridge (adb) المطلوب تنفيذه

السمة التالية اختيارية:

  • ‫expectedOutputRegex: الناتج المتوقّع للأمر كتعبير عادي في Java وفي حال عدم تطابُق الناتج، سيتعذّر تنفيذ إجراء نص Robo البرمجي. وتكون القيمة التلقائية هي سلسلة فارغة، ما يعني أنّه لا يتم التحقّق من الناتج.

في ما يلي مثال على إجراء نص Robo برمجي يمحو بيانات مستخدم التطبيق قيد الاختبار:

{
  "eventType": "ADB_SHELL_COMMAND",
  "command": "pm clear __%APP_PACKAGE_NAME%__"
}

منح الأذونات

يتم تسجيل هذا الإجراء من خلال مسجّل نصوص Robo البرمجية في "استوديو Android" للتوافق مع الأنظمة القديمة من خلال مسجّل اختبار Espresso. يمنح اختبار Robo جميع الأذونات للتطبيق قيد الاختبار في بداية كل عملية زحف، وبالتالي، لا يؤدي هذا الإجراء إلى أي نتيجة. لا تستخدم هذا الإجراء في نصوص Robo البرمجية.

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "PERMISSIONS_REQUEST" --

تجاهُل جميع العناصر على الشاشة

يؤدي هذا الإجراء إلى تجاهل Robo لجميع العناصر على أي شاشة تؤدي إلى تشغيل النص البرمجي لـ Robo الذي يحتوي عليها.

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "ALL_ELEMENTS_IGNORED" --

في ما يلي مثال على إجراء نص Robo برمجي يجعل Robo يتجاهل جميع العناصر على الشاشة:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

تجاهُل عنصر

يؤدي هذا الإجراء إلى تجاهل Robo لعنصر (أو عناصر) يتطابق مع elementDescriptors المحدّد.

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "ELEMENT_IGNORED" --
elementDescriptors تحدّد هذه السمة التطبيقات المصغّرة لواجهة المستخدم التي تم تجاهلها باستخدام التسلسل الهرمي لواجهة مستخدم Android.

السمة التالية اختيارية:

  • ‫ignoreChildren: في حال ضبطها على true، يتجاهل Robo أيضًا جميع العناصر التابعة لعناصر واجهة المستخدم التي تم تجاهلها. القيمة التلقائية هي false.

في ما يلي مثال على إجراء نص Robo برمجي يجعل Robo يتجاهل جميع العناصر التي تبدأ أوصاف محتواها بـ "Avatar":

{
  "eventType": "ELEMENT_IGNORED",
  "elementDescriptors": [
    {
      "contentDescriptionRegex": "Avatar.*"
    }
  ]
}

النص الذي تم إدخاله

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
eventType تحدّد نوع إجراء نص Robo البرمجي.
"eventType": "VIEW_TEXT_CHANGED" يُدخل النص المحدّد في التطبيق المصغّر المستهدف في واجهة المستخدم.
"eventType": "ENTER_TEXT" يُدخل النص المحدّد في تطبيق واجهة المستخدم المستهدَف، ثم يرسل حدث KEYCODE_ENTER إلى تطبيق واجهة المستخدم هذا.
elementDescriptors يحدّد هذا الإجراء التطبيق المصغّر المستهدَف لواجهة المستخدم باستخدام التسلسل الهرمي لواجهة مستخدم Android.
replacementText النص المطلوب إدخاله في التطبيق المصغّر المستهدف لواجهة المستخدم

في ما يلي مثال على إجراء في نص برمجي لبرنامج Robo يُدخل "John" في تطبيق مصغّر لواجهة المستخدم يحمل رقم تعريف المورد "com.google.samples.apps.topeka:id/first_name":

{
  "eventType": "VIEW_TEXT_CHANGED",
  "replacementText": "John",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/first_name"
    }
  ]
}

النقر مع الاستمرار

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors يحدّد هذا الإجراء التطبيق المصغّر المستهدَف لواجهة المستخدم باستخدام التسلسل الهرمي لواجهة مستخدم Android. لا يمكن استخدامها مع visionText.
visionText يحدّد العنصر الذي تم النقر عليه مع الاستمرار باستخدام تقنية التعرّف البصري على الأحرف (OCR). لا يمكن استخدامها مع elementDescriptors.
matchIndex تحدّد هذه السمة فهرس تكرار عنصر الاستهداف المطابق، عندما يتم تحديد عنصر الاستهداف باستخدام visionText. إذا كانت القيمة 0، يختار إجراء نص Robo البرمجي أول عنصر مطابق، وإذا كانت القيمة 1، يختار إجراء نص Robo البرمجي ثاني عنصر مطابق، وهكذا. يتم تحديد الترتيب من اليسار إلى اليمين، ومن الأعلى إلى الأسفل. القيمة التلقائية هي 0 (يتم اختيار المطابقة الأولى).

السمة التالية اختيارية:

  • ‫delayTime: يحدّد هذا الإعداد مدة الضغط مع الاستمرار على زر الماوس، بالملي ثانية.

في ما يلي مثال على إجراء نص Robo برمجي ينفّذ نقرة لمدة خمس ثوانٍ على تطبيق مصغّر لواجهة المستخدم يتضمّن وصف المحتوى "Avatar 8":

{
  "eventType": "VIEW_LONG_CLICKED",
  "elementDescriptors": [
    {
      "contentDescription": "Avatar 8"
    }
  ],
  "delayTime": 5000
}

تنفيذ إيماءة بنقطة واحدة

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "ONE_POINT_GESTURE" --
coordinates إحداثيان لإيماءة بنقطة واحدة، بتنسيق "(x1,y1)->(x2,y2)" كنسب مئوية أو وحدات بكسل.

السمة التالية اختيارية:

  • ‫dragAndDrop: إذا تم ضبطها على true، ستؤدي الإيماءة بنقطة واحدة إلى تنفيذ إجراء السحب والإفلات. القيمة التلقائية هي false.

في ما يلي مثال على إجراء إيماءة بنقطة واحدة في نص Robo البرمجي ينفّذ تمرير سريعًا للأسفل:

{
  "eventType": "ONE_POINT_GESTURE",
  "coordinates": "(50%,25%)->(50%,75%)"
}

تنفيذ إيماءة بنقطتَين

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "TWO_POINT_GESTURE" --
coordinates أربعة إحداثيات لإيماءة بنقطتَين، بتنسيق "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" كنسب مئوية أو وحدات بكسل.

في ما يلي مثال على إجراء في نص برمجي لبرنامج Robo ينفّذ إيماءة التكبير:

{
  "eventType": "TWO_POINT_GESTURE",
  "coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}

تنفيذ إجراء IME

يؤدي هذا الإجراء إلى الضغط على زر الإجراء الحالي، مثل "التالي" و"تم" و"بحث"، في "محرر أسلوب الإدخال" (IME) لعنصر واجهة المستخدم المستهدَف المحدّد.

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors يحدّد هذا الإجراء التطبيق المصغّر المستهدَف لواجهة المستخدم باستخدام التسلسل الهرمي لواجهة مستخدم Android.

في ما يلي مثال على إجراء نص برمجي لبرنامج Robo ينفّذ إجراء محرِّر أسلوب الإدخال (IME) على تطبيق مصغّر لواجهة المستخدم باستخدام رقم تعريف المورد "com.google.samples.apps.topeka:id/first_name":

{
  "eventType": "PRESSED_EDITOR_ACTION",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/first_name"
    }
  ]
}

اضغط على زر الرجوع

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
eventType تحدّد نوع إجراء نص Robo البرمجي.
"eventType": "PRESSED_BACK" يتم إرسال حدث KEYCODE_BACK إلى الجهاز.
"eventType": "PRESSED_BACK_EMULATOR_28" يستخدمه مسجِّل نصوص Robo البرمجية في "استوديو Android" للضغط على زر الرجوع في واجهة برمجة التطبيقات 28 للمحاكيات.

في ما يلي مثال على إجراء في نص برمجي لبرنامج Robo يضغط على زر الرجوع:

{
  "eventType": "PRESSED_BACK"
}

الضغط على زر الشاشة الرئيسية

يؤدي هذا الإجراء إلى إرسال حدث KEYCODE_HOME إلى الجهاز.

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "GO_HOME" --

في ما يلي مثال على إجراء في نص برمجي لـ Robo يضغط على زر الشاشة الرئيسية:

{
  "eventType": "GO_HOME"
}

كيفية التمرير للوصول إلى عنصر معيّن

يؤدي هذا الإجراء إلى جعل اختبار Robo يمرّر للأمام التطبيق المصغّر لواجهة المستخدم الذي يتطابق مع elementDescriptors المحدّد إلى أن يظهر التطبيق المصغّر لواجهة المستخدم الذي يتطابق مع childElementDescriptors المحدّد على الشاشة، أو إلى أن يتعذّر تمرير التطبيق المصغّر الذي تم تمريره، أو إلى أن يتم الوصول إلى الحد الأقصى لعدد مرات التمرير وهو 50 مرة.

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors يحدّد هذا الإجراء التطبيق المصغّر لواجهة المستخدم الذي تم الانتقال إليه باستخدام التسلسل الهرمي لواجهة مستخدم Android.
childElementDescriptors يحدّد هذا الإجراء التطبيق المصغّر لواجهة المستخدم الذي سيتم الانتقال إليه باستخدام التسلسل الهرمي لواجهة مستخدم Android.

في ما يلي مثال على إجراء في نص برمجي لـ Robo يؤدي إلى الانتقال في أداة واجهة المستخدم التي تحمل رقم تعريف المورد "my.app.package:id/scrollable_card_container" إلى أن تظهر أداة واجهة المستخدم التي تحمل النص "Orange" على الشاشة (أو إلى أن يتعذّر إجراء المزيد من عمليات الانتقال أو يتم الوصول إلى الحد الأقصى لعدد عمليات الانتقال وهو 50):

{
  "eventType": "ELEMENT_SCROLL_INTO_VIEW",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/scrollable_card_container"
    }
  ],
  "childElementDescriptors": [
    {
      "text": "Orange"
    }
  ]
}

التمرير سريعًا

يعرض الجدول التالي السمات المطلوبة:

السمة الوصف
"eventType": "VIEW_SWIPED" --
swipeDirection تحدّد اتجاه التمرير السريع:
  • Left
  • Right
  • Up
  • Down
  • Forward: إما Down أو Right حسب إمكانية الانتقال للأعلى أو للأسفل أو لليمين أو لليسار في التطبيق المصغّر المستهدف لواجهة المستخدم
  • ‫Backward: إما Up أو Left حسب إمكانية الانتقال عموديًا أو أفقيًا في التطبيق المصغّر المستهدف لواجهة المستخدم
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"
    }
  ]
}

الخطوات التالية