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

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

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

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

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

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

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

مقدمه

اسکریپت Robo برای تست Robo در کنار ورودی های دیگر مانند بسته برنامه تحت آزمایش اندروید (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+ با سینتکس اندروید یکسان است و ویژگی‌های پشتیبانی شده iOS+ مشابه همتایان اندرویدی خود عمل می‌کنند.

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

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

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

  • نام کلاس
  • نام کلاس اجداد
  • توضیحات محتوا (و regex)
  • متن (و regex)

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

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

ساختار

یک اسکریپت Robo دارای چندین ویژگی است که نحوه اجرای Robo را توصیف می کند. اکثر این ویژگی ها با مقادیر پیش فرض از پیش تعریف شده اختیاری هستند:

صفت توضیحات
id یک عدد صحیح که به ردیابی این اسکریپت Robo در خروجی های خزیدن کمک می کند. Robo دارای اسکریپت های Robo داخلی با id خود است. اگرچه id یکسان در اسکریپت‌های Robo مختلف بر رفتار آنها تأثیر نمی‌گذارد، تمایز اقدامات از این اسکریپت‌های Robo در خروجی‌های خزیدن می‌تواند چالش برانگیز باشد. توصیه می کنیم یک id منحصر به فرد 1000 یا بالاتر را برای اسکریپت های Robo خود اختصاص دهید تا از هرگونه تضاد جلوگیری شود.
description شبیه id اما توصیفی تر.
crawlStage مرحله crawl Robo این اسکریپت Robo را در آن اعمال می کند. به طور پیش فرض، مرحله اصلی خزیدن است.
priority اولویت این اسکریپت روبو در مقایسه با سایر اسکریپت های روبو. به طور پیش فرض، همه اسکریپت های 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" بررسی می کند که ویجت UI که با elementDescriptors مطابقت دارد روی صفحه وجود دارد و نمی توان با آن تعامل داشت.
"condition": "element_checked" بررسی می‌کند که ویجت UI که با 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 متن روی صفحه با استفاده از 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" شناسایی شده توسط Optical Character Recognition (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" : "DELAYED_MESSAGE_POSTED",
      "delayTime" : 5000
    }]
}

اقدامات

هر عمل در یک اسکریپت Robo به صورت بسته ای از یک یا چند جفت ویژگی-مقدار نمایش داده می شود که در جدول زیر توضیح داده شده است:

صفت توضیحات
eventType نوع عمل را مشخص می کند، به عنوان مثال، کلیک کردن، ویرایش متن و غیره. برای هر عمل مورد نیاز است.
elementDescriptors توصیفگرهایی که ویجت UI را شناسایی می کنند. برای همه اقداماتی که دارای ویجت رابط کاربری هدف هستند، مانند کلیک کردن روی یک دکمه خاص، لازم است.
optional اگر روی true تنظیم شود، این عمل در صورت عدم انجام آن نادیده گرفته می شود. برای مثال، زمانی که نتواند ویجت رابط کاربری مورد نظر خود را روی صفحه پیدا کند، این عمل نادیده گرفته می‌شود – بدون اینکه اسکریپت Robo حاوی آن خراب شود. به طور پیش فرض، مقدار false است.
replacementText متنی که باید در ویجت UI هدف وارد شود. برای اقدامات ویرایش متن مورد نیاز است.
swipeDirection جهت کشیدن انگشت را مشخص می کند. برای اعمال کشیدن انگشت مورد نیاز است.
delayTime مدت زمان انتظار را در میلی ثانیه مشخص می کند. برای اقدامات انتظار مورد نیاز است.
pointTapXCoordinate و pointTapYCoordinate مختصات پیکسل X و Y نقطه ضربه زده شده. متقابل با pointTapXPercent و pointTapYPercent . برای اعمال ضربه زدن به نقطه مورد نیاز است.
pointTapXPercent و pointTapYPercent درصد مختصات X و Y نقطه ضربه خورده. با pointTapXCoordinate و pointTapYCoordinate به طور متقابل منحصر به فرد. برای اعمال ضربه زدن به نقطه مورد نیاز است.

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

[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "delayTime": 3000
  },
  {
    "eventType": "PRESSED_BACK"
  }
]

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

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

صفت توضیحات
className
ancestorClassName نام کلاس جد سلسله مراتب UI عنصر. اجداد هر یک از گره های والد در سلسله مراتب UI عنصر، از جمله خود عنصر است.
resourceId
resourceIdRegex عبارت منظم جاوا برای مطابقت با resourceId .
contentDescription
contentDescriptionRegex عبارت منظم جاوا برای مطابقت با contentDescription .
text (که روی صفحه ظاهر می شود)
textRegex عبارت منظم جاوا برای مطابقت با text .
groupViewChildPosition ، recyclerViewChildPosition یا adapterViewChildPosition بسته به نوع ویجت والد، موقعیت فرزند ویجت UI را نشان می دهد.

اغلب، این ویژگی ها تعریف نشده هستند، به عنوان مثال، یک دکمه ممکن است متن و توضیحات محتوا نداشته باشد. حتی اگر برخی از مقادیر مشخصه وجود داشته باشد، ممکن است در یک صفحه برنامه خاص (از جمله resourceId ) یکتا نباشند.

به عنوان مثال، تمایز بین آیتم های یک لیست معمولاً تنها با استفاده از موقعیت های فرزند مختلف آنها در ویجت والد آنها امکان پذیر است. این بدان معناست که استفاده از تنها یک عنصر توصیفگر برای شناسایی ویجت UI معمولاً کافی نیست. بنابراین، ویژگی elementDescriptors یک اقدام شامل دنباله‌ای از توصیفگرهای عنصر است که به‌گونه‌ای مرتب شده‌اند که اولی مربوط به ویجت UI هدف، دومی مربوط به ویجت والد ویجت UI هدف، و غیره است. ویجت UI هدف یک عملکرد زمانی مطابقت داده می شود که همه توصیفگرهای عنصر آن با زیر سلسله مراتب ویجت UI مربوطه مطابقت داشته باشند.

در زیر نمونه‌ای از اسکریپت Robo با اعمال تغییر متن و کلیک وجود دارد که هر دوی آنها از شما می‌خواهند ویجت UI هدف را با استفاده از توصیفگرهای عنصر ارائه شده شناسایی کنید:

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "John",
    "elementDescriptors": [
      {
        "className": "android.support.v7.widget.AppCompatEditText",
        "groupViewChildPosition": 0,
        "resourceId": "com.google.samples.apps.topeka:id/first_name"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 0
      },
      {
        "className": "android.support.design.widget.TextInputLayout",
        "groupViewChildPosition": 1
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "className": "android.support.design.widget.FloatingActionButton",
        "groupViewChildPosition": 1,
        "resourceId": "com.google.samples.apps.topeka:id/done"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 1,
        "resourceId": "com.google.samples.apps.topeka:id/content"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 0,
        "resourceId": "com.google.samples.apps.topeka:id/sign_in_content"
      }
    ]
  }
]

گزینه های اجرایی

می‌توانید به‌صورت اختیاری فهرست اقدامات موجود در یک اسکریپت Robo را با یک شی JSON پیشوند کنید که گزینه‌های اجرایی آن اسکریپت Robo را مشخص می‌کند. این هدر پیکربندی با کلمه کلیدی roboscript و به دنبال آن یک نمایش JSON از گزینه های اجرای مورد نظر شروع می شود.

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

  • executionMode - گزینه های اجرا در هنگام اجرا شدن اسکریپت Robo اعمال می شود:
    • strict - اگر روی true تنظیم شود، اسکریپت Robo از تطابق جزئی، پرش از عملکرد فعلی و تعلیق استفاده نمی کند. یعنی اسکریپت Robo به عنوان یک تست ابزار دقیق اجرا می شود و به محض اینکه هیچ یک از اقدامات آن قابل انجام نباشد شکست می خورد. به طور پیش فرض، false است.
    • dismiss_popups - اگر روی true تنظیم شود، تست Robo هرگونه گفتگوی غیرمنتظره را هنگام اجرای اسکریپت Robo حتی در حالت strict رد می کند. این گزینه زمانی که در حالت strict نیست تاثیری ندارد. به طور پیش فرض، false است.
    • notify - اگر روی false تنظیم شود، اسکریپت Robo اعلان های روی صفحه را در ابتدا و انتهای اجرای خود نشان نمی دهد. به طور پیش فرض، true است.
  • postscript - گزینه‌های اجرا پس از تکمیل اسکریپت Robo اعمال می‌شوند:
    • terminate - اگر روی true تنظیم شود، تست Robo خزیدن پس از تکمیل اسکریپت Robo متوقف می شود. به طور پیش فرض، false است.

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

"roboscript": {
  "executionMode": {
    "strict": true,
    "notify": false
  },
  "postscript": {
    "terminate": true
  }
}
[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "delayTime": 3000
  }
]

پارامترهای قالب

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

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

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

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

[
  {
    "eventType": "ADB_SHELL_COMMAND",
    "command": "am force-stop __%APP_PACKAGE_NAME%__"
  }
]

نظرات

یک اسکریپت Robo می تواند حاوی خطوط نظر باشد، که خطوطی هستند که با # یا // شروع می شوند.

نمونه زیر نمونه ای از اسکریپت Robo با چند نظر است:

# Confirm a user account.
[
  {
    // Click the DONE button.
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
]

قابلیت ها

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

تکنیک توضیحات
تطبیق جزئی اگر عمل اسکریپت فعلی Robo نمی تواند به طور کامل مطابقت داشته باشد، معیارهای تطبیق کاهش می یابند و تطابق دوباره امتحان می شود. تطبیق جزئی، بیرونی ترین عنصر را در حین تطبیق ویجت UI هدف یک اقدام اسکریپت 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 است که عملکرد یکسانی را انجام می‌دهند و با شرایط یکسان راه‌اندازی می‌شوند - app-under-test در پیش‌زمینه است:

[
  {
    "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 خزیدن برنامه تحت آزمایش را تمام کرد. مدت زمان یک اسکریپت Robo post_crawl نباید بیش از 15 ثانیه باشد، در غیر این صورت خزیدن ممکن است در یک بازه زمانی پایان یابد.
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 را ارائه می‌دهد

هنگامی که یک اسکریپت 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 برای نادیده گرفتن ویجت‌های UI خاص یا همه ویجت‌های UI در یک صفحه خاص باشد. این دستورالعمل‌ها به‌عنوان نادیده‌گرفتن «اقدامات» با eventType ELEMENT_IGNORED و ALL_ELEMENTS_IGNORED به ترتیب نشان داده می‌شوند.

هر زمان که ویژگی contextDescriptor یک اسکریپت Robo حاوی اقدامات نادیده گرفته شده با یک صفحه نمایش داده شده مطابقت داشته باشد، Robo با هیچ یک از ویجت‌های UI که توسط کنش‌های نادیده گرفته شده آن هدف قرار گرفته‌اند تعامل برقرار نمی‌کند (مگر اینکه یک عمل دیگر Robo اسکریپت باعث می‌شود که Robo اقدامی را روی یکی از ویجت‌های UI نادیده گرفته شده انجام دهد).

یک اسکریپت Robo می‌تواند حاوی ترکیبی از کنش‌های نادیده‌انگیز، مشروط و غیرشرطی باشد. برخلاف سایر اقدامات اسکریپت Robo، اقدامات نادیده گرفته می‌شوند تا زمانی که حاوی contextDescriptor اسکریپت Robo با یک صفحه در طول خزیدن Robo مطابقت داشته باشد، بدون توجه به مقادیر priority و ویژگی‌های maxNumberOfRuns .

در زیر نمونه ای از فایل با دو اسکریپت Robo آورده شده است. اولین اسکریپت Robo باعث می‌شود که Robo همه ویجت‌های رابط کاربری را روی صفحه‌ای که حاوی ویجت رابط کاربری با شناسه منبع "my.app.package:id/ignored_screen" است، نادیده بگیرد. دومین اسکریپت Robo باعث می‌شود که Robo ویجت‌های UI را نادیده بگیرد که شناسه‌های منبع آنها با جاوا regex ".*:id/done" در صفحه‌ای حاوی ویجت UI با شناسه منبع "my.app.package:id/main_screen" دارد:

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

پشتیبانی RecyclerView و AdapterView

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

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

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

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

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

در زیر نمونه‌ای از عملکرد کلیک روی فرزند AdapterView ( android.widget.GridView ) است:

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "className": "com.google.samples.apps.topeka.widget.AvatarView",
      "adapterViewChildPosition": 5,
      "resourceId": "com.google.samples.apps.topeka:id/avatar",
      "contentDescription": "Avatar 6"
    },
    {
      "className": "android.widget.GridView",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/avatars"
    },
    {
      "className": "android.widget.LinearLayout",
      "groupViewChildPosition": 1
    },
    {
      "className": "android.widget.LinearLayout",
      "groupViewChildPosition": 0
    }
  ]
}

نمونه زیر نمونه‌ای از عملکرد کلیک روی یک فرزند RecyclerView ( android.support.v7.widget.RecyclerView ) است:

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "className": "android.support.v7.widget.AppCompatTextView",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/category_title"
    },
    {
      "className": "android.widget.FrameLayout",
      "recyclerViewChildPosition": 8,
      "resourceId": "com.google.samples.apps.topeka:id/category_item"
    },
    {
      "className": "android.support.v7.widget.RecyclerView",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/categories"
    },
    {
      "className": "android.widget.FrameLayout",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/category_container"
    },
    {
      "className": "android.widget.LinearLayout",
      "groupViewChildPosition": 0
    }
  ]
}

یک اسکریپت Robo را در اندروید استودیو ضبط کنید و آن را در 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 زمینه یا شرایط ادعا شده را توصیف می کند. این ساختار مشابهی دارد و قابلیت‌های مشابه ContextDescriptor اسکریپت Robo را ارائه می‌کند.

در زیر نمونه‌ای از ادعای اسکریپت Robo است که بررسی می‌کند که app-under-test در پیش‌زمینه است:

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

{
  "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 دستور پوسته Android Debug Bridge (adb) برای اجرا.

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

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

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

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

مجوزها را اعطا کنید

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

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

صفت توضیحات
"eventType": "PERMISSIONS_REQUEST" --

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

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

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

صفت توضیحات
"eventType": "ALL_ELEMENTS_IGNORED" --

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

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

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

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

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

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

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

  • ignoreChildren - اگر روی true تنظیم شود، Robo همچنین تمام فرزندان ویجت(های) UI نادیده گرفته شده را نادیده می گیرد. به طور پیش فرض، false است.

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

{
  "eventType": "ELEMENT_IGNORED",
  "elementDescriptors": [
    {
      "contentDescriptionRegex": "Avatar.*"
    }
  ]
}

متن ورودی

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

صفت توضیحات
eventType نوع عمل اسکریپت Robo را مشخص می کند.
"eventType": "VIEW_TEXT_CHANGED" متن داده شده را در ویجت UI هدف وارد می کند.
"eventType": "ENTER_TEXT" متن داده شده را در ویجت UI هدف وارد می کند و سپس یک رویداد KEYCODE_ENTER را به این ویجت UI ارسال می کند.
elementDescriptors ویجت UI مورد نظر را با استفاده از سلسله مراتب Android UI شناسایی می کند.
replacementText متنی که باید در ویجت UI هدف وارد شود.

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

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

یک عمل IME را انجام دهید

این عمل دکمه اقدام فعلی، به عنوان مثال، بعدی، انجام شده و جستجو را در ویرایشگر روش ورودی (IME) برای ویجت UI هدف مشخص شده فشار می دهد.

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

صفت توضیحات
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors ویجت UI مورد نظر را با استفاده از سلسله مراتب Android UI شناسایی می کند.

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

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

{
  "eventType": "PRESSED_BACK"
}

صفحه اصلی را فشار دهید

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

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

صفت توضیحات
"eventType": "GO_HOME" --

در زیر نمونه ای از یک اکشن اسکریپت Robo است که صفحه اصلی را فشار می دهد:

{
  "eventType": "GO_HOME"
}

یک عنصر را به نمای پیمایش کنید

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

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

صفت توضیحات
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors ویجت UI پیمایش شده را با استفاده از سلسله مراتب Android UI شناسایی می کند.
childElementDescriptors ویجت UI را برای پیمایش با استفاده از سلسله مراتب رابط کاربری Android شناسایی می کند.

در زیر نمونه‌ای از عملکرد اسکریپت Robo است که ویجت رابط کاربری را با شناسه منبع "my.app.package:id/scrollable_card_container" پیمایش می‌کند تا زمانی که ویجت UI با متن "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 بسته به قابلیت اسکرول عمودی یا افقی ویجت UI هدف.
  • Backward - Up یا Left بسته به قابلیت اسکرول عمودی یا افقی ویجت UI هدف.
elementDescriptors ویجت UI مورد نظر را با استفاده از سلسله مراتب Android UI شناسایی می کند.

در زیر نمونه‌ای از عملکرد اسکریپت 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 ویجت UI مورد نظر را با استفاده از سلسله مراتب Android UI شناسایی می کند.

در زیر نمونه‌ای از اکشن اسکریپت 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"
    }
  ]
}

مراحل بعدی