راهنمای مرجع اسکریپت های Robo

این سند اطلاعات مرجعی در مورد اسکریپت‌های Robo از جمله ساختار، قابلیت‌ها، کاربرد، ضبط و اقدامات ارائه می‌دهد. اسکریپت‌های Robo تست‌هایی هستند که وظایف تضمین کیفیت دستی (QA) را برای برنامه‌های تلفن همراه خودکار می‌کنند و ادغام مداوم (CI) و استراتژی‌های تست پیش از راه‌اندازی را فعال می‌کنند. یک اسکریپت Robo یک فایل JSON است که توالی رابط کاربری (UI) و سایر اقدامات را توصیف می‌کند.

شما می‌توانید یک اسکریپت Robo را به روش‌های زیر ایجاد کنید:

  • از قابلیت ضبط اسکریپت Robo استفاده کنید. (فقط اندروید)

  • اسکریپت Robo را به صورت دستی ایجاد کنید. (اندروید و iOS+)

  • اسکریپت Robo را ضبط کنید و سپس آن را به صورت دستی ویرایش کنید. (فقط اندروید)

برای کسب اطلاعات بیشتر در مورد استفاده از اسکریپت‌های Robo، به بخش اجرای اسکریپت Robo مراجعه کنید.

مقدمه

اسکریپت Robo در کنار سایر ورودی‌ها مانند بسته برنامه اندروید (APK) که تحت آزمایش برنامه است، برای تست Robo ارائه می‌شود.

در زیر مثالی از یک اسکریپت Robo آمده است که کاربر را وارد یک برنامه می‌کند و با اجرای برنامه‌ی تحت آزمایش (app-under-test) فعال می‌شود:

[
  {
    "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+ مشابه سینتکس اندروید است و ویژگی‌های پشتیبانی‌شده iOS+ مشابه همتایان اندروید خود رفتار می‌کنند.

اقدامات زیر در iOS+ پشتیبانی می‌شوند:

  • ادعا
  • کلیک
  • کلیک طولانی
  • کشیدن انگشت
  • نادیده گرفتن همه عناصر
  • صبر کن
  • گرفتن اسکرین شات
  • خزیدن را خاتمه دهید

ویژگی‌های شناسایی زیر در توصیفگرهای عنصر در iOS+ پشتیبانی می‌شوند:

  • نام کلاس
  • نام کلاس اجداد
  • توضیحات محتوا (و عبارت منظم)
  • متن (و عبارت منظم)

شرایط تحریک زیر در توصیفگرهای زمینه در iOS+ پشتیبانی می‌شوند:

  • برنامه تحت آزمایش نشان داده شده است
  • عنصر موجود
  • اقدام اسکریپت غیر روبو انجام شد

ساختار

یک اسکریپت 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" بررسی می‌کند که آیا برنامه‌ی تحت آزمایش (app-under-test) در پیش‌زمینه (foreground) در حال اجرا است یا خیر.
"condition": "default_launcher_shown" بررسی می‌کند که صفحه اصلی دستگاه نمایش داده می‌شود، به این معنی که هیچ برنامه‌ای در پیش‌زمینه در حال اجرا نیست.
"condition": "non_roboscript_action_performed" بررسی می‌کند که آخرین اقدامات متوالی nonRoboscriptActionCount که توسط Robo test انجام شده است، اقدامات اسکریپت Robo نباشند.
negateCondition اگر روی true تنظیم شود، condition منفی می‌کند. برای مثال، می‌توانید از این ویژگی برای بررسی اینکه آیا یک ویجت رابط کاربری روی صفحه وجود ندارد یا خیر، یا اینکه آیا برنامه‌ی تحت آزمایش در پیش‌زمینه اجرا نمی‌شود، استفاده کنید.
elementDescriptors یک یا چند توصیف‌گر عنصر که یک ویجت رابط کاربری را روی صفحه نمایش مشخص می‌کنند. این توصیف‌گر در ترکیب با شرط‌های element_present ، element_disabled و element_checked استفاده می‌شود. با visionText ناسازگار است. برای اطلاعات بیشتر، به توصیف‌گرهای عنصر مراجعه کنید.
visionText متن روی صفحه نمایش با استفاده از API تشخیص نوری کاراکتر (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 آمده است که پس از هر اقدام Robo بدون اسکریپت، 5 ثانیه منتظر می‌ماند:

{
  "contextDescriptor": {
    "condition": "non_roboscript_action_performed"
  },
  "maxNumberOfRuns" : 1000,
  "actions" : [
    {
      "eventType" : "WAIT",
      "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": "WAIT",
    "delayTime": 3000
  },
  {
    "eventType": "PRESSED_BACK"
  }
]

توصیفگرهای عنصر

یک توصیفگر عنصر، یک ویجت رابط کاربری را با استفاده از یک یا چند مورد از ویژگی‌های شناسایی زیر شناسایی می‌کند:

ویژگی توضیحات
className
ancestorClassName نام کلاس جد سلسله مراتب رابط کاربری عنصر. جد، هر یک از گره‌های والد در سلسله مراتب رابط کاربری عنصر، از جمله خود عنصر، است.
resourceId
resourceIdRegex عبارت منظم جاوا برای تطبیق resourceId .
contentDescription
contentDescriptionRegex عبارت منظم جاوا برای مطابقت با 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 است.
    • 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": "WAIT",
    "delayTime": 3000
  }
]

پارامترهای الگو

یک پارامتر قالب، یک جای‌نگهدار در اسکریپت Robo است که هنگام بارگذاری اسکریپت Robo توسط Robo test برای اجرا، با مقدار واقعی جایگزین می‌شود. پارامترهای قالب با یک خط تیره دوتایی و به دنبال آن یک علامت درصد، پیشوند و با یک علامت درصد و به دنبال آن یک خط تیره دوتایی، پسوند می‌شوند.

اسکریپت‌های Robo از پارامترهای الگوی زیر پشتیبانی می‌کنند:

  • __%APP_PACKAGE_NAME%__ - نام بسته‌ی برنامه‌ی تحت آزمایش.

در زیر مثالی از یک اسکریپت Robo آمده است که فرآیند app-under-test را متوقف می‌کند:

[
  {
    "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 test از عملکرد اسکریپت Robo فعلی صرف نظر می‌کند (و هرگز به آن باز نمی‌گردد) و عملکرد بعدی را انجام می‌دهد.

این تکنیک از سناریوهایی پشتیبانی می‌کند که در آن‌ها رفتار برنامه بین نسخه‌ها تغییر می‌کند یا ناپایدار است، برای مثال، زمانی که یک دیالوگ متناوب ممکن است در صفحه‌های مختلف هنگام ضبط در مقابل پخش مجدد یک اسکریپت Robo ظاهر شود.

تعلیق اگر هیچ یک از اقدامات اسکریپت Robo فعلی یا بعدی نتوانند به طور کامل یا جزئی مطابقت داشته باشند، اسکریپت Robo به طور موقت به حالت تعلیق در می‌آید و Robo test با استفاده از استراتژی‌های دیگر خود، عملی را برای اجرا انتخاب می‌کند. پس از اتمام این عمل، Robo test اجرای اسکریپت Robo را از سر می‌گیرد.

تا زمانی که اقدامات اسکریپت Robo فعلی یا بعدی قابل تطبیق نباشند، اسکریپت Robo برای هر تعداد اقدام به حالت تعلیق در می‌آید. بنابراین، اسکریپت‌های Robo لزوماً نیازی به مقدمه‌ای برای تست Robo ندارند و می‌توانید اقدامات اسکریپت Robo را با اقدامات استاندارد تست Robo ترکیب کنید. این تکنیک از سناریوهایی پشتیبانی می‌کند که رفتار برنامه ناپایدار است، یا زمانی که تغییرات بین نسخه‌های برنامه به اندازه‌ای بزرگ است که تست Robo باید "شکاف‌ها" را با اقدامات استاندارد خود پر کند.

اولویت‌ها

اگر یک اسکریپت Robo به maxNumberOfRuns خود برسد، دیگر نمی‌تواند در یک خزش مشخص فعال شود. اگر بیش از یک اسکریپت Robo بتواند توسط زمینه فعلی فعال شود، اولویت با انتخاب اسکریپت Robo به ترتیب زیر است:

  1. دارای یک ویژگی contextDescriptor است.
  2. بالاترین priority دارد (به طور پیش‌فرض، همه اسکریپت‌های Robo priority اجرای یکسانی برابر با 1 دارند).
  3. اگر اولویت‌های اسکریپت‌های Robo یکسان باشد، در ابتدای لیست اسکریپت‌های Robo ظاهر می‌شود.

در زیر مثالی از یک فایل با سه اسکریپت Robo آمده است که عمل یکسانی را انجام می‌دهند و با شرایط یکسانی فعال می‌شوند - app-under-test در پیش‌زمینه قرار دارد:

[
  {
    "id": 1000,
    "description": "Robo script 1",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1001,
    "description": "Robo script 2",
    "priority": "2",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1002,
    "description": "Robo script 3",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  }
]

وقتی برنامه‌ی تحت آزمایش در پیش‌زمینه است، Robo موارد زیر را به ترتیب فعال می‌کند:

  1. "Robo script 2" چون بالاترین اولویت را دارد.
  2. "Robo script 1" زیرا در بین اسکریپت‌های روبوی باقی‌مانده با اولویت یکسان، زودتر ظاهر می‌شود.
  3. "Robo script 3" به عنوان آخرین اسکریپت روبوی قابل اجرا.

دویدن‌های مکرر

به طور پیش‌فرض، 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 خزش برنامه تحت آزمایش را تمام کرد، مدت زمان اسکریپت post_crawl Robo نباید بیش از ۱۵ ثانیه باشد، در غیر این صورت خزش ممکن است با یک وقفه زمانی خاتمه یابد.
crawl مرحله خزش اصلی، زمانی که Robo برنامه تحت آزمایش را خزش می‌کند.
close_screen وقتی Robo سعی می‌کند از یک صفحه مشخص به عقب برگردد (backtrack)، وقتی تمام اقدامات ممکن در این صفحه بررسی شده‌اند. به طور پیش‌فرض، Robo دکمه بازگشت را فشار می‌دهد، که در برخی سناریوها نامطلوب است.

اگر ویژگی crawlStage یک اسکریپت Robo مشخص نشده باشد، به طور ضمنی crawl در نظر گرفته می‌شود.

در زیر مثالی از یک اسکریپت Robo آمده است که داده‌های کاربرِ برنامه‌ی تحت آزمایش را قبل از اینکه Robo شروع به خزیدن در آن کند، پاک می‌کند:

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

مثال زیر یک اسکریپت Robo است که به Robo دستور می‌دهد هر زمان که سعی می‌کند از یک کادر تأیید به عقب برگردد (backtrack)، روی "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 ارائه می‌دهد.

وقتی اسکریپت 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": "WAIT",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "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 ویجت‌های رابط کاربری را که شناسه منابع آنها با regex جاوا ".*:id/done" در صفحه‌ای که حاوی یک ویجت رابط کاربری با شناسه منبع "my.app.package:id/main_screen" است، مطابقت دارد، نادیده بگیرد:

[
  {
    "id": 1000,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/ignored_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ALL_ELEMENTS_IGNORED"
      }
    ]
  },
  {
    "id": 1001,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/main_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ELEMENT_IGNORED",
        "elementDescriptors": [
          {
            "resourceIdRegex": ".*:id/done"
          }
        ]
      }
    ]
  }
]

پشتیبانی از RecyclerView و AdapterView

فرزندان ویجت‌های RecyclerView و AdapterView به صورت پویا بارگذاری می‌شوند و ممکن است با چندین بار کشیدن انگشت از صفحه فعلی به بیرون نمایش داده شوند. از آنجایی که اندازه صفحه نمایش و تعداد کشیدن انگشت‌های لازم برای رسیدن به این فرزند، برای دستگاه‌های مختلف متفاوت است، تکیه بر موقعیت داده‌های فرزند که مطلق است، بسیار قوی‌تر است. تکیه بر تعداد کشیدن انگشت‌های لازم برای آوردن این فرزند به صفحه و سپس استفاده از موقعیت صفحه نمایش آن، رویکردی ضعیف‌تر است.

بنابراین، اسکریپت Robo موقعیت‌های داده مطلق فرزندان RecyclerView را که هدف اقدامات اسکریپت Robo هستند، به عنوان recyclerViewChildPosition ثبت می‌کند. اسکریپت Robo همچنین موقعیت‌های داده مطلق فرزندان AdapterView را که هدف اقدامات اسکریپت Robo هستند، به عنوان adapterViewChildPosition ثبت می‌کند.

اقدامات روی فرزندان RecyclerView و AdapterView در مراحل زیر انجام می‌شود:

  1. تست Robo تضمین می‌کند که فرزند مربوطه از طریق یک عمل موقعیت‌یابی روی RecyclerView یا AdapterView که حاوی آن است، روی صفحه نمایش داده شود.

  2. تست روبو، عمل ضبط‌شده را مستقیماً روی عنصر فرزند انجام می‌دهد، زیرا از قبل روی صفحه نمایش داده شده است.

در زیر مثالی از یک عمل کلیک روی فرزند 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 را در اندروید استودیو ضبط کنید و آن را در Test Lab اجرا کنید

شما می‌توانید یک اسکریپت Robo در اندروید استودیو ایجاد کنید که اسکریپت را به صورت یک فایل JSON ذخیره می‌کند. سپس می‌توانید فایل JSON را به همراه برنامه در Firebase Test Lab آپلود کنید و تست را بر اساس آن اجرا کنید.

وقتی یک تست Robo را با یک اسکریپت متصل اجرا می‌کنید، Robo Test ابتدا اقدامات از پیش نوشته شده شما را انجام می‌دهد و سپس طبق معمول برنامه را بررسی می‌کند.

برای ایجاد یک فایل JSON اسکریپت Robo در اندروید استودیو، مراحل موجود در بخش «ضبط یک اسکریپت Robo با استفاده از Test Lab در اندروید استودیو» را دنبال کنید.

اقدامات اسکریپت روبو

ویژگی اختیاری رایج زیر برای همه اقدامات اعمال می‌شود:

  • description - به ردیابی اجرای این اکشن اسکریپت Robo در خروجی‌های تست Robo کمک می‌کند.

ادعا

اگر شرط ادعا شده درست باشد، اسکریپت Robo به اقدام بعدی ادامه می‌دهد که می‌تواند یک ادعا (assertion) دیگر باشد. در غیر این صورت، اجرای اسکریپت Robo به دلیل یک ادعا (assertion) ناموفق متوقف می‌شود.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"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" با استفاده از 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 در اندروید استودیو برای کلیک کردن روی موارد لیست استفاده می‌شود.
elementDescriptors ویجت رابط کاربری کلیک شده را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند. با visionText ناسازگار است.
visionText عنصر کلیک شده را با استفاده از OCR شناسایی می‌کند. با elementDescriptors منحصر به فرد است.
matchIndex شاخص وقوع عنصر هدف منطبق را مشخص می‌کند، زمانی که عنصر هدف با استفاده از visionText شناسایی می‌شود. اگر 0 باشد، Robo script action اولین عنصر منطبق را انتخاب می‌کند، اگر 1 باشد، Robo script action دومین عنصر منطبق را انتخاب می‌کند و به همین ترتیب ادامه می‌دهد. ترتیب از چپ به راست و از بالا به پایین تعیین می‌شود. مقدار پیش‌فرض 0 است (اولین تطابق انتخاب می‌شود).
maxNumberOfRuns مشخص می‌کند که وقتی eventType برابر با SOFT_KEYBOARD_RANDOM_CLICK باشد، چند بار روی یک عنصر تصادفی از صفحه‌کلید نرم‌افزاری کلیک شود. مقدار پیش‌فرض 1 است.

در ادامه مثالی از یک اکشن اسکریپت Robo آمده است که روی دکمه‌ای با شناسه منبع "com.google.samples.apps.topeka:id/done" کلیک می‌کند:

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/done"
    }
  ]
}

در زیر مثالی از یک اکشن اسکریپت Robo آمده است که با استفاده از OCR روی دومین مورد از کلمه "Search" که در صفحه نمایش شناسایی شده است، کلیک می‌کند:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Search",
  "matchIndex": 1
}

در زیر مثالی از یک اکشن اسکریپت 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) برای اجرا.

ویژگی زیر اختیاری است:

  • expectedOutputRegex - خروجی مورد انتظار دستور به عنوان یک عبارت منظم جاوا. اگر خروجی مطابقت نداشته باشد، عملکرد اسکریپت Robo با شکست مواجه می‌شود. به طور پیش‌فرض، یک رشته خالی است، به این معنی که خروجی بررسی نمی‌شود.

در زیر مثالی از یک اکشن اسکریپت Robo آمده است که داده‌های کاربرِ برنامه‌ی تحت آزمایش را پاک می‌کند:

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

اعطای مجوزها

این اقدام توسط ضبط‌کننده اسکریپت Robo در اندروید استودیو برای سازگاری معکوس با ضبط‌کننده تست Espresso ضبط می‌شود. تست Robo در ابتدای هر خزش، تمام مجوزها را به برنامه تحت آزمایش اعطا می‌کند و بنابراین، این اقدام بی‌اثر است. از این اقدام در اسکریپت‌های Robo خود استفاده نکنید.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "PERMISSIONS_REQUEST" --

نادیده گرفتن تمام عناصر روی صفحه

این عمل باعث می‌شود که Robo تمام عناصر موجود در هر صفحه‌ای که اسکریپت Robo را اجرا می‌کند، نادیده بگیرد.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "ALL_ELEMENTS_IGNORED" --

در زیر مثالی از یک اکشن اسکریپت Robo آمده است که باعث می‌شود Robo تمام عناصر روی صفحه را نادیده بگیرد:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

نادیده گرفتن یک عنصر

این عمل باعث می‌شود Robo عنصر (یا عناصری) را که با elementDescriptors مشخص شده مطابقت دارند، نادیده بگیرد.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "ELEMENT_IGNORED" --
elementDescriptors ویجت(های) رابط کاربری نادیده گرفته شده را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند.

ویژگی زیر اختیاری است:

  • 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 ویجت رابط کاربری هدف را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند.
replacementText متنی که قرار است در ویجت رابط کاربری هدف وارد شود.

در ادامه مثالی از یک اکشن اسکریپت Robo آمده است که "John" را در یک ویجت UI با شناسه منبع "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 ویجت رابط کاربری هدف را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند. با visionText ناسازگار است.
visionText عنصری که مدت زیادی روی آن کلیک شده است را با استفاده از OCR شناسایی می‌کند. با elementDescriptors منحصر به فرد است.
matchIndex شاخص وقوع عنصر هدف منطبق را مشخص می‌کند، زمانی که عنصر هدف با استفاده از visionText شناسایی می‌شود. اگر 0 باشد، Robo script action اولین عنصر منطبق را انتخاب می‌کند، اگر 1 باشد، Robo script action دومین عنصر منطبق را انتخاب می‌کند و به همین ترتیب ادامه می‌دهد. ترتیب از چپ به راست و از بالا به پایین تعیین می‌شود. مقدار پیش‌فرض 0 است (اولین تطابق انتخاب می‌شود).

ویژگی زیر اختیاری است:

  • delayTime - مدت زمان فشار دادن یک کلیک طولانی را بر حسب میلی ثانیه مشخص می‌کند.

در ادامه مثالی از یک اکشن اسکریپت Robo آمده است که یک کلیک پنج ثانیه‌ای روی یک ویجت رابط کاربری با توضیحات محتوا "Avatar 8" انجام می‌دهد:

{
  "eventType": "VIEW_LONG_CLICKED",
  "elementDescriptors": [
    {
      "contentDescription": "Avatar 8"
    }
  ],
  "delayTime": 5000
}

یک حرکت تک نقطه‌ای انجام دهید

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "ONE_POINT_GESTURE" --
coordinates دو مختصات برای یک حرکت تک نقطه‌ای، که به صورت "(x1,y1) -> (x2,y2)" به صورت درصد یا پیکسل قالب‌بندی شده است.

ویژگی زیر اختیاری است:

  • dragAndDrop - اگر روی true تنظیم شود، حرکت تک‌نقطه‌ای عمل کشیدن و رها کردن را انجام می‌دهد. به طور پیش‌فرض، مقدار آن false است.

در زیر مثالی از یک اکشن ژست تک‌نقطه‌ای اسکریپت Robo آمده است که یک سوایپ به پایین انجام می‌دهد:

{
  "eventType": "ONE_POINT_GESTURE",
  "coordinates": "(50%,25%)->(50%,75%)"
}

یک حرکت دو نقطه‌ای انجام دهید

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "TWO_POINT_GESTURE" --
coordinates چهار مختصات برای یک اشاره دو نقطه‌ای، که به صورت "(x1,y1)->(x2,y2)،(x3,y3)->(x4,y4)" به صورت درصد یا پیکسل قالب‌بندی شده‌اند.

در زیر مثالی از یک اکشن اسکریپت Robo آمده است که ژست pinch out را اجرا می‌کند:

{
  "eventType": "TWO_POINT_GESTURE",
  "coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}

انجام یک اقدام IME

این اکشن دکمه اکشن فعلی، مثلاً next، done و search، را در ویرایشگر روش ورودی (IME) برای ویجت رابط کاربری هدف مشخص شده فشار می‌دهد.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors ویجت رابط کاربری هدف را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند.

در ادامه مثالی از یک اکشن اسکریپت Robo آمده است که یک اکشن IME را روی یک ویجت UI با شناسه منبع "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 در اندروید استودیو برای فشار دادن به شبیه‌سازها در API 28 استفاده می‌شود.

مثال زیر یک اکشن اسکریپت Robo است که به عقب فشار می‌دهد:

{
  "eventType": "PRESSED_BACK"
}

خانه را فشار دهید

این عمل یک رویداد KEYCODE_HOME را به دستگاه ارسال می‌کند.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "GO_HOME" --

در زیر مثالی از یک اکشن اسکریپت Robo آمده است که به سرعت اجرا می‌شود:

{
  "eventType": "GO_HOME"
}

اسکرول کردن یک عنصر به داخل نما

این اقدام باعث می‌شود Robo ویجت UI که با elementDescriptors مشخص شده مطابقت دارد را به جلو پیمایش کند تا زمانی که ویجت UI که با childElementDescriptors مشخص شده مطابقت دارد روی صفحه نمایش داده شود، یا ویجت پیمایش شده دیگر قابل پیمایش نباشد، یا حداکثر تعداد پیمایش 50 برسد.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors ویجت رابط کاربری اسکرول شده را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند.
childElementDescriptors با استفاده از سلسله مراتب رابط کاربری اندروید، ویجت رابط کاربری را که باید به آن پیمایش شود، شناسایی می‌کند.

در ادامه مثالی از یک اکشن اسکریپت Robo آمده است که ویجت رابط کاربری با شناسه منبع "my.app.package:id/scrollable_card_container" تا زمانی که ویجت رابط کاربری با متن "Orange" روی صفحه نمایش داده شود (یا دیگر نتوان پیمایش انجام داد، یا به حداکثر تعداد پیمایش ۵۰ رسید) پیمایش می‌کند:

{
  "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 ویجت رابط کاربری هدف را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند.

در ادامه مثالی از یک اکشن اسکریپت Robo آمده است که یک ویجت رابط کاربری با شناسه منبع "my.app.package:id/custom_content" را به بالا می‌کشد:

{
  "eventType": "VIEW_SWIPED",
  "swipeDirection": "Up",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/custom_content"
    }
  ]
}

گرفتن اسکرین شات

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "TAKE_SCREENSHOT" --
screenshotName نام فایل اسکرین‌شات را مشخص می‌کند.

در زیر مثالی از یک اکشن اسکریپت Robo که از صفحه عکس می‌گیرد، آمده است:

{
  "eventType": "TAKE_SCREENSHOT",
  "screenshotName": "my_screenshot"
}

روی یک نقطه روی صفحه ضربه بزنید

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "POINT_TAP" --
pointTapXCoordinate مختصات نقطه ضربه زده شده در پیکسل X. با pointTapXPercent و pointTapYPercent ناسازگار است.
pointTapYCoordinate مختصات Y پیکسلی نقطه ضربه زده شده. با pointTapXPercent و pointTapYPercent ناسازگار است.
pointTapXPercent درصد مختصات X از نقطه ضربه زده شده. با pointTapXCoordinate و pointTapYCoordinate ناسازگار است.
pointTapYPercent درصد مختصات Y نقطه ضربه زده شده. با pointTapXCoordinate و pointTapYCoordinate ناسازگار است.

در زیر مثالی از یک اکشن اسکریپت Robo که در وسط صفحه نمایش ضربه می‌زند، آمده است:

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

روی یک نقطه درون یک عنصر ضربه بزنید

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent درصد مختصات X درون عنصر هدف.
pointTapYPercent درصد مختصات Y در عنصر هدف.
elementDescriptors ویجت رابط کاربری هدف را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند.

در زیر مثالی از یک اکشن اسکریپت Robo آمده است که اسلایدر یک seekbar را به سمت راست حرکت می‌دهد:

{
  "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": "WAIT" (or "DELAYED_MESSAGE_POSTED") --
delayTime مدت زمان انتظار را بر حسب میلی ثانیه مشخص می‌کند.

در زیر مثالی از یک اکشن اسکریپت Robo آمده است که سه ثانیه منتظر می‌ماند:

{
  "eventType": "WAIT",
  "delayTime": 3000
}

منتظر یک عنصر باشید

این عمل باعث می‌شود که Robo test تا زمان مشخص شده منتظر بماند تا یک عنصر روی صفحه نمایش داده شود.

جدول زیر ویژگی‌های مورد نیاز را فهرست می‌کند:

ویژگی توضیحات
"eventType": "WAIT_FOR_ELEMENT" --
delayTime مدت زمان انتظار را بر حسب میلی ثانیه مشخص می‌کند.
elementDescriptors ویجت رابط کاربریِ منتظرِ اجرا را با استفاده از سلسله مراتب رابط کاربری اندروید شناسایی می‌کند.

در ادامه مثالی از یک اکشن اسکریپت Robo آمده است که تا 30 ثانیه منتظر می‌ماند تا یک ویجت رابط کاربری با شناسه منبع "my.app.package:id/confirmation_button" روی صفحه ظاهر شود:

{
  "eventType": "WAIT_FOR_ELEMENT",
  "delayTime": 30000,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/confirmation_button"
    }
  ]
}

مراحل بعدی