Firebase is back at Google I/O on May 10! Register now

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

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

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

  • استخدم ميزة تسجيل نص Robo.
  • قم بإنشاء نص Robo يدويًا.
  • قم بتسجيل نص Robo النصي ثم قم بتحريره يدويًا.

لمعرفة المزيد حول استخدام نصوص 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 النصي على العديد من السمات التي تصف كيفية تنفيذ Robo له. معظم هذه السمات اختيارية مع القيم الافتراضية المحددة مسبقًا:

يصف وصف
id رقم صحيح يساعد في تتبع نص 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": "element_present" يتحقق من وجود عنصر واجهة مستخدم UI يتطابق مع elementDescriptors أو النص المحدد بواسطة visionText على الشاشة.
"condition": "element_disabled" يتحقق من وجود عنصر واجهة مستخدم UI يتطابق مع elementDescriptors على الشاشة ولا يمكن التفاعل معه.
"condition": "element_checked" التحقق من وجود عنصر واجهة مستخدم UI يتطابق مع elementDescriptors على الشاشة وتم تحديده.
"condition": "app_under_test_shown" للتحقق من تشغيل التطبيق قيد الاختبار في المقدمة.
"condition": "default_launcher_shown" للتحقق من ظهور الشاشة الرئيسية للجهاز ، مما يعني أنه لا توجد تطبيقات قيد التشغيل في المقدمة.
"condition": "non_roboscript_action_performed" للتحقق من أن الإجراء الأخير الذي تم تنفيذه بواسطة اختبار Robo ليس إجراء نصي Robo.
negateCondition إذا تم التعيين على true ، فإن هذا يلغي condition . على سبيل المثال ، يمكنك استخدام هذه السمة للتحقق مما إذا كانت أداة واجهة المستخدم غير موجودة على الشاشة ، أو أن التطبيق قيد الاختبار لا يعمل في المقدمة.
elementDescriptors واحد أو أكثر من واصفات العناصر التي تحدد أداة واجهة المستخدم على الشاشة. يتم استخدامه مع شروط element_present ، element_disabled ، و element_checked . حصري مع visionText . لمزيد من المعلومات ، راجع واصفات العناصر .
visionText يتم الكشف عن النص على الشاشة باستخدام واجهة برمجة تطبيقات التعرف الضوئي على الحروف (OCR). يتم استخدام visionText بالاشتراك مع شرط element_present . حصري مع elementDescriptors .

فيما يلي مثال على برنامج نصي 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 تعبير جافا العادي لمطابقة 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:
  • postscript - يتم تطبيق خيارات التنفيذ بعد اكتمال نص Robo النصي:
    • terminate - في حالة الضبط على true ، يتوقف اختبار Robo عن الزحف بعد اكتمال نص Robo النصي.

فيما يلي مثال على نص برمجي Robo تم تنفيذه في الوضع strict الذي سكون لمدة ثلاث ثوانٍ ، وبعد ذلك يتوقف الزحف:

"roboscript": {
  "executionMode": {
    "strict": true
  },
  "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" عندما يحاول الرجوع (مسار التراجع) من مربع حوار التأكيد:

{
  "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 النصي] (# Context-descriptor).

عند التشغيل ، ينفذ نص 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 يجعل 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 النصي أيضًا مواضع البيانات المطلقة لأطفال AdaptorView الأطفال الذين يمثلون أهدافًا لإجراءات نص Robo مثل adapterViewChildPosition .

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

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

  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 Studio وتشغيله في Test Lab

يمكنك إنشاء نص Robo النصي في Android Studio ، والذي يحفظ البرنامج النصي كملف JSON. يمكنك بعد ذلك تحميل ملف JSON إلى Firebase Test Lab مع التطبيق وتشغيل الاختبار وفقًا لذلك.

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

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

إجراءات نص 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" على الشاشة باستخدام OCR:

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

انقر

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

يصف وصف
eventType يحدد نوع إجراء نص Robo النصي.
"eventType": "VIEW_CLICKED" ينقر على العنصر المستهدف للتطبيق قيد الاختبار.
"eventType": "SOFT_KEYBOARD_CLICK" ينقر على العنصر المستهدف من لوحة المفاتيح الناعمة.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" النقر على عناصر عشوائية من لوحة المفاتيح الناعمة حتى maxNumberOfRuns مرات.
"eventType": "LIST_ITEM_CLICKED" يتم استخدامه بواسطة مسجل البرامج النصية Robo في Android Studio للنقر فوق عناصر القائمة.
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" التي تم اكتشافها على الشاشة باستخدام OCR:

{
  "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 أمر shell Android Debug Bridge (adb) المراد تنفيذه.

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

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

منح الأذونات

يتم تسجيل هذا الإجراء بواسطة مسجل البرامج النصية Robo في Android Studio للتوافق مع الإصدارات السابقة مع 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.

فيما يلي مثال على إجراء نصي 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.

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

  • 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 Studio للضغط مرة أخرى على برامج محاكاة API 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 النسبة المئوية للإحداثيات س للنقطة التي تم استغلالها. حصري متبادل مع pointTapXCoordinate و pointTapYCoordinate .
pointTapYPercent النسبة المئوية للإحداثيات Y للنقطة المستغلة. حصري متبادل مع pointTapXCoordinate و pointTapYCoordinate .

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

{
  "eventType": "POINT_TAP",
  "pointTapXPercent": 50,
  "pointTapYPercent": 50
}

اضغط على نقطة داخل عنصر

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

يصف وصف
"eventType": "POINT_TAP_ELEMENT" -
pointTapXPercent النسبة المئوية للتنسيق س داخل العنصر الهدف.
pointTapYPercent النسبة المئوية للتنسيق ص داخل العنصر الهدف.
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"
    }
  ]
}

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