Panduan referensi skrip Robo

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 ke true, 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 ke false, skrip Robo tidak akan menampilkan notifikasi di layar di awal dan akhir eksekusinya. Secara default, nilainya adalah true.
  • postscript - opsi eksekusi yang diterapkan setelah skrip Robo selesai:
    • terminate - jika ditetapkan ke true, 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:

  1. Memiliki atribut contextDescriptor.
  2. Memiliki priority tertinggi (secara default, semua skrip Robo memiliki priority eksekusi yang sama, yaitu 1).
  3. 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:

  1. "Robo script 2" karena memiliki prioritas tertinggi.
  2. "Robo script 1" karena skrip tersebut muncul lebih awal di antara skrip Robo berprioritas sama yang berlaku dan tersisa.
  3. "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:

  1. Uji Robo memastikan bahwa turunan yang sesuai ditampilkan di layar melalui tindakan pemosisian pada RecyclerView atau AdapterView yang memuatnya.

  2. 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 ke true, Robo juga akan mengabaikan semua turunan dari widget UI yang diabaikan. Secara default, nilainya adalah false.

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 ke true, gestur satu titik akan melakukan tindakan tarik lalu lepas. Secara default, nilainya adalah false.

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:
  • Left
  • Right
  • Up
  • Down
  • Forward - baik Down maupun Right, bergantung pada kemampuan scroll vertikal atau horizontal dari widget UI target.
  • Backward - baik Up maupun Left, bergantung pada kemampuan scroll vertikal atau horizontal dari widget UI target.
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"
    }
  ]
}

Langkah berikutnya