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

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

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

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

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

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

لمزيد من المعلومات عن استخدام نصوص Robo البرمجية، يُرجى الاطّلاع على المقالة Run a 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 conditions. يمكن استخدامهما حصريًا مع "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 برمجي إلى 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 عندما يحاول روبو العودة (الرجوع) من شاشة معينة، عند يتم استكشاف جميع الإجراءات الممكنة على هذه الشاشة. وفقًا للإعدادات التلقائية، الضغط مرة أخرى، وهو أمر غير مرغوب فيه في بعض السيناريوهات.

إذا لم يتم تحديد السمة crawlStage في نص Robo برمجي، يعني ذلك ضمنًا إلى سيكون crawl.

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

{
  "id": 1000,
  "crawlStage": "pre_crawl",
  "actions": [
    {
      "eventType": "ADB_SHELL_COMMAND",
      "command": "pm clear __%APP_PACKAGE_NAME%__"
    }
  ]
}

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

{
  "id": 1000,
  "crawlStage": "close_screen",
  "maxNumberOfRuns": 999,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/confirmation_dialog"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Cancel"
        }
      ]
    }
  ]
}

الإجراءات الشرطية

يمكن أن يحتوي نص Robo البرمجي على إجراءات شرطية. تحتوي الإجراءات الشرطية على ثلاثة سمات إضافية توضّح كيفية تنفيذ Robo لها:

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

في ما يلي مثال على ملف يتضمّن نص Robo برمجيَين. أول روبو يجعل Robo يتجاهل جميع تطبيقات واجهة المستخدم على شاشة تحتوي على تطبيق مصغّر لواجهة مستخدم يحتوي على معرّف مورد "my.app.package:id/ignored_screen". يقدم نص Robo الثاني الثاني يتجاهل Robo أدوات واجهة المستخدم التي تتطابق أرقام تعريف مواردها مع ".*:id/done" للتعبير العادي في Java على شاشة تحتوي على تطبيق مصغّر لواجهة مستخدم مع رقم تعريف لمصدر "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 تصف السياق أو الحالة التي تم تأكيدها. لديه نفس الهيكل وتوفر إمكانات مماثلة موضِّح نص 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 برمجي يؤدي إلى النقر على عنصر لوحة المفاتيح مع وصف المحتوى "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. يمنح اختبار 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
}

انتظار عنصر

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

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

السمة الوصف
"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"
    }
  ]
}

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