Dokumen ini memberikan informasi referensi tentang skrip Robo, termasuk struktur, kemampuan, penggunaan, perekaman, dan tindakan. Skrip Robo adalah pengujian yang mengotomatiskan tugas jaminan kualitas (QA) manual untuk aplikasi seluler, serta mengaktifkan strategi continuous integration (CI) dan pengujian pra-peluncuran. Skrip Robo adalah file JSON yang mendeskripsikan urutan antarmuka pengguna (UI) dan tindakan lainnya.
Anda dapat membuat skrip Robo dengan cara berikut:
Gunakan fitur perekaman skrip Robo. (Khusus Android)
Buat skrip Robo secara manual. (Android dan iOS+)
Rekam skrip Robo, lalu edit secara manual. (Khusus Android)
Untuk mempelajari lebih lanjut penggunaan skrip Robo, lihat Menjalankan skrip Robo.
Pengantar
Skrip Robo disediakan untuk Uji Robo bersama input lain seperti Paket Aplikasi Android (APK) dari aplikasi yang sedang diuji.
Berikut adalah contoh skrip Robo yang membuat memproses login pengguna ke aplikasi, yang dipicu saat aplikasi yang sedang diuji diluncurkan:
[
{
"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"
}
]
}
]
}
]
Jika ada satu skrip Robo dalam file dan skrip tersebut memiliki kondisi pemicu app_under_test_shown
default, seperti dalam contoh di atas, Anda dapat menentukan skrip Robo dalam file menggunakan format yang lebih sederhana - cukup sebagai urutan tindakannya:
[
{
"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"
}
]
}
]
Dukungan iOS+ untuk skrip Robo
Robo untuk iOS+ (Beta) memiliki dukungan terbatas untuk skrip Robo. Sintaksis skrip Robo untuk iOS+ identik dengan sintaksis Android, dan fitur iOS+ yang didukung berperilaku mirip dengan versi Android.
Tindakan berikut ini didukung di iOS+:
- Pernyataan
- Klik
- Klik lama
- Tindakan geser
- Abaikan semua elemen
- Tindakan menunggu
- Mengambil screenshot
- Menghentikan crawling
Atribut pengidentifikasi berikut dalam deskripsi elemen didukung di iOS+:
- Nama class
- Nama class ancestor
- Deskripsi konten (dan regex)
- Teks (dan regex)
Kondisi pemicu di deskripsi konteks berikut didukung di iOS+:
- Aplikasi yang sedang diuji ditampilkan
- Terdapat elemen
- Tindakan skrip Non-Robo dilakukan
Struktur
Skrip Robo memiliki beberapa atribut yang menjelaskan cara Robo menjalankannya. Sebagian besar atribut ini bersifat opsional dengan nilai default yang telah ditentukan:
Atribut | Deskripsi |
id
|
Bilangan bulat yang membantu melacak skrip Robo ini di dalam output crawl. |
description
|
Serupa dengan id tetapi lebih deskriptif.
|
crawlStage
|
Tahap pada Robo crawling yang menerapkan skrip Robo ini. Secara default, ini adalah tahap crawling utama. |
priority
|
Prioritas skrip Robo ini dibandingkan dengan skrip Robo lainnya.
Secara default, semua skrip Robo memiliki prioritas 1 .
|
maxNumberOfRuns
|
Menentukan frekuensi suatu Robo crawling dapat menjalankan skrip Robo ini. Secara default, Robo dapat menjalankan suatu skrip Robo satu kali. |
contextDescriptor
|
Menjelaskan konteks atau kondisi yang memicu skrip Robo ini. Jika dihilangkan, kondisi pemicu skrip Robo ini dianggap selalu terpenuhi; dengan kata lain, skrip Robo tidak kondisional. |
actions
|
Semua tindakan skrip Robo ini. |
Satu file berisi kumpulan satu atau beberapa skrip Robo.
Berikut adalah contoh file dengan dua skrip Robo yang tidak kondisional, masing-masing dengan satu tindakan yang dijalankan satu kali di awal crawling:
[
{
"id": 1000,
"description": "My first Robo script",
"actions": [
{
"eventType": "DISABLE_KEYBOARD"
}
]
},
{
"id": 1001,
"description": "My second Robo script",
"actions": [
{
"eventType": "PRESSED_BACK"
}
]
}
]
Deskripsi konteks
Deskripsi konteks menentukan konteks atau kondisi yang memicu skrip Robo menggunakan satu atau kombinasi beberapa atribut:
Atribut | Deskripsi |
---|---|
"condition": "element_present"
|
Memeriksa apakah widget UI yang cocok dengan elementDescriptors atau
teks yang ditentukan oleh visionText ada di layar.
|
"condition": "element_disabled"
|
Memeriksa apakah widget UI yang cocok dengan elementDescriptors ada di layar dan tidak dapat berinteraksi.
|
"condition": "element_checked"
|
Memeriksa apakah widget UI yang cocok dengan elementDescriptors
ada di layar dan dicentang.
|
"condition": "app_under_test_shown"
|
Memeriksa apakah aplikasi yang sedang diuji berjalan di latar depan. |
"condition": "default_launcher_shown"
|
Memeriksa apakah layar utama perangkat ditampilkan, yang berarti tidak ada aplikasi yang berjalan di latar depan. |
"condition": "non_roboscript_action_performed"
|
Memeriksa apakah tindakan berturut-turut nonRoboscriptActionCount terakhir yang dilakukan oleh Uji Robo bukan tindakan skrip Robo.
|
negateCondition
|
Jika ditetapkan ke true , akan meniadakan condition . Misalnya, Anda dapat menggunakan atribut ini untuk memeriksa apakah widget UI TIDAK
ada di layar, atau bahwa aplikasi yang sedang diuji TIDAK berjalan di
latar depan.
|
elementDescriptors
|
Satu atau beberapa deskripsi elemen yang mengidentifikasi widget UI pada layar.
Deskripsi ini digunakan bersama dengan kondisi element_present ,
element_disabled , dan element_checked . Tidak dapat muncul bersamaan dengan visionText . Untuk mengetahui informasi selengkapnya, lihat Deskripsi elemen.
|
visionText
|
Teks di layar terdeteksi menggunakan API Pengenalan Karakter Optik (OCR). visionText digunakan bersama dengan kondisi element_present . Tidak dapat muncul bersamaan dengan
elementDescriptors .
|
nonRoboscriptActionCount
|
Jumlah tindakan skrip non-Robo berturut-turut yang dilakukan sebelumnya. Ini digunakan bersama dengan kondisi non_roboscript_action_performed untuk memicu skrip Robo setelah setiap tindakan Robo nonRoboscriptActionCount . Secara default, nilainya adalah 1 .
|
Berikut adalah contoh skrip Robo yang dipicu oleh widget UI dengan ID resource "my.app.package:id/page_header"
yang ada di layar:
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/page_header"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Settings"
}
]
}
]
}
Berikut adalah contoh skrip Robo yang dipicu oleh "Privacy Policy"
yang terdeteksi oleh Pengenalan Karakter Optik (OCR):
{
"id": 1000,
"description": "Vision text Robo script",
"contextDescriptor": {
"condition": "element_present",
"visionText": "Privacy Policy"
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
]
}
Berikut adalah contoh skrip Robo yang menunggu 5 detik setelah setiap tindakan yang tidak melibatkan skrip Robo:
{
"contextDescriptor": {
"condition": "non_roboscript_action_performed"
},
"maxNumberOfRuns" : 1000,
"actions" : [
{
"eventType" : "DELAYED_MESSAGE_POSTED",
"delayTime" : 5000
}]
}
Tindakan
Setiap tindakan dalam skrip Robo direpresentasikan sebagai paket dari satu atau beberapa pasangan nilai atribut, yang dijelaskan dalam tabel berikut:
Atribut | Deskripsi |
eventType
|
Menentukan jenis tindakan, misalnya, klik, edit teks, dll. Diperlukan untuk setiap tindakan. |
elementDescriptors
|
Deskripsi yang mengidentifikasi widget UI. Diperlukan untuk semua tindakan yang memiliki widget UI target, seperti mengklik tombol tertentu. |
optional
|
Jika ditetapkan ke true , tindakan ini akan dilewatkan jika tidak dapat dilakukan. Misalnya, tindakan ini dilewatkan jika tidak dapat menemukan
widget UI targetnya di layar, tanpa menggagalkan skrip
Robo yang memuatnya. Secara default, nilainya adalah false .
|
replacementText
|
Teks yang akan dimasukkan ke dalam widget UI target. Diperlukan untuk tindakan pengeditan teks. |
swipeDirection
|
Menentukan arah tindakan geser. Diperlukan untuk tindakan geser. |
delayTime
|
Menentukan durasi tunggu, dalam milidetik. Diperlukan untuk tindakan tunggu. |
pointTapXCoordinate dan pointTapYCoordinate
|
Koordinat X dan Y piksel dari titik yang diketuk. Tidak dapat muncul bersamaan dengan pointTapXPercent dan pointTapYPercent .
Diperlukan untuk tindakan ketuk titik.
|
pointTapXPercent dan pointTapYPercent
|
Koordinat X dan Y persentase dari titik yang diketuk. Tidak dapat muncul bersamaan dengan pointTapXCoordinate dan pointTapYCoordinate . Diperlukan untuk tindakan ketuk titik.
|
Berikut adalah contoh skrip Robo dengan dua tindakan tanpa widget UI target, yang berarti bahwa tindakan ini tidak beroperasi pada widget UI tertentu:
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
Deskripsi elemen
Deskripsi elemen mengidentifikasi widget UI menggunakan satu atau beberapa atribut identifikasi berikut:
Atribut | Deskripsi |
className
|
– |
ancestorClassName
|
Nama class ancestor hierarki UI elemen. Ancestor adalah salah satu node induk dalam hierarki UI elemen, termasuk elemen itu sendiri. |
resourceId
|
– |
resourceIdRegex
|
Ekspresi reguler Java untuk mencocokkan resourceId .
|
contentDescription
|
– |
contentDescriptionRegex
|
Ekspresi reguler Java untuk mencocokkan contentDescription .
|
text (yang muncul di layar)
|
– |
textRegex
|
Ekspresi reguler Java untuk mencocokkan text .
|
groupViewChildPosition ,
recyclerViewChildPosition , atau
adapterViewChildPosition
|
Mewakili posisi turunan widget UI, tergantung pada jenis widget induknya. |
Sering kali atribut ini tidak ditentukan. Misalnya, tombol mungkin tidak memiliki deskripsi konten dan teks. Meskipun ada beberapa nilai atribut, nilai tersebut mungkin tidak unik pada layar aplikasi tertentu (termasuk resourceId
).
Misalnya, membedakan antara item daftar biasanya hanya dapat dilakukan
dengan menggunakan posisi turunan yang berbeda di dalam widget induknya. Artinya,
hanya menggunakan satu deskripsi elemen untuk mengidentifikasi widget UI biasanya
tidak cukup. Oleh karena itu, atribut elementDescriptors
tindakan berisi urutan deskripsi elemen yang diurutkan sehingga yang pertama terkait dengan widget UI target, yang kedua sesuai dengan widget induk dari widget UI target, dan seterusnya. Widget UI target dari suatu tindakan akan cocok saat semua deskripsi elemennya cocok dengan sub-hierarki widget UI yang sesuai.
Berikut adalah contoh skrip Robo dengan perubahan teks dan tindakan klik, yang keduanya mengharuskan Anda mengidentifikasi widget UI target menggunakan deskripsi elemen yang disediakan:
[
{
"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"
}
]
}
]
Opsi eksekusi
Jika ingin, Anda dapat menambahkan awalan ke daftar tindakan dalam skrip Robo dengan objek JSON yang menentukan opsi eksekusi untuk skrip Robo tersebut. Header konfigurasi ini dimulai dengan kata kunci roboscript
diikuti dengan representasi JSON dari opsi eksekusi yang diinginkan.
Skrip Robo mendukung opsi eksekusi berikut:
executionMode
- opsi eksekusi yang diterapkan saat skrip Robo berjalan:strict
- jika ditetapkan ketrue
, skrip Robo tidak akan menggunakan pencocokan sebagian, melewatkan tindakan saat ini, dan penangguhan. Artinya, skrip Robo dijalankan sebagai uji instrumentasi reguler dan akan segera gagal setelah tindakannya tidak dapat dilakukan.notify
- jika ditetapkan kefalse
, skrip Robo tidak akan menampilkan notifikasi di layar di awal dan akhir eksekusinya. Secara default, nilainya adalahtrue
.
postscript
- opsi eksekusi yang diterapkan setelah skrip Robo selesai:terminate
- jika ditetapkan ketrue
, Uji Robo akan menghentikan crawling setelah skrip Robo selesai.
Berikut adalah contoh skrip Robo yang dijalankan dalam mode strict
tanpa notifikasi di layar yang tidur selama tiga detik, setelah itu crawling berhenti:
"roboscript": {
"executionMode": {
"strict": true,
"notify": false
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
Parameter template
Parameter template adalah placeholder dalam skrip Robo yang diganti dengan nilai sebenarnya saat Uji Robo memuat skrip Robo tersebut untuk dijalankan. Parameter template diawali dengan garis bawah ganda yang diikuti dengan tanda persen, dan diberi akhiran tanda persen yang diikuti dengan garis bawah ganda.
Skrip Robo mendukung parameter template berikut:
__%APP_PACKAGE_NAME%__
- nama paket aplikasi yang sedang diuji.
Berikut adalah contoh skrip Robo yang menghentikan proses pengujian aplikasi:
[
{
"eventType": "ADB_SHELL_COMMAND",
"command": "am force-stop __%APP_PACKAGE_NAME%__"
}
]
Komentar
Skrip Robo dapat berisi baris komentar, yaitu baris yang diawali dengan #
atau //
.
Berikut adalah contoh skrip Robo dengan beberapa komentar:
# Confirm a user account.
[
{
// Click the DONE button.
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
]
Kemampuan
Secara default, hingga semua tindakan skrip Robo diselesaikan (atau setidaknya dicoba), skrip Robo akan tetap aktif. Uji Robo akan terus mencoba mencocokkan tindakan skrip Robo setiap kali memilih tindakan yang akan dilakukan. Skrip Robo menerapkan teknik berikut untuk meningkatkan keandalan:
Teknik | Deskripsi |
Pencocokan sebagian | Jika tindakan skrip Robo saat ini tidak dapat dicocokkan sepenuhnya, kriteria pencocokan akan dilonggarkan dan pencocokan akan dicoba lagi. Pencocokan sebagian tidak mempertimbangkan deskripsi elemen terluar saat mencocokkan widget UI target tindakan skrip Robo.
Jika pencocokan sebagian berhasil, tindakan skrip Robo yang sesuai akan dilakukan seperti biasa. Teknik ini mendukung skenario yang menyebabkan perubahan struktur aplikasi, misalnya, antara versi aplikasi, saat elemen layar diatur ulang. |
Melewatkan tindakan saat ini | Jika tindakan skrip Robo saat ini tidak dapat dicocokkan sepenuhnya atau sebagian, Robo akan mencoba mencocokkan tindakan skrip Robo berikutnya. Jika tindakan berikutnya sepenuhnya atau sebagian cocok, Uji Robo akan melewatkan (dan tidak pernah kembali ke) tindakan skrip Robo saat ini dan melakukan tindakan selanjutnya.
Teknik ini mendukung skenario saat perilaku aplikasi berubah antar-versi atau tidak stabil, misalnya, saat dialog yang terputus-putus mungkin muncul di layar yang berbeda selama perekaman versus pemutaran ulang skrip Robo. |
Menangguhkan | Jika tindakan skrip Robo saat ini atau selanjutnya tidak dapat dicocokkan sepenuhnya atau sebagian, skrip Robo untuk sementara ditangguhkan dan Uji Robo akan memilih tindakan yang akan dilakukan dengan menggunakan strategi lainnya. Setelah tindakan ini selesai, Uji Robo akan melanjutkan eksekusi skrip Robo.
Selama tindakan skrip Robo saat ini atau selanjutnya tidak dapat dicocokkan, skrip Robo akan tetap ditangguhkan untuk sejumlah tindakan. Dengan demikian, skrip Robo tidak harus menjadi prolog untuk Uji Robo, dan Anda dapat menyelingi tindakan skrip Robo dengan tindakan Uji Robo standar. Teknik ini mendukung skenario saat perilaku aplikasi tidak stabil, atau saat perubahan di antara versi aplikasi cukup besar sehingga Uji Robo perlu "mengisi kekurangan" dengan tindakan standarnya. |
Prioritas
Jika skrip Robo mencapai maxNumberOfRuns
, skrip tersebut tidak dapat lagi dipicu dalam crawl tertentu. Jika lebih dari satu skrip Robo dapat dipicu oleh konteks saat ini, prioritas akan diberikan dengan memilih, dalam urutan berikut, skrip Robo yang:
- Memiliki atribut
contextDescriptor
. - Memiliki
priority
tertinggi (secara default, semua skrip Robo memilikipriority
eksekusi yang sama, yaitu1
). - Muncul paling awal dalam daftar skrip Robo, jika prioritas skrip Robo sama.
Berikut adalah contoh file dengan tiga skrip Robo yang melakukan tindakan yang sama dan dipicu oleh kondisi yang sama, yaitu aplikasi yang sedang diuji berada di latar depan:
[
{
"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
}
]
}
]
Jika aplikasi yang sedang diuji berjalan di latar depan, Robo memicu hal berikut secara berurutan:
"Robo script 2"
karena memiliki prioritas tertinggi."Robo script 1"
karena skrip tersebut muncul lebih awal di antara skrip Robo berprioritas sama yang berlaku dan tersisa."Robo script 3"
sebagai skrip Robo terakhir yang berlaku.
Operasi berulang
Secara default, Robo memicu skrip Robo paling banyak sekali selama crawling. Ini dapat disesuaikan melalui atribut maxNumberOfRuns
.
Berikut adalah contoh skrip Robo yang membawa aplikasi yang sedang diuji ke latar belakang hingga 10 kali:
{
"id": 1000,
"maxNumberOfRuns": 10,
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "GO_HOME"
}
]
}
Tahap crawling
Skrip Robo berlaku pada berbagai tahap crawling Robo tertentu:
Tahap crawling | Deskripsi |
pre_crawl
|
Sebelum Robo diluncurkan dan mulai meng-crawl aplikasi yang sedang diuji. |
post_crawl
|
Setelah Robo selesai meng-crawl aplikasi yang sedang diuji. |
crawl
|
Tahap crawling utama, saat Robo meng-crawl aplikasi yang sedang diuji. |
close_screen
|
Saat Robo mencoba kembali (backtrack) dari layar tertentu, ketika semua tindakan yang memungkinkan di layar ini telah dijelajahi. Secara default, Robo menekan kembali, dan ini tidak diinginkan dalam beberapa skenario. |
Jika atribut crawlStage
dari suatu skrip Robo tidak ditentukan, atribut tersebut secara tersirat adalah crawl
.
Berikut adalah contoh skrip Robo yang menghapus data pengguna aplikasi yang sedang diuji sebelum Robo mulai meng-crawl-nya:
{
"id": 1000,
"crawlStage": "pre_crawl",
"actions": [
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
]
}
Berikut adalah contoh skrip Robo yang menginstruksikan Robo untuk mengklik "Cancel"
setiap kali mencoba untuk kembali (backtrack) dari dialog konfirmasi:
{
"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"
}
]
}
]
}
Tindakan kondisional
Skrip Robo dapat berisi tindakan kondisional. Tindakan kondisional memiliki tiga atribut tambahan yang menjelaskan cara Robo melakukan tindakan tersebut:
Atribut | Deskripsi |
priority
|
Prioritas tindakan kondisional ini dibandingkan dengan tindakan kondisional lainnya dalam skrip Robo yang memuatnya. Secara default, semua
tindakan kondisional memiliki prioritas 1 .
|
maxNumberOfRuns
|
Frekuensi tindakan kondisional ini dapat dilakukan selama satu eksekusi skrip Robo yang memuatnya. Secara default, semua tindakan kondisional dapat dilakukan paling banyak sekali dalam satu eksekusi skrip Robo yang berisi tindakan tersebut. |
contextDescriptor
|
Konteks/kondisi yang memicu tindakan kondisional ini. Atribut ini memiliki struktur yang sama dan menawarkan kemampuan yang sama dengan [contextDescriptor skrip Robo](#context-descriptor). |
Saat dipicu, skrip Robo melakukan tindakan non-kondisional satu per satu sesuai urutan kemunculan. Jika skrip Robo berisi tindakan kondisional, skrip tersebut akan dipertimbangkan setiap kali sebelum memilih tindakan non-kondisional yang akan dilakukan. Jika tindakan kondisional dipicu dan dipilih berdasarkan prioritasnya dan jumlah operasi yang tersisa, skrip Robo akan melakukan tindakan kondisional ini. Jika tidak, skrip Robo akan melakukan tindakan non-kondisional berikut. Agar valid, skrip Robo harus berisi setidaknya satu tindakan non-kondisional.
Berikut adalah contoh skrip Robo yang tidak kondisional dengan tindakan kondisional yang menutup dialog pop-up jika muncul kapan saja selama eksekusi skrip 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
}
}
Mengabaikan tindakan
Skrip Robo dapat berisi instruksi bagi Robo untuk mengabaikan widget UI tertentu atau semua widget UI di layar tertentu. Instruksi ini diwakili sebagai mengabaikan "tindakan" dengan eventType
ELEMENT_IGNORED
dan ALL_ELEMENTS_IGNORED
secara bersamaan.
Setiap kali atribut contextDescriptor
dari skrip Robo yang berisi tindakan mengabaikan cocok dengan layar tertentu, Robo tidak berinteraksi dengan widget UI apa pun yang ditargetkan melalui tindakan pengabaiannya (kecuali jika beberapa tindakan skrip Robo lainnya membuat Robo melakukan tindakan pada salah satu widget UI yang diabaikan).
Skrip Robo dapat berisi campuran tindakan mengabaikan, kondisional, dan non-kondisional. Tidak seperti tindakan skrip Robo lainnya, tindakan mengabaikan akan diterapkan asalkan contextDescriptor
skrip Robo yang memuatnya cocok dengan layar selama crawling Robo, terlepas dari nilai atribut priority
dan maxNumberOfRuns
.
Berikut adalah contoh file dengan dua skrip Robo. Skrip Robo pertama membuat Robo mengabaikan semua widget UI di layar yang berisi widget UI dengan ID resource "my.app.package:id/ignored_screen"
. Skrip Robo kedua membuat Robo mengabaikan widget UI yang ID resource-nya cocok dengan ekspresi reguler Java ".*:id/done"
di layar yang berisi widget UI dengan ID resource "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"
}
]
}
]
}
]
Dukungan RecyclerView dan AdapterView
Turunan widget RecyclerView dan AdapterView dimuat secara dinamis dan mungkin ditampilkan dengan banyak tindakan menggeser dari layar saat ini. Ukuran layar dan jumlah tindakan geser yang diperlukan untuk membuka turunan ini berbeda untuk faktor bentuk perangkat yang berbeda. Oleh karena itu, mengandalkan posisi data turunan akan jauh lebih efektif dan bersifat mutlak. Mengandalkan jumlah tindakan geser yang diperlukan untuk menampilkan turunan ini ke layar, lalu menggunakan posisi layarnya, dianggap sebagai pendekatan yang kurang efektif.
Oleh karena itu, skrip Robo menangkap posisi data mutlak turunan RecyclerView yang merupakan target tindakan skrip Robo sebagai recyclerViewChildPosition
. Skrip Robo juga menangkap posisi data mutlak turunan AdapterView yang menjadi target tindakan skrip Robo sebagai adapterViewChildPosition
.
Tindakan pada turunan RecyclerView dan AdapterView dilakukan dalam langkah-langkah berikut:
Uji Robo memastikan bahwa turunan yang sesuai ditampilkan di layar melalui tindakan pemosisian pada RecyclerView atau AdapterView yang memuatnya.
Uji Robo menjalankan tindakan yang direkam secara langsung pada elemen turunan, karena sudah ditampilkan di layar.
Berikut adalah contoh tindakan klik pada turunan 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
}
]
}
Berikut adalah contoh tindakan klik pada turunan 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
}
]
}
Merekam skrip Robo di Android Studio dan menjalankannya di Test Lab
Anda dapat membuat skrip Robo di Android Studio, yang menyimpan skrip sebagai file JSON. Selanjutnya, Anda dapat mengupload file JSON ke Firebase Test Lab dengan aplikasi tersebut dan menjalankan pengujian dengan semestinya.
Saat Anda menjalankan Uji Robo dengan lampiran skrip, Uji Robo akan menjalankan tindakan yang telah ditulis dalam skrip terlebih dahulu, kemudian menjelajahi aplikasi seperti biasa.
Untuk membuat file JSON skrip Robo di Android Studio, ikuti langkah-langkah dalam Merekam skrip Robo menggunakan Test Lab di Android Studio.
Tindakan skrip Robo
Atribut opsional umum berikut berlaku untuk semua tindakan:
description
- membantu melacak eksekusi tindakan skrip Robo ini dalam output Uji Robo.
Pernyataan
Jika kondisi yang dinyatakan benar, skrip Robo akan melanjutkan ke tindakan berikutnya, yang dapat berupa pernyataan lain. Jika tidak, eksekusi skrip Robo akan dihentikan karena pernyataan yang gagal.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "ASSERTION"
|
-- |
contextDescriptor
|
Menjelaskan konteks atau kondisi yang dinyatakan. Atribut ini memiliki struktur yang sama dan menawarkan kemampuan yang serupa dengan contextDescriptor skrip Robo. |
Berikut adalah contoh pernyataan skrip Robo yang memeriksa apakah aplikasi yang sedang diuji berjalan di latar depan:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
Berikut adalah contoh pernyataan skrip Robo yang memeriksa apakah widget UI
dengan ID resource "com.google.samples.apps.topeka:id/done"
ada
di layar:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
Berikut adalah contoh pernyataan skrip Robo yang memeriksa
bahwa "Settings"
TIDAK terdeteksi di layar menggunakan OCR:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
Klik
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
eventType
|
Menentukan jenis tindakan skrip Robo. |
"eventType": "VIEW_CLICKED"
|
Mengklik elemen target aplikasi yang sedang diuji. |
"eventType": "SOFT_KEYBOARD_CLICK"
|
Mengklik elemen target dari keyboard virtual. |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK"
|
Mengklik elemen acak keyboard virtual hingga
maxNumberOfRuns kali.
|
"eventType": "LIST_ITEM_CLICKED"
|
Digunakan oleh perekam skrip Robo di Android Studio untuk mengklik item daftar. |
elementDescriptors
|
Mengidentifikasi widget UI yang diklik menggunakan hierarki UI Android.
Tidak dapat muncul bersamaan dengan visionText .
|
visionText
|
Mengidentifikasi elemen yang diklik menggunakan OCR. Tidak dapat muncul bersamaan dengan
elementDescriptors .
|
maxNumberOfRuns
|
Menentukan frekuensi klik acak pada elemen keyboard virtual,
jika eventType adalah SOFT_KEYBOARD_RANDOM_CLICK .
Nilai defaultnya adalah 1 .
|
Berikut adalah contoh tindakan skrip Robo yang mengklik tombol dengan ID resource "com.google.samples.apps.topeka:id/done"
:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
Berikut adalah contoh tindakan skrip Robo yang mengklik "Privacy Policy"
yang terdeteksi di layar menggunakan OCR:
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
Berikut adalah contoh tindakan skrip Robo yang mengklik elemen keyboard virtual dengan deskripsi konten "Emoji button"
:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
Berikut adalah contoh tindakan skrip Robo yang mengklik elemen keyboard virtual acak hingga lima kali:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
Menonaktifkan keyboard virtual
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "DISABLE_KEYBOARD"
|
-- |
Berikut adalah contoh tindakan skrip Robo yang menonaktifkan keyboard virtual:
{
"eventType": "DISABLE_KEYBOARD"
}
Menjalankan perintah shell adb
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "ADB_SHELL_COMMAND"
|
-- |
command
|
Perintah shell Android Debug Bridge (adb) yang akan dijalankan. |
Atribut berikut bersifat opsional:
expectedOutputRegex
- output yang diharapkan dari perintah sebagai ekspresi reguler Java. Jika output-nya tidak cocok, tindakan skrip Robo akan gagal. Secara default, string ini kosong, yang berarti output tidak diperiksa.
Berikut adalah contoh tindakan skrip Robo yang menghapus data pengguna aplikasi yang sedang diuji:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
Memberikan izin
Tindakan ini direkam oleh perekam skrip Robo di Android Studio untuk kompatibilitas mundur dengan Espresso Test Recorder. Uji Robo memberikan semua izin ke aplikasi yang sedang diuji di awal setiap crawling, sehingga tindakan ini tidak beroperasi. JANGAN gunakan tindakan ini dalam skrip Robo.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "PERMISSIONS_REQUEST"
|
-- |
Mengabaikan semua elemen di layar
Tindakan ini akan membuat Robo mengabaikan semua elemen di layar mana pun yang memicu skrip Robo yang dimuatnya.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "ALL_ELEMENTS_IGNORED"
|
-- |
Berikut adalah contoh tindakan skrip Robo yang membuat Robo mengabaikan semua elemen di layar:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
Mengabaikan suatu elemen
Tindakan ini akan membuat Robo mengabaikan suatu elemen (atau elemen-elemen) yang cocok dengan elementDescriptors
yang ditentukan.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "ELEMENT_IGNORED"
|
-- |
elementDescriptors
|
Mengidentifikasi widget UI yang diabaikan menggunakan hierarki UI Android. |
Atribut berikut bersifat opsional:
ignoreChildren
- jika ditetapkan ketrue
, Robo juga akan mengabaikan semua turunan dari widget UI yang diabaikan. Secara default, nilainya adalahfalse
.
Berikut adalah contoh tindakan skrip Robo yang membuat Robo mengabaikan semua elemen, yang deskripsi kontennya diawali dengan "Avatar"
:
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
Memasukkan teks
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
eventType
|
Menentukan jenis tindakan skrip Robo. |
"eventType": "VIEW_TEXT_CHANGED"
|
Memasukkan teks tertentu ke dalam widget UI target. |
"eventType": "ENTER_TEXT"
|
memasukkan teks yang ditentukan ke dalam widget UI target, lalu mengirim peristiwa KEYCODE_ENTER ke widget UI ini.
|
elementDescriptors
|
Mengidentifikasi widget UI target yang menggunakan hierarki UI Android. |
replacementText
|
Teks yang akan dimasukkan ke dalam widget UI target. |
Berikut adalah contoh tindakan skrip Robo yang memasukkan "John"
ke dalam widget UI dengan ID resource "com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Klik lama
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "VIEW_LONG_CLICKED"
|
-- |
elementDescriptors
|
Mengidentifikasi widget UI target yang menggunakan hierarki UI Android. Tidak dapat muncul
bersamaan dengan visionText .
|
visionText
|
Mengidentifikasi elemen yang diklik panjang menggunakan OCR. Tidak dapat muncul bersamaan dengan
elementDescriptors .
|
Atribut berikut bersifat opsional:
delayTime
- menentukan durasi penekanan klik lama, dalam milidetik.
Berikut adalah contoh tindakan skrip Robo yang melakukan klik berdurasi lima detik pada widget UI dengan deskripsi konten "Avatar 8"
:
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
Melakukan gestur satu titik
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
"eventType": "ONE_POINT_GESTURE"
|
-- |
coordinates
|
Dua koordinat untuk gestur satu titik, yang diformat sebagai "(x1,y1)->(x2,y2)" sebagai persentase atau piksel. |
Atribut berikut bersifat opsional:
dragAndDrop
- jika ditetapkan ketrue
, gestur satu titik akan melakukan tindakan tarik lalu lepas. Secara default, nilainya adalahfalse
.
Berikut adalah contoh tindakan gestur satu titik skrip Robo yang melakukan tindakan geser ke bawah:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
Melakukan gestur dua titik
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
"eventType": "TWO_POINT_GESTURE"
|
-- |
coordinates
|
Empat koordinat untuk gestur dua titik, yang diformat sebagai "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" sebagai persentase atau piksel. |
Berikut adalah contoh tindakan skrip Robo yang melakukan gestur cubit ke arah luar:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
Melakukan tindakan IME
Tindakan ini menekan tombol tindakan saat ini, misalnya, selanjutnya, selesai, dan menelusuri, di Editor Metode Input (IME) untuk widget UI target yang ditentukan.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
"eventType": "PRESSED_EDITOR_ACTION"
|
-- |
elementDescriptors
|
Mengidentifikasi widget UI target yang menggunakan hierarki UI Android. |
Berikut adalah contoh tindakan skrip Robo yang melakukan tindakan IME
pada widget UI dengan ID resource
"com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Menekan kembali
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
eventType
|
Menentukan jenis tindakan skrip Robo. |
"eventType": "PRESSED_BACK"
|
Mengirim peristiwa KEYCODE_BACK ke perangkat.
|
"eventType": "PRESSED_BACK_EMULATOR_28"
|
Digunakan oleh perekam skrip Robo di Android Studio untuk melakukan tindakan tekan kembali di emulator API 28. |
Berikut adalah contoh tindakan skrip Robo yang melakukan tindakan tekan kembali:
{
"eventType": "PRESSED_BACK"
}
Menekan beranda
Tindakan ini akan mengirim peristiwa KEYCODE_HOME
ke perangkat.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "GO_HOME"
|
-- |
Berikut adalah contoh tindakan skrip Robo yang menekan beranda:
{
"eventType": "GO_HOME"
}
Men-scroll elemen agar muncul
Tindakan ini akan membuat Uji Robo men-scroll maju widget UI yang cocok dengan elementDescriptors
yang ditentukan hingga widget UI yang cocok dengan childElementDescriptors
yang ditentukan muncul di layar, atau widget yang di-scroll dapat tidak bisa lagi di-scroll, atau mencapai jumlah maksimum 50 scroll.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "ELEMENT_SCROLL_INTO_VIEW"
|
-- |
elementDescriptors
|
Mengidentifikasi widget UI yang di-scroll menggunakan hierarki UI Android. |
childElementDescriptors
|
Mengidentifikasi widget UI yang akan di-scroll menggunakan hierarki UI Android. |
Berikut adalah contoh tindakan skrip Robo yang men-scroll widget UI dengan ID resource "my.app.package:id/scrollable_card_container"
hingga widget UI dengan teks "Orange"
muncul di layar (atau tidak ada scroll lagi yang bisa dilakukan, atau mencapai jumlah maksimum 50 scroll):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
Tindakan geser
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
"eventType": "VIEW_SWIPED"
|
-- |
swipeDirection
|
Menentukan arah tindakan geser:
|
elementDescriptors
|
Mengidentifikasi widget UI target yang menggunakan hierarki UI Android. |
Berikut adalah contoh tindakan skrip Robo yang menggeser ke atas widget UI dengan ID resource "my.app.package:id/custom_content"
:
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
Mengambil screenshot
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "TAKE_SCREENSHOT"
|
-- |
screenshotName
|
Menentukan nama file screenshot. |
Berikut adalah contoh tindakan skrip Robo yang mengambil screenshot:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
Mengetuk satu titik di layar
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
"eventType": "POINT_TAP"
|
-- |
pointTapXCoordinate
|
Koordinat X piksel dari titik yang diketuk. Tidak dapat muncul bersamaan dengan
pointTapXPercent dan pointTapYPercent .
|
pointTapYCoordinate
|
Koordinat Y piksel dari titik yang diketuk. Tidak dapat muncul bersamaan dengan
pointTapXPercent dan pointTapYPercent .
|
pointTapXPercent
|
Koordinat X persentase dari titik yang diketuk. Tidak dapat muncul bersamaan dengan
pointTapXCoordinate dan pointTapYCoordinate .
|
pointTapYPercent
|
Koordinat Y persentase dari titik yang diketuk. Tidak dapat muncul bersamaan dengan
pointTapXCoordinate dan pointTapYCoordinate .
|
Berikut adalah contoh tindakan skrip Robo yang mengetuk di tengah layar:
{
"eventType": "POINT_TAP",
"pointTapXPercent": 50,
"pointTapYPercent": 50
}
Mengetuk titik dalam elemen
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "POINT_TAP_ELEMENT"
|
-- |
pointTapXPercent
|
Koordinat X persentase dalam elemen target. |
pointTapYPercent
|
Koordinat Y persentase dalam elemen target. |
elementDescriptors
|
Mengidentifikasi widget UI target yang menggunakan hierarki UI Android. |
Berikut adalah contoh tindakan skrip Robo yang memindahkan penggeser pencari ke kanan:
{
"eventType": "POINT_TAP_ELEMENT",
"pointTapXPercent": 80,
"pointTapYPercent": 50,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/my_seekbar"
}
]
}
Menghentikan crawling
Tindakan ini akan menghentikan Uji Robo.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
---|---|
"eventType": "TERMINATE_CRAWL"
|
-- |
Berikut adalah contoh tindakan skrip Robo yang menghentikan Uji Robo:
{
"eventType": "TERMINATE_CRAWL"
}
Tindakan menunggu
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "DELAYED_MESSAGE_POSTED"
|
-- |
delayTime
|
Menentukan durasi tunggu, dalam milidetik. |
Berikut adalah contoh tindakan skrip Robo yang menunggu selama tiga detik:
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
Menunggu elemen
Tindakan ini membuat Uji Robo menunggu elemen muncul di layar hingga waktu tunggu yang ditentukan.
Tabel berikut mencantumkan atribut yang diperlukan:
Atribut | Deskripsi |
"eventType": "WAIT_FOR_ELEMENT"
|
-- |
delayTime
|
Menentukan waktu tunggu, dalam milidetik. |
elementDescriptors
|
Mengidentifikasi widget UI yang ditunggu menggunakan hierarki UI Android. |
Berikut adalah contoh tindakan skrip Robo yang menunggu hingga 30 detik
widget UI dengan ID resource
"my.app.package:id/confirmation_button"
muncul di layar:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}