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

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

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

  • استخدِم ميزة تسجيل نص Robo البرمجي. (نظام التشغيل Android فقط)

  • إنشاء نص Robo البرمجي يدويًا (Android وiOS والإصدارات الأحدث)

  • سجِّل نص Robo البرمجي ثم عدِّله يدويًا. (نظام التشغيل Android فقط)

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

مقدّمة

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

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

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

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

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

توافق +iOS مع نصوص Robo البرمجية

يخضع استخدام Robo لأجهزة iOS+ (الإصدار التجريبي) إلى توافق محدود مع نصوص Robo البرمجية. تتطابق بنية نص Robo البرمجي لأجهزة iOS+ مع بنية Android، وتعمل ميزات iOS+ المتوافقة بشكل مشابه لنظيرتها في Android.

تتوفر الإجراءات التالية في نظام التشغيل iOS+:

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

تتوافق السمات التعريفية التالية في أدوات وصف العناصر في نظام التشغيل iOS+:

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

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

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

البنية

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

السمة الوصف
id رقم صحيح يساعد في تتبُّع نص Robo البرمجي هذا في نتائج الزحف. يتضمّن Robo نصوصًا برمجية مضمّنة في Robo مع id خاصة بها. وعلمًا أنّ استخدام id نفسها في نصوص Robo البرمجية المختلفة لا يؤثّر في سلوكها، إلا أنّه قد يكون من الصعب تمييز الإجراءات عن نصوص Robo البرمجية هذه في نتائج الزحف. ننصحك بتحديد قيمة id فريدة بقيمة 1000 أو قيمة أعلى لنصوص Robo البرمجية لتجنُّب أي تعارضات.
description تشبه السمة id ولكنها أكثر وصفية.
crawlStage يطبِّق Robo مرحلة الزحف على نص 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"
      }
    ]
  }
]

واصف السياق

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

الأولويات

إذا وصل نص 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 من الزحف إلى اختبار التطبيق السفلي.
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 البرمجي الثاني يجعل Robo يتجاهل أدوات واجهة المستخدم التي تتطابق أرقام تعريف مواردها مع Java regex ".*: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 باستخدام التطبيق وإجراء الاختبار وفقًا لذلك.

عند إجراء اختبار Robo مع إرفاق نص برمجي، يختبر Robo الخطوات الأولى من خلال الإجراءات التي تشتمل على نص برمجي، ثم يستكشف التطبيق كالمعتاد.

لإنشاء ملف Robo برمجي بتنسيق JSON في "استوديو Android"، اتّبِع الخطوات الواردة في مقالة تسجيل نص Robo برمجي باستخدام Test Lab في "استوديو Android".

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

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

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

التأكيد

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

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

السمة الوصف
"eventType": "ASSERTION" --
contextDescriptor تصف السياق أو الحالة التي تم تأكيدها. ويحتوي على البنية نفسها ويوفّر إمكانات مماثلة لـ textDescriptor في نص 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.
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 برمجي نقر على "Privacy Policy" تم رصده على شاشة باستخدام تكنولوجيا التعرّف البصري على الأحرف:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

في ما يلي مثال على إجراء نص Robo برمجي ينقر على عنصر لوحة مفاتيح soft مع وصف محتوى "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) Shell لتنفيذه.

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

  • 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.

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

  • 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 إحداثي البكسل س للنقطة التي تم النقر عليها. يمكن استخدامهما بشكل متبادل مع pointTapXPercent وpointTapYPercent.
pointTapYCoordinate إحداثي البكسل Y للنقطة التي تم النقر عليها. يمكن استخدامهما بشكل متبادل مع pointTapXPercent وpointTapYPercent.
pointTapXPercent الإحداثي السيني (س) لنقطة النقر. يمكن استخدامهما بشكل متبادل مع 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"
    }
  ]
}

الخطوات اللاحقة