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

يوفّر هذا المستند معلومات مرجعية عن نصوص 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 برمجي بالترتيب التالي:

  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": "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 ما يلي بالترتيب:

  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" كلما حاول الرجوع (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 في الخطوات التالية:

  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 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 لتحديد اتجاه التمرير السريع:
  • 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": "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"
    }
  ]
}

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