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

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

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

  • استخدم ميزة تسجيل البرنامج النصي Robo. (أندرويد فقط)

  • قم بإنشاء البرنامج النصي Robo يدويًا. (أندرويد وiOS+)

  • قم بتسجيل البرنامج النصي 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"
      }
    ]
  }
]

دعم 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 النصية أو أكثر.

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

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

تقنية وصف
مطابقة جزئية إذا تعذرت مطابقة إجراء البرنامج النصي 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 السياق/الشرط الذي يؤدي إلى هذا الإجراء الشرطي. له نفس البنية ويوفر إمكانات مشابهة مثل [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 بتنفيذ الإجراء المسجل مباشرة على العنصر الفرعي، حيث إنه معروض بالفعل على الشاشة.

ما يلي هو مثال لإجراء النقر على طفل محول ( 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 الخطوات الأولى من خلال الإجراءات المكتوبة مسبقًا ثم يستكشف التطبيق كالمعتاد.

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

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

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

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

التأكيد

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

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

يصف وصف
"eventType": "ASSERTION" --
contextDescriptor يصف السياق أو الشرط المؤكد. لديه نفس البنية ويقدم إمكانات مماثلة مثل contextDescriptor الخاص بالبرنامج النصي Robo .

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

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

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

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

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

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

انقر

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

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

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

  • expectedOutputRegex - الإخراج المتوقع للأمر كتعبير عادي لـ Java. إذا لم يتطابق الإخراج، فسيفشل إجراء البرنامج النصي Robo. بشكل افتراضي، فهي عبارة عن سلسلة فارغة، مما يعني أنه لم يتم التحقق من الإخراج.

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

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

  • 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 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 النسبة المئوية للإحداثيات 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"
    }
  ]
}

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