الدليل المرجعي لنصوص 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 والإصدارات الأحدث المتوافقة مع ملف برمجة التطبيقات بالطريقة نفسها التي تعمل بها نظيراتها في 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 برمجي مرة واحدة تلقائيًا.
contextDescriptor يصف السياق أو الشرط الذي يؤدي إلى تشغيل نص Robo البرمجي هذا. في حال حذف هذا الشرط، يتم اعتبار أنّ شرط التفعيل في نص Robo هذا يتم استيفاؤه دائمًا، بعبارة أخرى، يكون نص Robo غير مشروط.
actions جميع إجراءات نص Robo هذا

يحتوي ملف واحد على مجموعة من نصّ Roboscript واحد أو أكثر.

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

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

وصف السياق

يحدِّد وصف السياق السياق أو الشرط الذي يشغِّل Robo script باستخدام سمة واحدة أو مجموعة من السمات:

السمة الوصف
"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، يتم تخطّي هذا الإجراء عندما يتعذّر تنفيذه. على سبيل المثال، يتم تخطّي هذا الإجراء عندما يتعذّر عليه العثور على ملف برمجي مصغّر لواجهة المستخدم المستهدف على الشاشة، بدون إيقاف ملف برمجي روبوت يحتوي عليه. تكون القيمة التلقائية هي 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 يحدّد خيارات التنفيذ لهذا النص البرمجي. يبدأ عنوان الإعدادات هذا بالكلمة الرئيسية 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 script التقنيات التالية لزيادة الثبات:

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

إذا نجحت المطابقة الجزئية، يتم تنفيذ إجراء نص Robo البرمجي المرتبط بها كالمعتاد. تتيح هذه التقنية سيناريوهات تغيُّر فيها هيكل التطبيق، على سبيل المثال، بين إصدارات التطبيق، عند إعادة ترتيب عناصر الشاشة.

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

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

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

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

الأولويات

إذا وصل نص Robo إلى maxNumberOfRuns، لن يعود بالإمكان تشغيله في عملية زحف معيّنة. إذا كان بإمكان السياق الحالي بدء تنفيذ أكثر من نص Roboscript واحد، يتم منح الأولوية من خلال اختيار نص Roboscript بالترتيب التالي:

  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 نص Roboscript مرة واحدة فقط كحد أقصى أثناء الزحف. ويمكن تعديل ذلك من خلال السمة 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 من الزحف إلى التطبيق قيد الاختبار يجب ألا تتجاوز مدّة post_crawl Robo script 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" كلما حاول الرجوع (التراجع) من مربّع حوار confirmation:

{
  "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 البرمجي الإجراء غير الشَرطي التالي. لكي يكون ملف Roboscript صالحًا، يجب أن يحتوي على إجراء واحد غير مشروط على الأقل.

في ما يلي مثال على نص 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 جميع التطبيقات المصغّرة لواجهة المستخدم على شاشة تحتوي على تطبيق مصغّر لواجهة المستخدم مع معرّف مورد "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".

إجراءات النصوص البرمجية للروبوت

تنطبق السمة الاختيارية الشائعة التالية على جميع الإجراءات:

  • description - يساعد في تتبُّع تنفيذ إجراء نص Robo البرمجي هذا في نتائج اختبار Robo.

التأكيد

إذا كان الشرط الذي تم تأكيده صحيحًا، ينتقل نص Robo البرمجي إلى الخطوة التالية، والتي قد تكون عبارة عن تأكيد آخر. بخلاف ذلك، يتم إيقاف تنفيذ ملف Robo script بسبب تعذُّر إجراء التأكيد.

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

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

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

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

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

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

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

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

النقر

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

السمة الوصف
eventType تُحدِّد نوع إجراء نص Robo.
"eventType": "VIEW_CLICKED" النقر على العنصر المستهدَف للتطبيق قيد الاختبار
"eventType": "SOFT_KEYBOARD_CLICK" النقر على العنصر المستهدَف في لوحة المفاتيح المتوفّرة على الشاشة
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" النقر على عناصر عشوائية من لوحة المفاتيح إلى maxNumberOfRuns مرة
"eventType": "LIST_ITEM_CLICKED" يستخدمه مُسجِّل النصوص البرمجية في Robo في "استوديو Android" للنقر على عناصر القائمة.
elementDescriptors لتحديد التطبيق المصغّر لواجهة المستخدم الذي تم النقر عليه باستخدام التسلسل الهرمي لواجهة مستخدم Android متعارض مع visionText.
visionText تُحدِّد العنصر الذي تم النقر عليه باستخدام تقنية التعرّف البصري على الحروف. متعارض مع elementDescriptors.
matchIndex تُحدِّد فهرس موضع العنصر المستهدَف المطابق، عندما يتم تحديد العنصر المستهدَف باستخدام visionText. إذا كان الرمز هو 0، سيختار إجراء نص 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 برمجي يُزيل data المستخدم للتطبيق الذي يخضع للاختبار:

{
  "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"
    }
  ]
}

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