این سند اطلاعات مرجعی درباره اسکریپت های 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" : "WAIT",
"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": "WAIT",
"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": "WAIT",
"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 است که:
- دارای ویژگی
contextDescriptor
است. - دارای بالاترین
priority
(به طور پیش فرض، همه اسکریپت های Robo دارایpriority
اجرای1
هستند). - اگر اولویتهای اسکریپتهای Robo یکسان باشد، زودتر در فهرست اسکریپتهای Robo ظاهر میشود.
در زیر نمونهای از فایلی با سه اسکریپت Robo است که عملکرد یکسانی را انجام میدهند و با شرایط یکسان راهاندازی میشوند - app-under-test در پیشزمینه است:
[
{
"id": 1000,
"description": "Robo script 1",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1001,
"description": "Robo script 2",
"priority": "2",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1002,
"description": "Robo script 3",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
}
]
هنگامی که برنامه زیر آزمایش در پیش زمینه است، Robo به ترتیب موارد زیر را فعال می کند:
-
"Robo script 2"
چون بالاترین اولویت را دارد. -
"Robo script 1"
زیرا در میان اسکریپت های Robo قابل اجرا باقی مانده با همان اولویت زودتر ظاهر می شود. -
"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": "WAIT",
"delayTime": 10000
},
{
"description": "Screen on",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 82"
},
{
"description": "Wait for 10 seconds",
"eventType": "WAIT",
"delayTime": 10000
}
}
نادیده گرفتن اقدامات
یک اسکریپت Robo میتواند حاوی دستورالعملهایی برای Robo برای نادیده گرفتن ویجتهای 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 کودکان در مراحل زیر انجام می شود:
تست Robo تضمین می کند که فرزند مربوطه از طریق یک اقدام موقعیت یابی روی RecyclerView یا AdapterView حاوی آن روی صفحه نمایش داده می شود.
تست Robo عمل ضبط شده را مستقیماً روی عنصر فرزند انجام می دهد، زیرا قبلاً روی صفحه نمایش داده شده است.
در زیر نمونهای از عملکرد کلیک روی فرزند AdapterView ( android.widget.GridView
) است:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "com.google.samples.apps.topeka.widget.AvatarView",
"adapterViewChildPosition": 5,
"resourceId": "com.google.samples.apps.topeka:id/avatar",
"contentDescription": "Avatar 6"
},
{
"className": "android.widget.GridView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/avatars"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 1
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
نمونه زیر نمونهای از عملکرد کلیک روی یک فرزند RecyclerView ( android.support.v7.widget.RecyclerView
) است:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "android.support.v7.widget.AppCompatTextView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_title"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": 8,
"resourceId": "com.google.samples.apps.topeka:id/category_item"
},
{
"className": "android.support.v7.widget.RecyclerView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/categories"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_container"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
یک اسکریپت Robo را در اندروید استودیو ضبط کنید و آن را در Test Lab اجرا کنید
می توانید یک اسکریپت Robo در Android Studio ایجاد کنید که اسکریپت را به عنوان یک فایل JSON ذخیره می کند. سپس میتوانید فایل JSON را در Firebase Test Lab با برنامه آپلود کنید و آزمایش را مطابق با آن اجرا کنید.
هنگامی که یک تست Robo را با یک اسکریپت متصل اجرا می کنید، تست Robo ابتدا اقدامات از پیش تعیین شده شما را انجام می دهد و سپس برنامه را طبق معمول بررسی می کند.
برای ایجاد فایل JSON اسکریپت Robo در Android Studio، مراحل ضبط یک اسکریپت Robo را با استفاده از Test Lab در Android Studio دنبال کنید.
اقدامات اسکریپت Robo
ویژگی اختیاری مشترک زیر برای همه اقدامات اعمال می شود:
-
description
- به ردیابی اجرای این عمل اسکریپت Robo در خروجی های تست Robo کمک می کند.
ادعا
اگر شرط اعلام شده درست باشد، اسکریپت Robo به عمل بعدی ادامه میدهد، که میتواند ادعای دیگری باشد. در غیر این صورت، اجرای اسکریپت Robo به دلیل یک ادعای ناموفق متوقف می شود.
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "ASSERTION" | -- |
contextDescriptor | زمینه یا شرایط ادعا شده را توصیف می کند. این ساختار مشابهی دارد و قابلیتهای مشابه ContextDescriptor اسکریپت Robo را ارائه میکند. |
در زیر نمونهای از ادعای اسکریپت Robo است که بررسی میکند که app-under-test در پیشزمینه است:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
در زیر نمونهای از ادعای اسکریپت Robo است که بررسی میکند ویجت رابط کاربری با شناسه منبع "com.google.samples.apps.topeka:id/done"
در یک صفحه وجود دارد:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
در زیر نمونهای از ادعای اسکریپت Robo است که بررسی میکند "Settings"
روی صفحه با استفاده از OCR شناسایی نمیشوند:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
کلیک کنید
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
---|---|
eventType | نوع عمل اسکریپت Robo را مشخص می کند. |
"eventType": "VIEW_CLICKED" | روی عنصر مورد نظر برنامه تحت آزمایش کلیک می کند. |
"eventType": "SOFT_KEYBOARD_CLICK" | روی عنصر هدف صفحه کلید نرم کلیک می کند. |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" | روی عناصر تصادفی صفحه کلید نرم تا maxNumberOfRuns دفعات کلیک می کند. |
"eventType": "LIST_ITEM_CLICKED" | توسط ضبط کننده اسکریپت Robo در Android Studio برای کلیک کردن روی موارد لیست استفاده می شود. |
elementDescriptors | ویجت UI کلیک شده را با استفاده از سلسله مراتب Android UI شناسایی می کند. انحصاری متقابل با visionText . |
visionText | عنصر کلیک شده را با استفاده از OCR شناسایی می کند. متقابل با elementDescriptors . |
matchIndex | زمانی که عنصر هدف با استفاده از visionText شناسایی می شود، شاخص وقوع عنصر هدف منطبق را مشخص می کند. اگر 0 باشد، اقدام Robo script اولین عنصر منطبق را انتخاب می کند، اگر 1 باشد، اقدام Robo script دومین عنصر منطبق را انتخاب می کند و به همین ترتیب. ترتیب از چپ به راست، از بالا به پایین تعیین می شود. مقدار پیش فرض 0 است (اولین مورد انتخاب شده است). |
maxNumberOfRuns | زمانی که eventType SOFT_KEYBOARD_RANDOM_CLICK است، مشخص میکند که چند بار روی یک عنصر تصادفی از صفحهکلید نرم کلیک شود. مقدار پیش فرض 1 است. |
در زیر نمونهای از عملکرد اسکریپت Robo است که روی دکمهای با شناسه منبع "com.google.samples.apps.topeka:id/done"
کلیک میکند:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
در زیر نمونهای از عملکرد اسکریپت Robo است که روی دومین تکرار کلمه "Search"
که روی صفحه با استفاده از OCR شناسایی میشود کلیک میکند:
{
"eventType": "VIEW_CLICKED",
"visionText": "Search",
"matchIndex": 1
}
در زیر نمونهای از عملکرد اسکریپت Robo است که روی یک عنصر صفحهکلید نرم با توضیح محتوا "Emoji button"
کلیک میکند:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
در زیر نمونهای از عملکرد اسکریپت Robo است که روی عناصر صفحهکلید نرمافزار تصادفی تا پنج بار کلیک میکند:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
غیرفعال کردن صفحه کلید نرم
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "DISABLE_KEYBOARD" | -- |
در زیر نمونه ای از عملکرد اسکریپت Robo است که صفحه کلید نرم افزاری را غیرفعال می کند:
{
"eventType": "DISABLE_KEYBOARD"
}
دستور adb shell را اجرا کنید
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "ADB_SHELL_COMMAND" | -- |
command | دستور پوسته Android Debug Bridge (adb) برای اجرا. |
ویژگی زیر اختیاری است:
-
expectedOutputRegex
- خروجی مورد انتظار دستور به عنوان یک عبارت منظم جاوا. اگر خروجی مطابقت نداشته باشد، عمل اسکریپت Robo ناموفق است. به طور پیش فرض، این یک رشته خالی است، به این معنی که خروجی بررسی نشده است.
در زیر نمونهای از عملکرد اسکریپت Robo است که دادههای کاربر تحت آزمایش برنامه را پاک میکند:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
مجوزها را اعطا کنید
این اکشن توسط ضبط کننده اسکریپت Robo در اندروید استودیو برای سازگاری به عقب با ضبط کننده تست اسپرسو ضبط شده است. تست Robo در ابتدای هر خزیدن، همه مجوزها را به برنامه زیر آزمایش میدهد، و بنابراین، این عمل غیرفعال است. از این عمل در اسکریپت های Robo خود استفاده نکنید.
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "PERMISSIONS_REQUEST" | -- |
همه عناصر روی صفحه را نادیده بگیرید
این عمل باعث میشود Robo همه عناصر را در هر صفحهای که اسکریپت Robo را فعال میکند نادیده بگیرد.
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "ALL_ELEMENTS_IGNORED" | -- |
در زیر نمونهای از عملکرد اسکریپت Robo است که باعث میشود Robo همه عناصر روی صفحه را نادیده بگیرد:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
نادیده گرفتن یک عنصر
این عمل باعث می شود که Robo یک عنصر (یا عناصر) را نادیده بگیرد که با elementDescriptors
مشخص شده مطابقت دارد.
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "ELEMENT_IGNORED" | -- |
elementDescriptors | ویجت(های) UI نادیده گرفته شده را با استفاده از سلسله مراتب Android UI شناسایی می کند. |
ویژگی زیر اختیاری است:
-
ignoreChildren
- اگر رویtrue
تنظیم شود، Robo همچنین تمام فرزندان ویجت(های) UI نادیده گرفته شده را نادیده می گیرد. به طور پیش فرض،false
است.
در زیر نمونهای از عملکرد اسکریپت Robo است که باعث میشود Robo همه عناصر را نادیده بگیرد که توضیحات محتوای آنها با "Avatar"
شروع میشود:
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
متن ورودی
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
---|---|
eventType | نوع عمل اسکریپت Robo را مشخص می کند. |
"eventType": "VIEW_TEXT_CHANGED" | متن داده شده را در ویجت UI هدف وارد می کند. |
"eventType": "ENTER_TEXT" | متن داده شده را در ویجت UI هدف وارد می کند و سپس یک رویداد KEYCODE_ENTER را به این ویجت UI ارسال می کند. |
elementDescriptors | ویجت UI مورد نظر را با استفاده از سلسله مراتب Android UI شناسایی می کند. |
replacementText | متنی که باید در ویجت UI هدف وارد شود. |
در زیر نمونهای از عملکرد اسکریپت Robo است که "John"
با شناسه منبع "com.google.samples.apps.topeka:id/first_name"
در یک ویجت رابط کاربری وارد میکند:
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
کلیک طولانی
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "VIEW_LONG_CLICKED" | -- |
elementDescriptors | ویجت UI مورد نظر را با استفاده از سلسله مراتب Android UI شناسایی می کند. انحصاری متقابل با visionText . |
visionText | عنصری را که با استفاده از OCR طولانی کلیک شده است شناسایی می کند. متقابل با elementDescriptors . |
matchIndex | زمانی که عنصر هدف با استفاده از visionText شناسایی می شود، شاخص وقوع عنصر هدف منطبق را مشخص می کند. اگر 0 باشد، اقدام Robo script اولین عنصر منطبق را انتخاب می کند، اگر 1 باشد، اقدام Robo script دومین عنصر منطبق را انتخاب می کند و به همین ترتیب. ترتیب از چپ به راست، از بالا به پایین تعیین می شود. مقدار پیش فرض 0 است (اولین مورد انتخاب شده است). |
ویژگی زیر اختیاری است:
-
delayTime
- مشخص می کند که فشار پایین یک کلیک طولانی چقدر طول می کشد، در میلی ثانیه.
در زیر نمونهای از عملکرد اسکریپت Robo است که پنج ثانیه کلیک روی یک ویجت رابط کاربری با توضیحات محتوا "Avatar 8"
انجام میدهد:
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
یک حرکت یک نقطه ای انجام دهید
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
---|---|
"eventType": "ONE_POINT_GESTURE" | -- |
coordinates | دو مختصات برای یک اشاره یک نقطهای که به صورت «(x1,y1)->(x2,y2)» به صورت درصد یا پیکسل قالببندی شدهاند. |
ویژگی زیر اختیاری است:
-
dragAndDrop
- اگر رویtrue
تنظیم شود، حرکت یک نقطه ای یک عمل کشیدن و رها کردن را انجام می دهد. به طور پیش فرض،false
است.
در زیر نمونهای از عملکرد حرکتی یک نقطهای اسکریپت Robo است که تند کشیدن به پایین را انجام میدهد:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
یک حرکت دو نقطه ای انجام دهید
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
---|---|
"eventType": "TWO_POINT_GESTURE" | -- |
coordinates | چهار مختصات برای یک اشاره دو نقطهای که به صورت درصد یا پیکسل به صورت «(x1,y1)->(x2,y2),(x3,y3)->(x4,y4) قالببندی شدهاند. |
در زیر نمونهای از یک عمل اسکریپت Robo است که ژست گرفتن را انجام میدهد:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
یک عمل IME را انجام دهید
این عمل دکمه اقدام فعلی، به عنوان مثال، بعدی، انجام شده و جستجو را در ویرایشگر روش ورودی (IME) برای ویجت UI هدف مشخص شده فشار می دهد.
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
---|---|
"eventType": "PRESSED_EDITOR_ACTION" | -- |
elementDescriptors | ویجت UI مورد نظر را با استفاده از سلسله مراتب Android UI شناسایی می کند. |
در زیر نمونهای از عملکرد اسکریپت Robo است که یک عمل IME را روی یک ویجت رابط کاربری با شناسه منبع "com.google.samples.apps.topeka:id/first_name"
انجام میدهد:
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
عقب را فشار دهید
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
eventType | نوع عمل اسکریپت Robo را مشخص می کند. |
"eventType": "PRESSED_BACK" | یک رویداد KEYCODE_BACK را به دستگاه ارسال می کند. |
"eventType": "PRESSED_BACK_EMULATOR_28" | توسط ضبط کننده اسکریپت Robo در Android Studio برای بازگرداندن 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 است که ویجت UI را با شناسه منبع "my.app.package:id/scrollable_card_container"
تا زمانی که ویجت رابط کاربری با متن "Orange"
روی صفحه نمایش داده شود (یا دیگر نمیتوان اسکرول انجام داد یا به حداکثر 50 اسکرول رسید) پیمایش میکند:
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
انگشت خود را بکشید
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
---|---|
"eventType": "VIEW_SWIPED" | -- |
swipeDirection | جهت کشیدن انگشت را مشخص می کند:
|
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": "WAIT" (or "DELAYED_MESSAGE_POSTED") | -- |
delayTime | مدت زمان انتظار را در میلی ثانیه مشخص می کند. |
در زیر نمونه ای از یک عمل اسکریپت Robo است که به مدت سه ثانیه منتظر می ماند:
{
"eventType": "WAIT",
"delayTime": 3000
}
منتظر یک عنصر باشید
این عمل باعث می شود تا تست Robo منتظر بماند تا عنصری تا زمان تعیین شده روی صفحه ظاهر شود.
جدول زیر ویژگی های مورد نیاز را فهرست می کند:
صفت | توضیحات |
"eventType": "WAIT_FOR_ELEMENT" | -- |
delayTime | زمان انتظار را بر حسب میلی ثانیه مشخص می کند. |
elementDescriptors | ویجت UI مورد انتظار را با استفاده از سلسله مراتب Android UI شناسایی می کند. |
در زیر نمونهای از عملکرد اسکریپت 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+ (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" | بررسی می کند که برنامه زیرنویس در پیش زمینه اجرا می شود. |
"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" : "WAIT",
"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": "WAIT",
"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": "WAIT",
"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 که:
- دارای یک ویژگی
contextDescriptor
است. - بالاترین
priority
دارد (به طور پیش فرض ، تمام اسکریپت های Robo دارایpriority
اجرای یکسان1
هستند). - اگر اولویت های اسکریپت Robo یکسان باشد ، در لیست اسکریپت های Robo ظاهر می شود.
در زیر نمونه ای از پرونده با سه اسکریپت Robo است که همان عمل را انجام می دهند و با همان شرایط ایجاد می شوند-برنامه زیرنویس در پیش زمینه:
[
{
"id": 1000,
"description": "Robo script 1",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1001,
"description": "Robo script 2",
"priority": "2",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1002,
"description": "Robo script 3",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
}
]
هنگامی که برنامه زیر آزمون در پیش زمینه قرار دارد ، Robo موارد زیر را به ترتیب انجام می دهد:
-
"Robo script 2"
زیرا بالاترین اولویت را دارد. -
"Robo script 1"
زیرا در میان اسکریپت های Robo قابل اجرا در ابتدا با همان اولویت ظاهر می شود. -
"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": "WAIT",
"delayTime": 10000
},
{
"description": "Screen on",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 82"
},
{
"description": "Wait for 10 seconds",
"eventType": "WAIT",
"delayTime": 10000
}
}
نادیده گرفتن اقدامات
یک اسکریپت Robo می تواند حاوی دستورالعمل هایی برای Robo باشد تا ابزارک های خاص 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
هستند ، ضبط می کند.
اقدامات مربوط به کودکان بازیافت و آداپتور در مراحل زیر انجام می شود:
تست Robo تضمین می کند که کودک مربوطه از طریق یک عمل موقعیت یابی در مورد بازیافت یا AdapterView خود روی صفحه نمایش داده می شود.
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 . |
matchIndex | شاخص وقوع عنصر هدف همسان را مشخص می کند ، هنگامی که عنصر هدف با استفاده از visionText مشخص می شود. اگر 0 باشد ، Robo Script Action اولین عنصر همسان را انتخاب می کند ، اگر 1 باشد ، Robo Script Action عنصر دوم را انتخاب می کند و غیره. سفارش چپ به راست ، از بالا به پایین تعیین می شود. مقدار پیش فرض 0 است (اولین مسابقه انتخاب می شود). |
maxNumberOfRuns | چند بار برای کلیک بر روی یک عنصر تصادفی از صفحه کلید نرم ، هنگامی که eventType SOFT_KEYBOARD_RANDOM_CLICK است ، مشخص می کند. مقدار پیش فرض 1 است. |
در زیر نمونه ای از یک عمل اسکریپت Robo است که با کلیک بر روی یک دکمه با شناسه منبع "com.google.samples.apps.topeka:id/done"
کلیک می کند:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
در زیر نمونه ای از یک عمل اسکریپت Robo است که بر روی دومین وقوع کلمه "Search"
که بر روی صفحه نمایش با استفاده از OCR کشف شده است ، کلیک می کند:
{
"eventType": "VIEW_CLICKED",
"visionText": "Search",
"matchIndex": 1
}
در زیر نمونه ای از یک عمل اسکریپت Robo است که با یک عنصر صفحه کلید نرم با توضیحات محتوا "Emoji button"
کلیک می کند:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
در زیر نمونه ای از یک عمل اسکریپت Robo است که بر روی عناصر صفحه کلید نرم تصادفی تا پنج بار کلیک می کند:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
صفحه کلید نرم را غیرفعال کنید
جدول زیر ویژگی های مورد نیاز را لیست می کند:
صفت | توضیحات |
"eventType": "DISABLE_KEYBOARD" | -- |
در زیر نمونه ای از یک عمل اسکریپت Robo است که صفحه کلید نرم را غیرفعال می کند:
{
"eventType": "DISABLE_KEYBOARD"
}
دستور ADB Shell را اجرا کنید
جدول زیر ویژگی های مورد نیاز را لیست می کند:
صفت | توضیحات |
"eventType": "ADB_SHELL_COMMAND" | -- |
command | فرمان پوسته Android Debug Bridge (ADB) برای اجرای. |
ویژگی زیر اختیاری است:
-
expectedOutputRegex
- خروجی مورد انتظار این دستور به عنوان یک عبارت منظم جاوا. اگر خروجی مطابقت نداشته باشد ، عمل اسکریپت Robo از بین می رود. به طور پیش فرض ، این یک رشته خالی است ، به این معنی که خروجی بررسی نمی شود.
در زیر نمونه ای از یک اقدام اسکریپت Robo است که داده های کاربر زیر مجموعه برنامه را پاک می کند:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
اعطای مجوزها
این عمل توسط ضبط کننده اسکریپت Robo در 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 . |
matchIndex | شاخص وقوع عنصر هدف همسان را مشخص می کند ، هنگامی که عنصر هدف با استفاده از visionText مشخص می شود. اگر 0 باشد ، Robo Script Action اولین عنصر همسان را انتخاب می کند ، اگر 1 باشد ، Robo Script Action عنصر دوم را انتخاب می کند و غیره. سفارش چپ به راست ، از بالا به پایین تعیین می شود. مقدار پیش فرض 0 است (اولین مسابقه انتخاب می شود). |
ویژگی زیر اختیاری است:
-
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 | جهت کشیدن را مشخص می کند:
|
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": "WAIT" (or "DELAYED_MESSAGE_POSTED") | -- |
delayTime | مشخص می کند که چه مدت صبر کنید ، در میلی ثانیه. |
در زیر نمونه ای از یک عمل اسکریپت Robo است که سه ثانیه منتظر است:
{
"eventType": "WAIT",
"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"
}
]
}