راهنمای مرجع اسکریپت های 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 .
maxNumberOfRuns زمانی که eventType SOFT_KEYBOARD_RANDOM_CLICK است، مشخص می‌کند که چند بار روی یک عنصر تصادفی از صفحه‌کلید نرم کلیک شود. مقدار پیش فرض 1 است.

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

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

در زیر نمونه‌ای از عملکرد اسکریپت Robo است که روی "Privacy Policy" که روی صفحه با استفاده از OCR شناسایی شده کلیک می‌کند:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

در زیر نمونه‌ای از عملکرد اسکریپت Robo است که روی یک عنصر صفحه‌کلید نرم با توضیح محتوا "Emoji button" کلیک می‌کند:

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

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

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

غیرفعال کردن صفحه کلید نرم

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

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

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

{
  "eventType": "DISABLE_KEYBOARD"
}

دستور adb shell را اجرا کنید

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

صفت توضیحات
"eventType": "ADB_SHELL_COMMAND" --
command دستور پوسته 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 .

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

  • 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"
    }
  ]
}

مراحل بعدی

،

این سند اطلاعات مرجعی درباره اسکریپت های 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 مرحله Robo Crawl این فیلمنامه Robo را در آن اعمال می کند. به طور پیش فرض ، این مرحله اصلی خزیدن است.
priority اولویت این فیلمنامه Robo در مقایسه با سایر اسکریپت های Robo. به طور پیش فرض ، تمام اسکریپت های Robo اولویت 1 دارند.
maxNumberOfRuns مشخص می کند که چند بار در طول یک Robo Crawl می تواند این اسکریپت 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" بررسی می کند که ویجت UI که مطابق با elementDescriptors یا متن مشخص شده توسط visionText باشد ، روی صفحه نمایش وجود دارد.
"condition": "element_disabled" بررسی می کند که ویجت UI که با elementDescriptors مطابقت دارد روی صفحه نمایش وجود دارد و نمی تواند با آن تعامل یابد.
"condition": "element_checked" بررسی می کند که یک ویجت UI که با elementDescriptors مطابقت دارد روی صفحه وجود دارد و بررسی می شود.
"condition": "app_under_test_shown" بررسی می کند که برنامه زیرنویس در پیش زمینه اجرا می شود.
"condition": "default_launcher_shown" بررسی می کند که صفحه اصلی دستگاه نشان داده شده است ، به این معنی که هیچ برنامه ای در پیش زمینه اجرا نمی شود.
"condition": "non_roboscript_action_performed" بررسی می کند که آخرین اقدامات غیرقانونی nonRoboscriptActionCount که توسط Robo Test انجام شده است ، اقدامات Robo Script نیست.
negateCondition اگر true تنظیم شود ، condition را نفی می کند. به عنوان مثال ، شما می توانید از این ویژگی استفاده کنید تا بررسی کنید که ویجت UI روی صفحه نمایش موجود نیست یا اینکه برنامه زیرنویس در پیش زمینه اجرا نمی شود.
elementDescriptors یک یا چند توصیف کننده عنصر که یک ویجت UI را روی صفحه شناسایی می کنند. از آن در ترکیب با شرایط element_present ، element_disabled و element_checked استفاده می شود. متقابل با visionText . برای اطلاعات بیشتر ، به توصیف کننده های عنصر مراجعه کنید.
visionText متن روی صفحه با استفاده از API تشخیص شخصیت نوری (OCR) تشخیص داده می شود. visionText در ترکیب با شرایط element_present استفاده می شود. متقابل با elementDescriptors .
nonRoboscriptActionCount تعداد اقدامات پیاپی اسکریپت غیر رابو که قبلاً انجام شده است. از آن در ترکیب با شرایط non_roboscript_action_performed استفاده می شود تا یک اسکریپت Robo را پس از هر اقدامات nonRoboscriptActionCount Robo ایجاد کند. به طور پیش فرض ، 1 است.

در زیر نمونه ای از اسکریپت Robo است که توسط یک ویجت UI با شناسه منبع "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 ثانیه منتظر است:

{
  "contextDescriptor": {
    "condition": "non_roboscript_action_performed"
  },
  "maxNumberOfRuns" : 1000,
  "actions" : [
    {
      "eventType" : "DELAYED_MESSAGE_POSTED",
      "delayTime" : 5000
    }]
}

اقدامات

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

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

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

[
  {
    "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 معمولاً کافی نیست. بنابراین ، یک ویژگی Action 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 Script از تطبیق جزئی ، پرش از اقدامات فعلی و تعلیق استفاده نمی کند. یعنی اسکریپت Robo به عنوان یک تست ابزار دقیق اجرا می شود و به محض انجام هر یک از اقدامات آن انجام نمی شود. به طور پیش فرض ، false است.
    • dismiss_popups - اگر در true تنظیم شده باشد ، آزمون Robo هنگام انجام اسکریپت Robo حتی در حالت strict ، هرگونه گفتگوی غیر منتظره را رد می کند. این گزینه در حالت strict هیچ تاثیری ندارد. به طور پیش فرض ، false است.
    • notify - در صورت تنظیم false ، Robo Script در آغاز و پایان اجرای آن اعلان های روی صفحه را نشان نمی دهد. به طور پیش فرض ، 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 که Script 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 Script به طور کامل مطابقت نداشته باشد ، معیارهای تطبیق آرامش یافته و تطبیق مجدد است. تطبیق جزئی ضمن مطابقت با ویجت UI هدف یک عمل اسکریپت Robo ، بیرونی ترین توصیف کننده عنصر را در نظر نمی گیرد.

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

از عمل فعلی پرش کنید اگر عملکرد فعلی اسکریپت Robo به طور کامل یا جزئی مطابقت نداشته باشد ، Robo سعی می کند با عملکرد بعدی Robo Script مطابقت داشته باشد. اگر عمل بعدی به طور کامل یا جزئی مطابقت داشته باشد ، تست 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 خزیدن برنامه زیر آزمون را تمام کرد. یک اسکریپت Robo post_crawl نباید بیش از 15 ثانیه طول بکشد وگرنه خزیدن ممکن است در یک زمان خاتمه یابد.
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 دستور می دهد هر زمان که سعی در بازگشت (برگشت به عقب) از یک گفتگوی تأیید دارد ، روی "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 Script 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 که با اقدامات نادیده گرفته آن هدف قرار می گیرد ، تعامل ندارد (مگر اینکه برخی از اقدامات Script Robo دیگر باعث شود Robo یک عمل را بر روی یکی از ابزارک های UI نادیده گرفته شود).

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

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

[
  {
    "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 پشتیبانی

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

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

اقدامات مربوط به کودکان بازیافت و آداپتور در مراحل زیر انجام می شود:

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

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

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

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

در زیر نمونه ای از اقدام کلیک در یک RecyClerview ( android.support.v7.widget.RecyclerView ) کودک:

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

یک اسکریپت Robo را در Android Studio ضبط کنید و آن را در Test Lab اجرا کنید

می توانید یک اسکریپت Robo را در Android Studio ایجاد کنید که اسکریپت را به عنوان یک فایل JSON ذخیره می کند. سپس می توانید پرونده JSON را در Firebase Test Lab با برنامه بارگذاری کرده و بر این اساس تست را اجرا کنید.

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

برای ایجاد یک فایل JSON Script Robo در Android Studio ، مراحل ضبط یک اسکریپت Robo را با استفاده از Test Lab در Android Studio دنبال کنید.

اقدامات اسکریپت Robo

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

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

ادعا

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

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

صفت توضیحات
"eventType": "ASSERTION" --
contextDescriptor زمینه یا شرایط ادعا شده را توصیف می کند. این ساختار یکسان است و قابلیت های مشابهی را ارائه می دهد به عنوان ContextDescriptor Script Robo .

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

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

در زیر نمونه ای از ادعای اسکریپت Robo است که بررسی می کند که یک ویجت UI با شناسه منبع "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 برای کلیک روی موارد لیست.
elementDescriptors ویجت UI کلیک شده را با استفاده از سلسله مراتب Android UI مشخص می کند. متقابل با 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" که بر روی صفحه نمایش با استفاده از OCR کشف شده است ، کلیک می کند:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

در زیر نمونه ای از یک عمل اسکریپت Robo است که با یک عنصر صفحه کلید نرم با توضیحات محتوا "Emoji button" کلیک می کند:

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

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

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

صفحه کلید نرم را غیرفعال کنید

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

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

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

{
  "eventType": "DISABLE_KEYBOARD"
}

دستور ADB Shell را اجرا کنید

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

صفت توضیحات
"eventType": "ADB_SHELL_COMMAND" --
command فرمان پوسته Android Debug Bridge (ADB) برای اجرای.

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

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

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

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

اعطای مجوزها

این عمل توسط ضبط کننده اسکریپت Robo در Android Studio برای سازگاری به عقب با ضبط تست اسپرسو ثبت شده است. تست 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 Target وارد می کند و سپس یک رویداد KEYCODE_ENTER را به این ویجت UI ارسال می کند.
elementDescriptors ویجت UI هدف را با استفاده از سلسله مراتب Android UI مشخص می کند.
replacementText متن برای ورود به ویجت UI هدف.

در زیر نمونه ای از یک عمل اسکریپت 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 ویجت UI هدف را با استفاده از سلسله مراتب Android UI مشخص می کند. متقابل با visionText .
visionText عنصر کلیک طولانی را با استفاده از OCR مشخص می کند. متقابل با elementDescriptors .

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

  • delayTime - مشخص می کند که فشار یک کلیک طولانی در میلی ثانیه چه مدت طول می کشد.

در زیر نمونه ای از یک عمل اسکریپت Robo است که یک کلیک پنج ثانیه ای بر روی ویجت UI با توضیحات محتوا "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 Script است که یک ضربه تند وشدید زدن را به پایین انجام می دهد:

{
  "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 را بر روی ویجت 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"
}

یک عنصر را به نمای بزنید

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

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

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

در زیر نمونه ای از یک عمل اسکریپت Robo است که ویجت UI را با شناسه منبع "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 - بسته به پیمایش عمودی یا افقی ویجت UI هدف ، یا Down یا Right .
  • Backward - بسته به پیمایش عمودی یا افقی ویجت UI هدف ، یا Up یا Left .
elementDescriptors ویجت UI هدف را با استفاده از سلسله مراتب Android UI مشخص می کند.

در زیر نمونه ای از یک عمل اسکریپت Robo است که ویجت UI را با شناسه منبع "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 است که کشویی 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": "DELAYED_MESSAGE_POSTED" --
delayTime مشخص می کند که چه مدت صبر کنید ، در میلی ثانیه.

در زیر نمونه ای از یک عمل اسکریپت Robo است که سه ثانیه منتظر است:

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

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

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

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

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

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

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

مراحل بعدی

،

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

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

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

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

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

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

مقدمه

Script Robo در کنار سایر ورودی ها مانند بسته برنامه Android Android (APK) به تست Robo ارائه شده است.

در زیر نمونه ای از یک اسکریپت 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+ (BETA) پشتیبانی محدودی برای اسکریپت های Robo دارد. نحو اسکریپت Robo برای iOS+ با نحو Android یکسان است و از ویژگی های iOS+ پشتیبانی می کند که به طور مشابه با همتایان اندرویدی خود رفتار می کند.

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

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

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

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

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

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

ساختار

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

صفت توضیحات
id یک عدد صحیح که به ردیابی این اسکریپت Robo در خروجی های خزنده کمک می کند. Robo دارای اسکریپت های Robo با id خود است. اگرچه همان id در اسکریپت های مختلف Robo بر رفتار آنها تأثیر نمی گذارد ، اما تمایز این اسکریپت های Robo در خروجی های خزنده می تواند چالش برانگیز باشد. توصیه می کنیم برای جلوگیری از هرگونه درگیری ، یک id منحصر به فرد از 1000 یا بالاتر را برای اسکریپت های Robo خود اختصاص دهید.
description مشابه id اما توصیفی تر.
crawlStage مرحله Robo Crawl این فیلمنامه Robo را در آن اعمال می کند. به طور پیش فرض ، این مرحله اصلی خزیدن است.
priority اولویت این فیلمنامه Robo در مقایسه با سایر اسکریپت های Robo. به طور پیش فرض ، تمام اسکریپت های Robo اولویت 1 دارند.
maxNumberOfRuns مشخص می کند که چند بار در طول یک Robo Crawl می تواند این اسکریپت 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" بررسی می کند که ویجت UI که مطابق با elementDescriptors یا متن مشخص شده توسط visionText باشد ، روی صفحه نمایش وجود دارد.
"condition": "element_disabled" بررسی می کند که ویجت UI که با elementDescriptors مطابقت دارد روی صفحه نمایش وجود دارد و نمی تواند با آن تعامل یابد.
"condition": "element_checked" بررسی می کند که یک ویجت UI که با elementDescriptors مطابقت دارد روی صفحه وجود دارد و بررسی می شود.
"condition": "app_under_test_shown" Checks that the app-under-test is running in the foreground.
"condition": "default_launcher_shown" Checks that a device's home screen is shown, which means that no apps are running in the foreground.
"condition": "non_roboscript_action_performed" Checks that the last nonRoboscriptActionCount consecutive actions performed by Robo test are not Robo script actions.
negateCondition If set to true , negates the condition . For example, you can use this attribute to check if a UI widget is NOT present on the screen, or that the app-under-test is NOT running in the foreground.
elementDescriptors One or more element descriptors that identify a UI widget on the screen. It is used in combination with the element_present , element_disabled , and element_checked conditions. Mutually exclusive with visionText . For more information, see Element descriptors .
visionText Text on the screen is detected using the Optical Character Recognition (OCR) API. visionText is used in combination with the element_present condition. Mutually exclusive with elementDescriptors .
nonRoboscriptActionCount The number of consecutive non-Robo script actions performed prior. It is used in combination with the non_roboscript_action_performed condition to trigger a Robo script after every nonRoboscriptActionCount Robo actions. By default, it is 1 .

The following is an example of a Robo script that is triggered by a UI widget with a resource ID "my.app.package:id/page_header" being present on the screen:

{
  "id": 1000,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/page_header"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Settings"
        }
      ]
    }
  ]
}

The following is an example of a Robo script that is triggered by "Privacy Policy" detected by 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"
    }
  ]
}

The following is an example of a Robo script that waits for 5 seconds after every non-script Robo action:

{
  "contextDescriptor": {
    "condition": "non_roboscript_action_performed"
  },
  "maxNumberOfRuns" : 1000,
  "actions" : [
    {
      "eventType" : "DELAYED_MESSAGE_POSTED",
      "delayTime" : 5000
    }]
}

اقدامات

Each action in a Robo script is represented as a bundle of one or more attribute-value pairs, which are described in the following table:

صفت توضیحات
eventType Specifies the type of the action, for example, click, text edit, etc. Required for every action.
elementDescriptors Descriptors that identify a UI widget. Required for all actions that have a target UI widget, like clicking a particular button.
optional If set to true , this action is skipped when it cannot be performed. For example, this action is skipped when it can't find its target UI widget on a screen– without failing the containing Robo script. By default, the value is false .
replacementText The text to input into the target UI widget. Required for text editing actions.
swipeDirection Specifies the direction of the swipe. Required for swipe actions.
delayTime Specifies how long to wait, in milliseconds. Required for wait actions.
pointTapXCoordinate and pointTapYCoordinate The pixel X and Y coordinates of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent . Required for point tap actions.
pointTapXPercent and pointTapYPercent The percentage X and Y coordinates of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate . Required for point tap actions.

The following is an example of a Robo script with two actions without target UI widgets, which means that these actions don't operate on a specific UI widget:

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

Element descriptors

An element descriptor identifies a UI widget using one or more of the following identifying attributes:

صفت توضیحات
className
ancestorClassName Class name of the element's UI hierarchy ancestor. An ancestor is any of the parent nodes in the element's UI hierarchy, including the element itself.
resourceId
resourceIdRegex Java regular expression to match resourceId .
contentDescription
contentDescriptionRegex Java regular expression to match contentDescription .
text (that appears on the screen)
textRegex Java regular expression to match text .
groupViewChildPosition , recyclerViewChildPosition , or adapterViewChildPosition Represents a UI widget's child position depending on the kind of its parent widget.

Frequently, these attributes are undefined, for example, a button might not have text and content description. Even if some attribute values are present, they might not be unique on a given app screen (including resourceId ).

For example, differentiating between items of a list is commonly possible only by using their different child positions within their parent widget. This means that using just one element descriptor to identify a UI widget is usually insufficient. Therefore, an action's elementDescriptors attribute contains a sequence of element descriptors that are ordered such that the first one corresponds to the target UI widget, the second one corresponds to the target UI widget's parent widget, and so on. An action's target UI widget is matched when all of its element descriptors match the corresponding UI widget sub-hierarchy.

The following is an example of a Robo script with a text change and click actions, both of which require you to identify the target UI widget using the provided element descriptors:

[
  {
    "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"
      }
    ]
  }
]

Execution options

You can optionally prefix the list of actions in a Robo script with a JSON object that specifies the execution options for that Robo script. This configuration header starts with the roboscript keyword followed by a JSON representation of the desired execution options.

Robo scripts support the following execution options:

  • executionMode - execution options applied when a Robo script is running:
    • strict - if set to true , Robo script does not employ partial matching, skipping current action, and suspension . That is, the Robo script is executed as a regular instrumentation test and fails as soon as any of its actions cannot be performed. By default, it is false .
    • dismiss_popups - if set to true , Robo test dismisses any unexpected dialogs while performing the Robo script even in strict mode. This option has no effect when not in strict mode. By default, it is false .
    • notify - if set to false , Robo script does not show on-screen notifications at the beginning and end of its execution. By default, it is true .
  • postscript - execution options applied after a Robo script is completed:
    • terminate - if set to true , Robo test stops crawling after the Robo script is completed. By default, it is false .

The following is an example of a Robo script executed in strict mode without on-screen notifications that sleeps for three seconds, after which the crawl stops:

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

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

A template parameter is a placeholder in a Robo script that is replaced with the actual value when Robo test loads that Robo script for execution. Template parameters are prefixed with a double underscore followed by a percent sign, and are postfixed with a percent sign followed by a double underscore.

Robo scripts support the following template parameter:

  • __%APP_PACKAGE_NAME%__ - the package name of the app-under-test.

The following is an example of a Robo script that stops the app-under-test process:

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

نظرات

A Robo script can contain comment lines, which are lines that start with # or // .

The following is an example of a Robo script with a couple of comments:

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

قابلیت ها

By default, until all actions of a Robo script are completed (or at least attempted), the Robo script remains active. Robo test keeps trying to match a Robo script action whenever it is picking an action to perform. Robo script employs the following techniques to increase robustness:

تکنیک توضیحات
Partial matching If the current Robo script action cannot be fully matched, the matching criteria are relaxed and the matching is retried. The partial matching doesn't consider the outermost element descriptor while matching the target UI widget of a Robo script action.

If the partial matching succeeds, the corresponding Robo script action is performed as usual. This technique supports scenarios in which the app structure changes, for example, between app versions, when screen elements are rearranged.

Skip current action If the current Robo script action cannot be fully or partially matched, Robo tries to match the subsequent Robo script action. If the subsequent action fully or partially matches, Robo test skips (and never returns to) the current Robo script action and performs the subsequent one.

This technique supports scenarios when app behavior changes between versions or is flaky, for example, when an intermittent dialog might appear at different screens during recording versus replaying of a Robo script.

Suspend If neither current nor subsequent Robo script actions can be fully or partially matched, Robo script is temporarily suspended and Robo test picks an action to perform using its other strategies. After this action is completed, Robo test resumes executing the Robo script.

As long as current or subsequent Robo script actions cannot be matched, Robo script remains suspended for any number of actions. Thus, Robo scripts don't necessarily need to be a prologue for a Robo test, and you can intersperse Robo script actions with standard Robo test actions. This technique supports scenarios when app behavior is flaky, or when changes between app versions are large enough that Robo test needs to "fill in the gaps" with its standard actions.

اولویت ها

If a Robo script reaches its maxNumberOfRuns , it can no longer be triggered in a given crawl. If more than one Robo script can be triggered by the current context, priority is given by choosing, in the following order, the Robo script that:

  1. Has a contextDescriptor attribute.
  2. Has the highest priority (by default, all Robo scripts have the same execution priority of 1 ).
  3. Appears earliest in the list of the Robo scripts, if Robo scripts' priorities are the same.

The following is an example of a file with three Robo scripts that perform the same action and are triggered by the same condition - the app-under-test being in the foreground:

[
  {
    "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
      }
    ]
  }
]

When the app-under-test is in the foreground, Robo triggers the following, in order:

  1. "Robo script 2" because it has the highest priority.
  2. "Robo script 1" because it appears earlier among the remaining applicable Robo scripts with the same priority.
  3. "Robo script 3" as the last applicable Robo script.

Repeated runs

By default, Robo triggers a Robo script at most once during a crawl. This can be adjusted via the maxNumberOfRuns attribute.

The following is an example of a Robo script that brings the app-under-test into the background for up to 10 times:

{
  "id": 1000,
  "maxNumberOfRuns": 10,
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  },
  "actions": [
    {
      "eventType": "GO_HOME"
    }
  ]
}

Crawl stage

Robo scripts are applicable at different stages of a given Robo crawl:

Crawl stage توضیحات
pre_crawl Before Robo launches and starts crawling the app-under-test.
post_crawl After Robo finishes crawling the app-under-test. A post_crawl Robo script must not exceed 15 seconds in duration or else the crawl may terminate in a timeout.
crawl The main crawl stage, when Robo crawls the app-under-test.
close_screen When Robo tries to return back (backtrack) from a given screen, when all possible actions on this screen are explored. By default, Robo presses back, which is undesirable in some scenarios.

If the crawlStage attribute of a Robo script is unspecified, it is implied to be crawl .

The following is an example of a Robo script that clears the app-under-test user data before Robo starts crawling it:

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

The following is an example of a Robo script that instructs Robo to click "Cancel" whenever it tries to return back (backtrack) from a confirmation dialog:

{
  "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"
        }
      ]
    }
  ]
}

Conditional actions

A Robo script can contain conditional actions. Conditional actions have three additional attributes that describe how Robo performs them:

صفت توضیحات
priority The priority of this conditional action in comparison to other conditional actions within its containing Robo script. By default, all conditional actions have a priority of 1 .
maxNumberOfRuns How many times this conditional action can be performed during one execution of its containing Robo script. By default, all conditional actions can be performed at most once in a single execution of their containing Robo script.
contextDescriptor The context/condition that triggers this conditional action. It has the same structure and offers similar capabilities as the Robo script's contextDescriptor

When triggered, a Robo script performs its non-conditional actions one by one in order of appearance. If a Robo script contains conditional actions, then they are considered every time before picking a non-conditional action to perform. If any conditional action is triggered and picked based on its priority and the remaining number of runs, then the Robo script performs this conditional action. Otherwise, the Robo script performs the following non-conditional action. To be valid, a Robo script must contain at least one non-conditional action.

The following is an example of an unconditional Robo script with a conditional action that dismisses popup dialogs if they show up at any point during the Robo script execution:

{
  "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
    }
}

Ignoring actions

A Robo script can contain instructions for Robo to ignore specific UI widgets or all UI widgets on a particular screen. These instructions are represented as ignoring "actions" with eventType ELEMENT_IGNORED and ALL_ELEMENTS_IGNORED correspondingly.

Whenever the contextDescriptor attribute of a Robo script containing ignoring actions matches a given screen, Robo does not interact with any UI widgets targeted by its ignoring actions (unless some other Robo script action makes Robo perform an action on one of the ignored UI widgets).

A Robo script can contain a mix of ignoring, conditional, and non-conditional actions. Unlike other Robo script actions, ignoring actions are applied as long as their containing Robo script's contextDescriptor matches a screen during a Robo crawl, regardless of the values of the priority and maxNumberOfRuns attributes.

The following is an example of a file with two Robo scripts. The first Robo script makes Robo ignore all UI widgets on a screen containing a UI widget with a resource ID "my.app.package:id/ignored_screen" . The second Robo script makes Robo ignore UI widgets whose resource IDs match Java regex ".*:id/done" on a screen containing a UI widget with a resource ID "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 and AdapterView support

Children of RecyclerView and AdapterView widgets are loaded dynamically and might be displayed many swipes away from the current screen. Since the size of a screen, and the number of swipes required to get to this child, is different for different device form factors, it is much more robust to rely on the child's data position, which is absolute. It is a less robust approach to rely on the number of swipes that are required to bring this child to the screen and then use its screen position.

Therefore, Robo script captures the absolute data positions of RecyclerView children that are targets of Robo script actions as recyclerViewChildPosition . Robo script also captures the absolute data positions of AdapterView children that are targets of Robo script actions as adapterViewChildPosition .

Actions on RecyclerView and AdapterView children are performed in the following steps:

  1. Robo test ensures that the corresponding child is displayed on the screen through a positioning action on its containing RecyclerView or AdapterView.

  2. Robo test performs the recorded action directly on the child element, since it is already displayed on the screen.

The following is an example of a click action on an AdapterView ( android.widget.GridView ) child:

{
  "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
    }
  ]
}

The following is an example of a click action on a RecyclerView ( android.support.v7.widget.RecyclerView ) child:

{
  "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
    }
  ]
}

Record a Robo script in Android Studio and run it in Test Lab

You can create a Robo script in Android Studio, which saves the script as a JSON file. You can then upload the JSON file to Firebase Test Lab with the application and run the test accordingly.

When you run a Robo test with a script attached, Robo test first steps through your pre-scripted actions and then explores the app as usual.

To create a Robo script JSON file in Android Studio, follow the steps in Record a Robo script using Test Lab in Android Studio .

Robo script actions

The following common optional attribute applies to all actions:

  • description - helps track execution of this Robo script action in Robo test outputs.

ادعا

If the asserted condition is true, the Robo script continues to the next action, which could be another assertion. Otherwise, the Robo script execution is halted due to a failed assertion.

The following table lists required attributes:

صفت توضیحات
"eventType": "ASSERTION" --
contextDescriptor Describes the asserted context or condition. It has the same structure and offers similar capabilities as the Robo script's contextDescriptor .

The following is an example of a Robo script assertion that checks that the app-under-test is in the foreground:

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

The following is an example of a Robo script assertion that checks that a UI widget with the resource ID "com.google.samples.apps.topeka:id/done" is present on a screen:

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

The following is an example of a Robo script assertion that checks that "Settings" is NOT detected on a screen using OCR:

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

کلیک کنید

The following table lists required attributes:

صفت توضیحات
eventType Specifies the type of the Robo script action.
"eventType": "VIEW_CLICKED" Clicks the target element of the app-under-test.
"eventType": "SOFT_KEYBOARD_CLICK" Clicks the target element of the soft keyboard.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Clicks random elements of the soft keyboard up to maxNumberOfRuns times.
"eventType": "LIST_ITEM_CLICKED" Used by the Robo script recorder in Android Studio for clicking list items.
elementDescriptors Identifies the clicked UI widget using the Android UI hierarchy. Mutually exclusive with visionText .
visionText Identifies the clicked element using OCR. Mutually exclusive with elementDescriptors .
maxNumberOfRuns Specifies how many times to click a random element of the soft keyboard, when eventType is SOFT_KEYBOARD_RANDOM_CLICK . The default value is 1 .

The following is an example of a Robo script action that clicks a button with the resource ID "com.google.samples.apps.topeka:id/done" :

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

The following is an example of a Robo script action that clicks on "Privacy Policy" detected on a screen using OCR:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

The following is an example of a Robo script action that clicks a soft keyboard element with a content description "Emoji button" :

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

The following is an example of a Robo script action that clicks random soft keyboard elements up to five times:

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

Disable soft keyboard

The following table lists required attributes:

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

The following is an example of a Robo script action that disables the soft keyboard:

{
  "eventType": "DISABLE_KEYBOARD"
}

Execute adb shell command

The following table lists required attributes:

صفت توضیحات
"eventType": "ADB_SHELL_COMMAND" --
command The Android Debug Bridge (adb) shell command to execute.

The following attribute is optional:

  • expectedOutputRegex - the expected output of the command as a Java regular expression. If the output does not match, the Robo script action fails. By default, it is an empty string, which means the output is not checked.

The following is an example of a Robo script action that clears the app-under-test user data:

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

Grant permissions

This action is recorded by the Robo script recorder in Android Studio for backward compatibility with Espresso Test Recorder . Robo test grants all permissions to the app-under-test at the beginning of every crawl, and thus, this action is a no-op. Do NOT use this action in your Robo scripts.

The following table lists required attributes:

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

Ignore all elements on a screen

This action makes Robo ignore all elements on any screen that triggers the containing Robo script.

The following table lists required attributes:

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

The following is an example of a Robo script action that makes Robo ignore all elements on a screen:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Ignore an element

This action makes Robo ignore an element (or elements) that match the specified elementDescriptors .

The following table lists required attributes:

صفت توضیحات
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Identifies the ignored UI widget(s) using the Android UI hierarchy.

The following attribute is optional:

  • ignoreChildren - if set to true , Robo also ignores all descendants of the ignored UI widget(s). By default, it is false .

The following is an example of a Robo script action that makes Robo ignore all elements, whose content descriptions start with "Avatar" :

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

متن ورودی

The following table lists required attributes:

صفت توضیحات
eventType Specifies the type of the Robo script action.
"eventType": "VIEW_TEXT_CHANGED" Inputs the given text into the target UI widget.
"eventType": "ENTER_TEXT" inputs the given text into the target UI widget and then sends a KEYCODE_ENTER event to this UI widget.
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.
replacementText The text to input into the target UI widget.

The following is an example of a Robo script action that inputs "John" into a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name" :

{
  "eventType": "VIEW_TEXT_CHANGED",
  "replacementText": "John",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/first_name"
    }
  ]
}

Long click

The following table lists required attributes:

صفت توضیحات
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identifies the target UI widget using the Android UI hierarchy. Mutually exclusive with visionText .
visionText Identifies the long clicked element using OCR. Mutually exclusive with elementDescriptors .

The following attribute is optional:

  • delayTime - specifies how long the press down of a long click lasts, in milliseconds.

The following is an example of a Robo script action that performs a five seconds-long click on a UI widget with content description "Avatar 8" :

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

Perform a one-point gesture

The following table lists required attributes:

صفت توضیحات
"eventType": "ONE_POINT_GESTURE" --
coordinates Two coordinates for a one-point gesture, formatted as "(x1,y1)->(x2,y2)" as percentages or pixels.

The following attribute is optional:

  • dragAndDrop - if set to true , the one-point gesture performs a drag-and-drop action. By default, it is false .

The following is an example of a Robo script one-point gesture action that performs a swipe down:

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

Perform a two-point gesture

The following table lists required attributes:

صفت توضیحات
"eventType": "TWO_POINT_GESTURE" --
coordinates Four coordinates for a two-point gesture, formatted as "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" as percentages or pixels.

The following is an example of a Robo script action that performs a pinch out gesture:

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

Perform an IME action

This action presses the current action button, for example, next, done, and search, on the Input Method Editor (IME) for the specified target UI widget.

The following table lists required attributes:

صفت توضیحات
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that performs an IME action on a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name" :

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

Press back

The following table lists required attributes:

صفت توضیحات
eventType Specifies the type of the Robo script action.
"eventType": "PRESSED_BACK" Sends a KEYCODE_BACK event to the device.
"eventType": "PRESSED_BACK_EMULATOR_28" Used by the Robo script recorder in Android Studio for pressing back on emulators API 28.

The following is an example of a Robo script action that presses back:

{
  "eventType": "PRESSED_BACK"
}

Press home

This action sends a KEYCODE_HOME event to the device.

The following table lists required attributes:

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

The following is an example of a Robo script action that presses home:

{
  "eventType": "GO_HOME"
}

Scroll an element into view

This action makes Robo test scroll forward the UI widget that matches the specified elementDescriptors until the UI widget that matches the specified childElementDescriptors is present on the screen, or the scrolled widget can no longer be scrolled, or the max number of 50 scrolls is reached.

The following table lists required attributes:

صفت توضیحات
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identifies the scrolled UI widget using the Android UI hierarchy.
childElementDescriptors Identifies the UI widget to scroll to using the Android UI hierarchy.

The following is an example of a Robo script action that scrolls the UI widget with the resource ID "my.app.package:id/scrollable_card_container" until the UI widget with text "Orange" is present on the screen (or no more scrolls can be performed, or the max number of 50 scrolls is reached):

{
  "eventType": "ELEMENT_SCROLL_INTO_VIEW",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/scrollable_card_container"
    }
  ],
  "childElementDescriptors": [
    {
      "text": "Orange"
    }
  ]
}

Swipe

The following table lists required attributes:

صفت توضیحات
"eventType": "VIEW_SWIPED" --
swipeDirection Specifies the direction of the swipe:
  • Left
  • Right
  • Up
  • Down
  • Forward - either Down or Right depending on vertical or horizontal scrollability of the target UI widget.
  • Backward - either Up or Left depending on vertical or horizontal scrollability of the target UI widget.
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that swipes up a UI widget with the resource ID "my.app.package:id/custom_content" :

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

Take screenshot

The following table lists required attributes:

صفت توضیحات
"eventType": "TAKE_SCREENSHOT" --
screenshotName Specifies the screenshot file name.

The following is an example of a Robo script action that takes a screenshot:

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

Tap a point on the screen

The following table lists required attributes:

صفت توضیحات
"eventType": "POINT_TAP" --
pointTapXCoordinate The pixel X coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent .
pointTapYCoordinate The pixel Y coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent .
pointTapXPercent The percentage X coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate .
pointTapYPercent The percentage Y coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate .

The following is an example of a Robo script action that taps in the middle of a screen:

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

Tap a point within an element

The following table lists required attributes:

صفت توضیحات
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent The percentage X coordinate within the target element.
pointTapYPercent The percentage Y coordinate within the target element.
elementDescriptors Identifies the target UI widget using Android UI hierarchy.

The following is an example of a Robo script action that moves a seekbar's slider to the right:

{
  "eventType": "POINT_TAP_ELEMENT",
  "pointTapXPercent": 80,
  "pointTapYPercent": 50,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/my_seekbar"
    }
  ]
}

Terminate crawl

This action stops the Robo test.

The following table lists required attributes:

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

The following is an example of a Robo script action that stops a Robo test:

{
  "eventType": "TERMINATE_CRAWL"
}

صبر کن

The following table lists required attributes:

صفت توضیحات
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime Specifies how long to wait, in milliseconds.

The following is an example of a Robo script action that waits for three seconds:

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

Wait for an element

This action makes Robo test wait for an element to appear on the screen up to the specified timeout.

The following table lists required attributes:

صفت توضیحات
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Specifies the waiting timeout, in milliseconds.
elementDescriptors Identifies the waited-for UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that waits for up to 30 seconds for a UI widget with the resource ID "my.app.package:id/confirmation_button" to appear on the screen:

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

مراحل بعدی