Questo documento fornisce informazioni di riferimento sugli script Robo, tra cui struttura, capacità, utilizzo, registrazione e azioni. Gli script Robo sono test che automatizzano le attività manuali di controllo qualità (QA) per le app mobili e consentono l'integrazione continua (CI) e le strategie di test pre-lancio. Uno script Robo è un file JSON che descrive una sequenza di interfaccia utente (UI) e altre azioni.
Puoi creare uno script Robo nei seguenti modi:
- Usa la funzione di registrazione dello script Robo.
- Crea lo script Robo manualmente.
- Registra lo script Robo e poi modificalo manualmente.
Per ulteriori informazioni sull'utilizzo degli script Robo, consulta Eseguire uno script Robo .
Lo script Robo viene fornito al test Robo insieme ad altri input come l'APK (Android Application Package) dell'app sotto test.
Di seguito è riportato un esempio di uno script Robo che consente a un utente di accedere a un'app, che viene attivato all'avvio dell'app in fase di test:
[
{
"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"
}
]
}
]
}
]
Se in un file è presente un singolo script Robo e ha la condizione di attivazione predefinita app_under_test_shown
, come nell'esempio precedente, puoi specificare lo script Robo in un file utilizzando un formato più semplice, proprio come una sequenza delle sue azioni:
[
{
"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"
}
]
}
]
Struttura
Uno script Robo ha diversi attributi che descrivono come Robo lo esegue. La maggior parte di questi attributi è facoltativa con valori predefiniti predefiniti:
Attributo | Descrizione |
id | Un numero intero che aiuta a tenere traccia di questo script Robo negli output di scansione. |
description | Simile a id ma più descrittivo. |
crawlStage | La fase di una scansione Robo applica questo script Robo a. Per impostazione predefinita, è la fase di scansione principale. |
priority | La priorità di questo script Robo rispetto ad altri script Robo. Per impostazione predefinita, tutti gli script Robo hanno una priorità di 1 . |
maxNumberOfRuns | Specifica quante volte durante una scansione Robo può eseguire questo script Robo. Per impostazione predefinita, Robo può eseguire uno script Robo una volta. |
contextDescriptor | Descrive il contesto/condizione che attiva questo script Robo. Se omessa, la condizione di attivazione di questo script Robo è considerata sempre soddisfatta; in altre parole, lo script Robo è incondizionato. |
actions | Tutte le azioni di questo script Robo. |
Un singolo file contiene una raccolta di uno o più script Robo.
Di seguito è riportato un esempio di un file con due script Robo incondizionati, ciascuno con una singola azione che viene eseguita una volta all'inizio di una scansione:
[
{
"id": 1000,
"description": "My first Robo script",
"actions": [
{
"eventType": "DISABLE_KEYBOARD"
}
]
},
{
"id": 1001,
"description": "My second Robo script",
"actions": [
{
"eventType": "PRESSED_BACK"
}
]
}
]
Descrittore di contesto
Un descrittore di contesto definisce il contesto/condizione che attiva uno script Robo utilizzando uno o una combinazione di più attributi:
Attributo | Descrizione |
---|---|
"condition": "element_present" | Controlla che sullo schermo sia presente un widget dell'interfaccia utente che corrisponde elementDescriptors o al testo specificato da visionText . |
"condition": "element_disabled" | Verifica che sullo schermo sia presente un widget dell'interfaccia utente che corrisponde elementDescriptors e con cui non è possibile interagire. |
"condition": "element_checked" | Verifica che un widget dell'interfaccia utente che corrisponde elementDescriptors sia presente sullo schermo e sia selezionato. |
"condition": "app_under_test_shown" | Verifica che l'app sottoposta a test sia in esecuzione in primo piano. |
"condition": "default_launcher_shown" | Verifica che venga visualizzata la schermata iniziale di un dispositivo, il che significa che nessuna app è in esecuzione in primo piano. |
"condition": "non_roboscript_action_performed" | Verifica che l'ultima azione eseguita dal test Robo non sia un'azione dello script Robo. |
negateCondition | Se impostato su true , nega la condition . Ad esempio, puoi utilizzare questo attributo per verificare se un widget dell'interfaccia utente NON è presente sullo schermo o se l'app in fase di test NON è in esecuzione in primo piano. |
elementDescriptors | Uno o più descrittori di elementi che identificano un widget dell'interfaccia utente sullo schermo. Viene utilizzato in combinazione con le condizioni element_present , element_disabled e element_checked . Si escludono a vicenda con visionText . Per ulteriori informazioni, consulta Descrittori di elementi . |
visionText | Il testo sullo schermo viene rilevato utilizzando l'API di riconoscimento ottico dei caratteri (OCR). visionText viene utilizzato in combinazione con la condizione element_present . Si escludono a vicenda con elementDescriptors . |
Di seguito è riportato un esempio di uno script Robo attivato da un widget dell'interfaccia utente con un ID risorsa "my.app.package:id/page_header"
presente sullo schermo:
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/page_header"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Settings"
}
]
}
]
}
Di seguito è riportato un esempio di uno script Robo attivato dalla "Privacy Policy"
rilevata dal riconoscimento ottico dei caratteri (OCR):
{
"id": 1000,
"description": "Vision text Robo script",
"contextDescriptor": {
"condition": "element_present",
"visionText": "Privacy Policy"
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
]
}
Di seguito è riportato un esempio di uno script Robo che attende 5 secondi dopo ogni azione Robo senza script:
{
"contextDescriptor": {
"condition": "non_roboscript_action_performed"
},
"maxNumberOfRuns" : 1000,
"actions" : [
{
"eventType" : "DELAYED_MESSAGE_POSTED",
"delayTime" : 5000
}]
}
Azioni
Ogni azione in uno script Robo è rappresentata come un insieme di una o più coppie attributo-valore, descritte nella tabella seguente:
Attributo | Descrizione |
eventType | Specifica il tipo di azione, ad esempio clic, modifica del testo e così via. Obbligatorio per ogni azione. |
elementDescriptors | Descrittori che identificano un widget dell'interfaccia utente. Obbligatorio per tutte le azioni che hanno un widget dell'interfaccia utente di destinazione, come fare clic su un particolare pulsante. |
optional | Se impostato su true , questa azione viene ignorata quando non può essere eseguita. Ad esempio, questa azione viene saltata quando non riesce a trovare il widget dell'interfaccia utente di destinazione su uno schermo, senza fallire lo script Robo che lo contiene. Per impostazione predefinita, il valore è false . |
replacementText | Il testo da inserire nel widget dell'interfaccia utente di destinazione. Richiesto per le azioni di modifica del testo. |
swipeDirection | Specifica la direzione dello scorrimento. Obbligatorio per le azioni di scorrimento. |
delayTime | Specifica il tempo di attesa, in millisecondi. Obbligatorio per le azioni di attesa. |
pointTapXCoordinate e pointTapYCoordinate | Le coordinate X e Y in pixel del punto toccato. Si escludono a vicenda con pointTapXPercent e pointTapYPercent . Obbligatorio per le azioni point tap. |
pointTapXPercent e pointTapYPercent | Le coordinate percentuali X e Y del punto toccato. Si escludono a vicenda con pointTapXCoordinate e pointTapYCoordinate . Obbligatorio per le azioni point tap. |
Di seguito è riportato un esempio di uno script Robo con due azioni senza widget dell'interfaccia utente di destinazione, il che significa che queste azioni non operano su un widget dell'interfaccia utente specifico:
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
Descrittori di elementi
Un descrittore di elemento identifica un widget dell'interfaccia utente utilizzando uno o più dei seguenti attributi identificativi:
Attributo | Descrizione |
className | – |
ancestorClassName | Nome della classe dell'antenato della gerarchia dell'interfaccia utente dell'elemento. Un antenato è uno qualsiasi dei nodi padre nella gerarchia dell'interfaccia utente dell'elemento, incluso l'elemento stesso. |
resourceId | – |
resourceIdRegex | Espressione regolare Java per la corrispondenza con resourceId . |
contentDescription | – |
contentDescriptionRegex | Espressione regolare Java per corrispondere contentDescription . |
text (che appare sullo schermo) | – |
textRegex | Espressione regolare Java per la corrispondenza con text . |
groupViewChildPosition , recyclerViewChildPosition o adapterViewChildPosition | Rappresenta la posizione figlio di un widget dell'interfaccia utente a seconda del tipo di widget padre. |
Spesso questi attributi non sono definiti, ad esempio un pulsante potrebbe non avere testo e descrizione del contenuto. Anche se sono presenti alcuni valori di attributo, potrebbero non essere univoci in una determinata schermata dell'app (incluso resourceId
).
Ad esempio, la differenziazione tra gli elementi di un elenco è comunemente possibile solo utilizzando le loro diverse posizioni figlio all'interno del widget principale. Ciò significa che l'utilizzo di un solo elemento descrittore per identificare un widget dell'interfaccia utente è in genere insufficiente. Pertanto, l'attributo elementDescriptors
di un'azione contiene una sequenza di descrittori di elementi ordinati in modo tale che il primo corrisponda al widget dell'interfaccia utente di destinazione, il secondo corrisponda al widget padre del widget dell'interfaccia utente di destinazione e così via. Il widget dell'interfaccia utente di destinazione di un'azione viene abbinato quando tutti i suoi descrittori di elementi corrispondono alla gerarchia secondaria del widget dell'interfaccia utente corrispondente.
Di seguito è riportato un esempio di uno script Robo con una modifica del testo e azioni di clic, che richiedono entrambe di identificare il widget dell'interfaccia utente di destinazione utilizzando i descrittori degli elementi forniti:
[
{
"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"
}
]
}
]
Opzioni di esecuzione
Facoltativamente, puoi aggiungere un prefisso all'elenco di azioni in uno script Robo con un oggetto JSON che specifica le opzioni di esecuzione per quello script Robo. Questa intestazione di configurazione inizia con la parola chiave roboscript
seguita da una rappresentazione JSON delle opzioni di esecuzione desiderate.
Gli script Robo supportano le seguenti opzioni di esecuzione:
-
executionMode
- opzioni di esecuzione applicate quando è in esecuzione uno script Robo:-
strict
- se impostato sutrue
, lo script Robo non utilizza la corrispondenza parziale, salta l'azione corrente e la sospensione . Cioè, lo script Robo viene eseguito come un normale test di strumentazione e fallisce non appena una qualsiasi delle sue azioni non può essere eseguita.
-
-
postscript
- opzioni di esecuzione applicate dopo il completamento di uno script Robo:-
terminate
- se impostato sutrue
, Robo test interrompe la scansione dopo il completamento dello script Robo.
-
Di seguito è riportato un esempio di uno script Robo eseguito in modalità strict
che rimane inattivo per tre secondi, dopodiché la scansione si interrompe:
"roboscript": {
"executionMode": {
"strict": true
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
Parametri del modello
Un parametro modello è un segnaposto in uno script Robo che viene sostituito con il valore effettivo quando il test Robo carica lo script Robo per l'esecuzione. I parametri del modello sono preceduti da un doppio carattere di sottolineatura seguito da un segno di percentuale e sono preceduti da un segno di percentuale seguito da un doppio carattere di sottolineatura.
Gli script Robo supportano il seguente parametro del modello:
-
__%APP_PACKAGE_NAME%__
- il nome del pacchetto dell'app in fase di test.
Di seguito è riportato un esempio di uno script Robo che interrompe il processo di test dell'app:
[
{
"eventType": "ADB_SHELL_COMMAND",
"command": "am force-stop __%APP_PACKAGE_NAME%__"
}
]
Commenti
Uno script Robo può contenere righe di commento, ovvero righe che iniziano con #
o //
.
Di seguito è riportato un esempio di uno script Robo con un paio di commenti:
# Confirm a user account.
[
{
// Click the DONE button.
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
]
Capacità
Per impostazione predefinita, finché tutte le azioni di uno script Robo non vengono completate (o almeno tentate), lo script Robo rimane attivo. Il test Robo continua a cercare di abbinare un'azione dello script Robo ogni volta che sceglie un'azione da eseguire. Lo script Robo utilizza le seguenti tecniche per aumentare la robustezza:
Tecnica | Descrizione |
Corrispondenza parziale | Se non è possibile trovare una corrispondenza completa con l'azione dello script Robo corrente, i criteri di corrispondenza vengono attenuati e la corrispondenza viene ritentata. La corrispondenza parziale non considera il descrittore dell'elemento più esterno durante la corrispondenza con il widget dell'interfaccia utente di destinazione di un'azione di script Robo. Se la corrispondenza parziale riesce, l'azione dello script Robo corrispondente viene eseguita come di consueto. Questa tecnica supporta scenari in cui la struttura dell'app cambia, ad esempio tra le versioni dell'app, quando gli elementi dello schermo vengono riorganizzati. |
Salta l'azione corrente | Se l'azione dello script Robo corrente non può essere abbinata in tutto o in parte, Robo tenta di abbinare l'azione dello script Robo successiva. Se l'azione successiva corrisponde in tutto o in parte, il test Robo salta (e non ritorna mai) all'azione dello script Robo corrente ed esegue quella successiva. Questa tecnica supporta scenari in cui il comportamento dell'app cambia tra le versioni o è instabile, ad esempio, quando una finestra di dialogo intermittente potrebbe apparire su schermate diverse durante la registrazione rispetto alla riproduzione di uno script Robo. |
Sospendere | Se né le azioni dello script Robo correnti né quelle successive possono essere abbinate in tutto o in parte, lo script Robo viene temporaneamente sospeso e il test Robo seleziona un'azione da eseguire utilizzando le sue altre strategie. Al termine di questa azione, Robo test riprende l'esecuzione dello script Robo. Finché le azioni dello script Robo correnti o successive non possono essere abbinate, lo script Robo rimane sospeso per un numero qualsiasi di azioni. Pertanto, gli script Robo non devono necessariamente essere un prologo per un test Robo e puoi alternare le azioni dello script Robo con azioni di test Robo standard. Questa tecnica supporta scenari in cui il comportamento dell'app è instabile o quando le modifiche tra le versioni dell'app sono sufficientemente ampie da richiedere al test Robo di "riempire le lacune" con le sue azioni standard. |
Priorità
Se uno script Robo raggiunge il suo maxNumberOfRuns
, non può più essere attivato in una determinata scansione. Se più di uno script Robo può essere attivato dal contesto corrente, la priorità viene data scegliendo, nel seguente ordine, lo script Robo che:
- Ha un attributo
contextDescriptor
. - Ha la
priority
più alta (per impostazione predefinita, tutti gli script Robo hanno la stessapriority
di esecuzione di1
). - Appare per primo nell'elenco degli script Robo, se le priorità degli script Robo sono le stesse.
Di seguito è riportato un esempio di un file con tre script Robo che eseguono la stessa azione e vengono attivati dalla stessa condizione: l'app in fase di test è in primo piano:
[
{
"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
}
]
}
]
Quando l'app in fase di test è in primo piano, Robo attiva quanto segue, in ordine:
-
"Robo script 2"
perché ha la massima priorità. -
"Robo script 1"
perché appare prima tra i rimanenti script Robo applicabili con la stessa priorità. -
"Robo script 3"
come ultimo script Robo applicabile.
Corse ripetute
Per impostazione predefinita, Robo attiva uno script Robo al massimo una volta durante una scansione. Questo può essere regolato tramite l'attributo maxNumberOfRuns
.
Di seguito è riportato un esempio di uno script Robo che porta l'app in fase di test in background fino a 10 volte:
{
"id": 1000,
"maxNumberOfRuns": 10,
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "GO_HOME"
}
]
}
Fase di scansione
Gli script Robo sono applicabili in diverse fasi di una determinata scansione Robo:
Fase di scansione | Descrizione |
pre_crawl | Prima che Robo si avvii e inizi a eseguire la scansione dell'app in fase di test. |
post_crawl | Dopo che Robo ha terminato la scansione dell'app sottoposta a test. |
crawl | La fase di scansione principale, quando Robo esegue la scansione dell'app sottoposta a test. |
close_screen | Quando Robo cerca di tornare indietro (backtrack) da una data schermata, quando vengono esplorate tutte le possibili azioni su questa schermata. Per impostazione predefinita, Robo preme indietro, il che è indesiderabile in alcuni scenari. |
Se l'attributo crawlStage
di uno script Robo non è specificato, è implicito che sia crawl
.
Di seguito è riportato un esempio di uno script Robo che cancella i dati utente dell'app in fase di test prima che Robo inizi a scansionarli:
{
"id": 1000,
"crawlStage": "pre_crawl",
"actions": [
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
]
}
Di seguito è riportato un esempio di uno script Robo che indica a Robo di fare clic su "Cancel"
ogni volta che tenta di tornare indietro (backtrack) da una finestra di dialogo di conferma:
{
"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"
}
]
}
]
}
Azioni condizionali
Uno script Robo può contenere azioni condizionali. Le azioni condizionali hanno tre attributi aggiuntivi che descrivono come Robo le esegue:
Attributo | Descrizione |
priority | La priorità di questa azione condizionale rispetto ad altre azioni condizionali all'interno dello script Robo che la contiene. Per impostazione predefinita, tutte le azioni condizionali hanno una priorità di 1 . |
maxNumberOfRuns | Quante volte questa azione condizionale può essere eseguita durante un'esecuzione dello script Robo che la contiene. Per impostazione predefinita, tutte le azioni condizionali possono essere eseguite al massimo una volta in un'unica esecuzione dello script Robo che le contiene. |
contextDescriptor | Il contesto/condizione che attiva questa azione condizionale. Ha la stessa struttura e offre funzionalità simili a [il contextDescriptor dello script Robo](#context-descriptor). |
Quando viene attivato, uno script Robo esegue le sue azioni non condizionali una per una in ordine di apparizione. Se uno script Robo contiene azioni condizionali, queste vengono prese in considerazione ogni volta prima di scegliere un'azione non condizionale da eseguire. Se un'azione condizionale viene attivata e selezionata in base alla sua priorità e al numero rimanente di esecuzioni, lo script Robo esegue questa azione condizionale. In caso contrario, lo script Robo esegue la seguente azione non condizionale. Per essere valido, uno script Robo deve contenere almeno un'azione non condizionale.
Di seguito è riportato un esempio di uno script Robo incondizionato con un'azione condizionale che chiude le finestre di dialogo popup se vengono visualizzate in qualsiasi momento durante l'esecuzione dello script 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
}
}
Ignorare le azioni
Uno script Robo può contenere istruzioni affinché Robo ignori specifici widget dell'interfaccia utente o tutti i widget dell'interfaccia utente su una schermata particolare. Queste istruzioni sono rappresentate come "azioni" ignoranti con eventType
ELEMENT_IGNORED
e ALL_ELEMENTS_IGNORED
corrispondentemente.
Ogni volta che l'attributo contextDescriptor
di uno script Robo contenente azioni da ignorare corrisponde a una determinata schermata, Robo non interagisce con nessun widget dell'interfaccia utente preso di mira dalle sue azioni da ignorare (a meno che qualche altra azione dello script Robo faccia eseguire a Robo un'azione su uno dei widget dell'interfaccia utente ignorati).
Uno script Robo può contenere un mix di azioni ignoranti, condizionali e non condizionali. A differenza di altre azioni dello script Robo, le azioni ignoranti vengono applicate fintanto che contextDescriptor
dello script Robo che le contiene corrisponde a una schermata durante una scansione Robo, indipendentemente dai valori degli attributi priority
e maxNumberOfRuns
.
Di seguito è riportato un esempio di un file con due script Robo. Il primo script Robo fa in modo che Robo ignori tutti i widget dell'interfaccia utente su uno schermo contenente un widget dell'interfaccia utente con un ID risorsa "my.app.package:id/ignored_screen"
. Il secondo script Robo fa in modo che Robo ignori i widget dell'interfaccia utente i cui ID risorsa corrispondono a regex Java ".*:id/done"
su una schermata contenente un widget dell'interfaccia utente con un ID risorsa "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"
}
]
}
]
}
]
Supporto RecyclerView e AdapterView
I widget figli di RecyclerView e AdapterView vengono caricati dinamicamente e potrebbero essere visualizzati a molti passaggi dalla schermata corrente. Poiché le dimensioni di uno schermo e il numero di passaggi necessari per accedere a questo bambino sono diversi per i diversi fattori di forma del dispositivo, è molto più affidabile fare affidamento sulla posizione dei dati del bambino, che è assoluta. È un approccio meno robusto fare affidamento sul numero di passaggi necessari per portare questo bambino sullo schermo e quindi utilizzare la sua posizione sullo schermo.
Pertanto, lo script Robo acquisisce le posizioni dei dati assoluti dei bambini RecyclerView che sono obiettivi delle azioni dello script Robo come recyclerViewChildPosition
. Lo script Robo acquisisce anche le posizioni dei dati assoluti dei figli AdapterView che sono obiettivi delle azioni dello script Robo come adapterViewChildPosition
.
Le azioni sui figli RecyclerView e AdapterView vengono eseguite nei seguenti passaggi:
Il Robo test assicura che il bambino corrispondente venga visualizzato sullo schermo attraverso un'azione di posizionamento su RecyclerView o AdapterView che lo contiene.
Il robo test esegue l'azione registrata direttamente sull'elemento figlio, poiché è già visualizzato sullo schermo.
Di seguito è riportato un esempio di azione clic su un figlio 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
}
]
}
Di seguito è riportato un esempio di un'azione clic su un figlio 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
}
]
}
Registra uno script Robo in Android Studio ed eseguilo in Test Lab
Puoi creare uno script Robo in Android Studio, che salva lo script come file JSON. Puoi quindi caricare il file JSON in Firebase Test Lab con l'applicazione ed eseguire il test di conseguenza.
Quando esegui un test Robo con uno script allegato, il test Robo passa prima attraverso le azioni pre-script e quindi esplora l'app come al solito.
Per creare un file JSON di script Robo in Android Studio, segui i passaggi in Registrare uno script Robo utilizzando Test Lab in Android Studio .
Azioni di script Robo
Il seguente attributo facoltativo comune si applica a tutte le azioni:
-
description
: aiuta a tenere traccia dell'esecuzione di questa azione dello script Robo negli output del test Robo.
Asserzione
Se la condizione asserita è vera, lo script Robo continua con l'azione successiva, che potrebbe essere un'altra asserzione. In caso contrario, l'esecuzione dello script Robo viene interrotta a causa di un'asserzione non riuscita.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "ASSERTION" | -- |
contextDescriptor | Descrive il contesto o la condizione asserita. Ha la stessa struttura e offre funzionalità simili a contextDescriptor dello script Robo . |
Di seguito è riportato un esempio di un'asserzione di script Robo che verifica che l'app in fase di test sia in primo piano:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
Di seguito è riportato un esempio di un'asserzione di script Robo che controlla che un widget dell'interfaccia utente con l'ID risorsa "com.google.samples.apps.topeka:id/done"
sia presente su una schermata:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
Di seguito è riportato un esempio di un'asserzione di script Robo che verifica che "Settings"
NON venga rilevato su uno schermo utilizzando l'OCR:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
Clic
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
eventType | Specifica il tipo di azione dello script Robo. |
"eventType": "VIEW_CLICKED" | Fa clic sull'elemento di destinazione dell'app sottoposta a test. |
"eventType": "SOFT_KEYBOARD_CLICK" | Fa clic sull'elemento di destinazione della tastiera software. |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" | Fa clic su elementi casuali della tastiera virtuale fino a maxNumberOfRuns volte. |
"eventType": "LIST_ITEM_CLICKED" | Utilizzato dal registratore di script Robo in Android Studio per fare clic sugli elementi dell'elenco. |
elementDescriptors | Identifica il widget dell'interfaccia utente su cui è stato fatto clic utilizzando la gerarchia dell'interfaccia utente di Android. Si escludono a vicenda con visionText . |
visionText | Identifica l'elemento cliccato tramite OCR. Si escludono a vicenda con elementDescriptors . |
maxNumberOfRuns | Specifica quante volte fare clic su un elemento casuale della tastiera software, quando eventType è SOFT_KEYBOARD_RANDOM_CLICK . Il valore predefinito è 1 . |
Di seguito è riportato un esempio di un'azione di script Robo che fa clic su un pulsante con l'ID risorsa "com.google.samples.apps.topeka:id/done"
:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
Di seguito è riportato un esempio di un'azione dello script Robo che fa clic su "Privacy Policy"
rilevata su uno schermo utilizzando l'OCR:
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
Di seguito è riportato un esempio di un'azione di script Robo che fa clic su un elemento della tastiera virtuale con una descrizione del contenuto "Emoji button"
:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
Di seguito è riportato un esempio di un'azione di script Robo che fa clic su elementi casuali della tastiera software fino a cinque volte:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
Disabilita la tastiera virtuale
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "DISABLE_KEYBOARD" | -- |
Di seguito è riportato un esempio di un'azione di script Robo che disabilita la tastiera virtuale:
{
"eventType": "DISABLE_KEYBOARD"
}
Eseguire il comando adb shell
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "ADB_SHELL_COMMAND" | -- |
command | Il comando shell Android Debug Bridge (adb) da eseguire. |
Di seguito è riportato un esempio di un'azione di script Robo che cancella i dati utente dell'app in fase di test:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
Concedi le autorizzazioni
Questa azione viene registrata dal registratore di script Robo in Android Studio per compatibilità con le versioni precedenti di Espresso Test Recorder . Il test Robo concede tutte le autorizzazioni all'app sottoposta a test all'inizio di ogni scansione e, pertanto, questa azione non è operativa. NON utilizzare questa azione nei tuoi script Robo.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "PERMISSIONS_REQUEST" | -- |
Ignora tutti gli elementi su uno schermo
Questa azione fa sì che Robo ignori tutti gli elementi su qualsiasi schermata che attiva lo script Robo contenente.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "ALL_ELEMENTS_IGNORED" | -- |
Di seguito è riportato un esempio di un'azione di script Robo che fa ignorare a Robo tutti gli elementi su uno schermo:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
Ignora un elemento
Questa azione fa in modo che Robo ignori uno o più elementi che corrispondono all'elemento elementDescriptors
specificato.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "ELEMENT_IGNORED" | -- |
elementDescriptors | Identifica i widget dell'interfaccia utente ignorati utilizzando la gerarchia dell'interfaccia utente di Android. |
Di seguito è riportato un esempio di un'azione di script Robo che fa ignorare a Robo tutti gli elementi, le cui descrizioni del contenuto iniziano con "Avatar"
:
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
Testo di input
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
eventType | Specifica il tipo di azione dello script Robo. |
"eventType": "VIEW_TEXT_CHANGED" | Inserisce il testo specificato nel widget dell'interfaccia utente di destinazione. |
"eventType": "ENTER_TEXT" | inserisce il testo specificato nel widget dell'interfaccia utente di destinazione e quindi invia un evento KEYCODE_ENTER a questo widget dell'interfaccia utente. |
elementDescriptors | Identifica il widget dell'interfaccia utente di destinazione utilizzando la gerarchia dell'interfaccia utente di Android. |
replacementText | Il testo da inserire nel widget dell'interfaccia utente di destinazione. |
Di seguito è riportato un esempio di un'azione di script Robo che inserisce "John"
in un widget dell'interfaccia utente con l'ID risorsa "com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Clic lungo
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "VIEW_LONG_CLICKED" | -- |
elementDescriptors | Identifica il widget dell'interfaccia utente di destinazione utilizzando la gerarchia dell'interfaccia utente di Android. |
Il seguente attributo è facoltativo:
-
delayTime
- specifica per quanto tempo dura la pressione di un clic lungo, in millisecondi.
Di seguito è riportato un esempio di un'azione di script Robo che esegue un clic di cinque secondi su un widget dell'interfaccia utente con la descrizione del contenuto "Avatar 8"
:
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
Esegui un gesto a un punto
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
"eventType": "ONE_POINT_GESTURE" | -- |
coordinates | Due coordinate per un gesto a un punto, formattate come "(x1,y1)->(x2,y2)" come percentuali o pixel. |
Il seguente attributo è facoltativo:
-
dragAndDrop
: se impostato sutrue
, il gesto a un punto esegue un'azione di trascinamento della selezione. Per impostazione predefinita, èfalse
.
Di seguito è riportato un esempio di un'azione gestuale a un punto dello script Robo che esegue uno scorrimento verso il basso:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
Esegui un gesto a due punti
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
"eventType": "TWO_POINT_GESTURE" | -- |
coordinates | Quattro coordinate per un gesto a due punti, formattate come "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" come percentuali o pixel. |
Di seguito è riportato un esempio di un'azione di script Robo che esegue un gesto di pizzicamento:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
Eseguire un'azione IME
Questa azione preme il pulsante dell'azione corrente, ad esempio Avanti, Fatto e Cerca, nell'IME (Input Method Editor) per il widget dell'interfaccia utente di destinazione specificato.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
"eventType": "PRESSED_EDITOR_ACTION" | -- |
elementDescriptors | Identifica il widget dell'interfaccia utente di destinazione utilizzando la gerarchia dell'interfaccia utente di Android. |
Di seguito è riportato un esempio di un'azione di script Robo che esegue un'azione IME su un widget dell'interfaccia utente con l'ID risorsa "com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Premi indietro
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
eventType | Specifica il tipo di azione dello script Robo. |
"eventType": "PRESSED_BACK" | Invia un evento KEYCODE_BACK al dispositivo. |
"eventType": "PRESSED_BACK_EMULATOR_28" | Utilizzato dal registratore di script Robo in Android Studio per premere nuovamente sugli emulatori API 28. |
Di seguito è riportato un esempio di un'azione di script Robo che preme indietro:
{
"eventType": "PRESSED_BACK"
}
Premi casa
Questa azione invia un evento KEYCODE_HOME
al dispositivo.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "GO_HOME" | -- |
Di seguito è riportato un esempio di un'azione di script Robo che preme home:
{
"eventType": "GO_HOME"
}
Scorri un elemento nella vista
Questa azione fa sì che Robo test scorra in avanti il widget dell'interfaccia utente che corrisponde agli elementDescriptors
specificati fino a quando il widget dell'interfaccia utente che corrisponde ai childElementDescriptors
specificati non è presente sullo schermo oppure il widget a scorrimento non può più essere fatto scorrere o viene raggiunto il numero massimo di 50 scorrimenti.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "ELEMENT_SCROLL_INTO_VIEW" | -- |
elementDescriptors | Identifica il widget dell'interfaccia utente a scorrimento utilizzando la gerarchia dell'interfaccia utente di Android. |
childElementDescriptors | Identifica il widget dell'interfaccia utente a cui scorrere utilizzando la gerarchia dell'interfaccia utente di Android. |
Di seguito è riportato un esempio di un'azione di script Robo che fa scorrere il widget dell'interfaccia utente con l'ID risorsa "my.app.package:id/scrollable_card_container"
finché il widget dell'interfaccia utente con il testo "Orange"
non è presente sullo schermo (o non è più possibile scorrere da eseguire, o si raggiunge il numero massimo di 50 scorrimenti):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
Scorri
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
"eventType": "VIEW_SWIPED" | -- |
swipeDirection | Specifica la direzione dello scorrimento:
|
elementDescriptors | Identifica il widget dell'interfaccia utente di destinazione utilizzando la gerarchia dell'interfaccia utente di Android. |
Di seguito è riportato un esempio di un'azione di script Robo che fa scorrere verso l'alto un widget dell'interfaccia utente con l'ID risorsa "my.app.package:id/custom_content"
:
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
Fai uno screenshot
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "TAKE_SCREENSHOT" | -- |
screenshotName | Specifica il nome del file dello screenshot. |
Di seguito è riportato un esempio di un'azione di script Robo che acquisisce uno screenshot:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
Tocca un punto sullo schermo
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
"eventType": "POINT_TAP" | -- |
pointTapXCoordinate | La coordinata X pixel del punto toccato. Si escludono a vicenda con pointTapXPercent e pointTapYPercent . |
pointTapYCoordinate | La coordinata Y in pixel del punto toccato. Si escludono a vicenda con pointTapXPercent e pointTapYPercent . |
pointTapXPercent | La percentuale della coordinata X del punto toccato. Si escludono a vicenda con pointTapXCoordinate e pointTapYCoordinate . |
pointTapYPercent | La percentuale della coordinata Y del punto toccato. Si escludono a vicenda con pointTapXCoordinate e pointTapYCoordinate . |
Di seguito è riportato un esempio di un'azione dello script Robo che tocca al centro di uno schermo:
{
"eventType": "POINT_TAP",
"pointTapXPercent": 50,
"pointTapYPercent": 50
}
Toccare un punto all'interno di un elemento
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "POINT_TAP_ELEMENT" | -- |
pointTapXPercent | La percentuale della coordinata X all'interno dell'elemento di destinazione. |
pointTapYPercent | La coordinata percentuale Y all'interno dell'elemento di destinazione. |
elementDescriptors | Identifica il widget dell'interfaccia utente di destinazione utilizzando la gerarchia dell'interfaccia utente di Android. |
Di seguito è riportato un esempio di un'azione di script Robo che sposta il cursore di una barra di ricerca verso destra:
{
"eventType": "POINT_TAP_ELEMENT",
"pointTapXPercent": 80,
"pointTapYPercent": 50,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/my_seekbar"
}
]
}
Termina la scansione
Questa azione interrompe il test Robo.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
---|---|
"eventType": "TERMINATE_CRAWL" | -- |
Di seguito è riportato un esempio di un'azione di script Robo che interrompe un test Robo:
{
"eventType": "TERMINATE_CRAWL"
}
Aspettare
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "DELAYED_MESSAGE_POSTED" | -- |
delayTime | Specifica il tempo di attesa, in millisecondi. |
Di seguito è riportato un esempio di un'azione di script Robo che attende tre secondi:
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
Aspetta un elemento
Questa azione fa sì che Robo test attenda che un elemento appaia sullo schermo fino al timeout specificato.
La seguente tabella elenca gli attributi obbligatori:
Attributo | Descrizione |
"eventType": "WAIT_FOR_ELEMENT" | -- |
delayTime | Specifica il timeout di attesa, in millisecondi. |
elementDescriptors | Identifica il widget dell'interfaccia utente atteso utilizzando la gerarchia dell'interfaccia utente di Android. |
Di seguito è riportato un esempio di un'azione di script Robo che attende fino a 30 secondi prima che un widget dell'interfaccia utente con l'ID risorsa "my.app.package:id/confirmation_button"
appaia sullo schermo:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}
Prossimi passi
,Questo documento fornisce informazioni di riferimento sugli script Robo, tra cui struttura, capacità, utilizzo, registrazione e azioni. Gli script Robo sono test che automatizzano le attività manuali di controllo qualità (QA) per le app mobili e consentono l'integrazione continua (CI) e le strategie di test pre-lancio. Uno script Robo è un file JSON che descrive una sequenza di interfaccia utente (UI) e altre azioni.
Puoi creare uno script Robo nei seguenti modi:
- Usa la funzione di registrazione dello script Robo.
- Crea lo script Robo manualmente.
- Registra lo script Robo e poi modificalo manualmente.
Per ulteriori informazioni sull'utilizzo degli script Robo, consulta Eseguire uno script Robo .
Lo script Robo viene fornito al test Robo insieme ad altri input come l'APK (Android Application Package) dell'app sotto test.
Di seguito è riportato un esempio di uno script Robo che consente a un utente di accedere a un'app, che viene attivato all'avvio dell'app in fase di test:
[
{
"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"
}
]
}
]
}
]
Se in un file è presente un singolo script Robo e ha la condizione di attivazione predefinita app_under_test_shown
, come nell'esempio precedente, puoi specificare lo script Robo in un file utilizzando un formato più semplice, proprio come una sequenza delle sue azioni:
[
{
"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"
}
]
}
]
Struttura
Uno script Robo ha diversi attributi che descrivono come Robo lo esegue. La maggior parte di questi attributi è facoltativa con valori predefiniti predefiniti:
Attributo | Descrizione |
id | Un numero intero che aiuta a tenere traccia di questo script Robo negli output di scansione. |
description | Simile a id ma più descrittivo. |
crawlStage | La fase di una scansione Robo applica questo script Robo a. Per impostazione predefinita, è la fase di scansione principale. |
priority | La priorità di questo script Robo rispetto ad altri script Robo. Per impostazione predefinita, tutti gli script Robo hanno una priorità di 1 . |
maxNumberOfRuns | Specifica quante volte durante una scansione Robo può eseguire questo script Robo. Per impostazione predefinita, Robo può eseguire uno script Robo una volta. |
contextDescriptor | Descrive il contesto/condizione che attiva questo script Robo. Se omessa, la condizione di attivazione di questo script Robo è considerata sempre soddisfatta; in altre parole, lo script Robo è incondizionato. |
actions | Tutte le azioni di questo script Robo. |
Un singolo file contiene una raccolta di uno o più script Robo.
Di seguito è riportato un esempio di un file con due script Robo incondizionati, ciascuno con una singola azione che viene eseguita una volta all'inizio di una scansione:
[
{
"id": 1000,
"description": "My first Robo script",
"actions": [
{
"eventType": "DISABLE_KEYBOARD"
}
]
},
{
"id": 1001,
"description": "My second Robo script",
"actions": [
{
"eventType": "PRESSED_BACK"
}
]
}
]
Descrittore di contesto
Un descrittore di contesto definisce il contesto/condizione che attiva uno script Robo utilizzando uno o una combinazione di più attributi:
Attributo | Descrizione |
---|---|
"condition": "element_present" | Controlla che sullo schermo sia presente un widget dell'interfaccia utente che corrisponde elementDescriptors o al testo specificato da visionText . |
"condition": "element_disabled" | Verifica che sullo schermo sia presente un widget dell'interfaccia utente che corrisponde elementDescriptors e con cui non è possibile interagire. |
"condition": "element_checked" | Verifica che un widget dell'interfaccia utente che corrisponde elementDescriptors sia presente sullo schermo e sia selezionato. |
"condition": "app_under_test_shown" | Verifica che l'app sottoposta a test sia in esecuzione in primo piano. |
"condition": "default_launcher_shown" | Verifica che venga visualizzata la schermata iniziale di un dispositivo, il che significa che nessuna app è in esecuzione in primo piano. |
"condition": "non_roboscript_action_performed" | Verifica che l'ultima azione eseguita dal test Robo non sia un'azione dello script Robo. |
negateCondition | Se impostato su true , nega la condition . Ad esempio, puoi utilizzare questo attributo per verificare se un widget dell'interfaccia utente NON è presente sullo schermo o se l'app in fase di test NON è in esecuzione in primo piano. |
elementDescriptors | Uno o più descrittori di elementi che identificano un widget dell'interfaccia utente sullo schermo. Viene utilizzato in combinazione con le condizioni element_present , element_disabled e element_checked . Si escludono a vicenda con visionText . Per ulteriori informazioni, consulta Descrittori di elementi . |
visionText | Il testo sullo schermo viene rilevato utilizzando l'API di riconoscimento ottico dei caratteri (OCR). visionText viene utilizzato in combinazione con la condizione element_present . Si escludono a vicenda con elementDescriptors . |
The following is an example of a Robo script that is triggered by a UI widget with a resource ID "my.app.package:id/page_header"
being present on the screen:
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/page_header"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Settings"
}
]
}
]
}
The following is an example of a Robo script that is triggered by "Privacy Policy"
detected by Optical Character Recognition (OCR):
{
"id": 1000,
"description": "Vision text Robo script",
"contextDescriptor": {
"condition": "element_present",
"visionText": "Privacy Policy"
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
]
}
The following is an example of a Robo script that waits for 5 seconds after every non-script Robo action:
{
"contextDescriptor": {
"condition": "non_roboscript_action_performed"
},
"maxNumberOfRuns" : 1000,
"actions" : [
{
"eventType" : "DELAYED_MESSAGE_POSTED",
"delayTime" : 5000
}]
}
Actions
Each action in a Robo script is represented as a bundle of one or more attribute-value pairs, which are described in the following table:
Attribute | Description |
eventType | Specifies the type of the action, for example, click, text edit, etc. Required for every action. |
elementDescriptors | Descriptors that identify a UI widget. Required for all actions that have a target UI widget, like clicking a particular button. |
optional | If set to true , this action is skipped when it cannot be performed. For example, this action is skipped when it can't find its target UI widget on a screen– without failing the containing Robo script. By default, the value is false . |
replacementText | The text to input into the target UI widget. Required for text editing actions. |
swipeDirection | Specifies the direction of the swipe. Required for swipe actions. |
delayTime | Specifies how long to wait, in milliseconds. Required for wait actions. |
pointTapXCoordinate and pointTapYCoordinate | The pixel X and Y coordinates of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent . Required for point tap actions. |
pointTapXPercent and pointTapYPercent | The percentage X and Y coordinates of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate . Required for point tap actions. |
The following is an example of a Robo script with two actions without target UI widgets, which means that these actions don't operate on a specific UI widget:
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
Element descriptors
An element descriptor identifies a UI widget using one or more of the following identifying attributes:
Attribute | Description |
className | – |
ancestorClassName | Class name of the element's UI hierarchy ancestor. An ancestor is any of the parent nodes in the element's UI hierarchy, including the element itself. |
resourceId | – |
resourceIdRegex | Java regular expression to match resourceId . |
contentDescription | – |
contentDescriptionRegex | Java regular expression to match contentDescription . |
text (that appears on the screen) | – |
textRegex | Java regular expression to match text . |
groupViewChildPosition , recyclerViewChildPosition , or adapterViewChildPosition | Represents a UI widget's child position depending on the kind of its parent widget. |
Frequently, these attributes are undefined, for example, a button might not have text and content description. Even if some attribute values are present, they might not be unique on a given app screen (including resourceId
).
For example, differentiating between items of a list is commonly possible only by using their different child positions within their parent widget. This means that using just one element descriptor to identify a UI widget is usually insufficient. Therefore, an action's elementDescriptors
attribute contains a sequence of element descriptors that are ordered such that the first one corresponds to the target UI widget, the second one corresponds to the target UI widget's parent widget, and so on. An action's target UI widget is matched when all of its element descriptors match the corresponding UI widget sub-hierarchy.
The following is an example of a Robo script with a text change and click actions, both of which require you to identify the target UI widget using the provided element descriptors:
[
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"className": "android.support.v7.widget.AppCompatEditText",
"groupViewChildPosition": 0,
"resourceId": "com.google.samples.apps.topeka:id/first_name"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 0
},
{
"className": "android.support.design.widget.TextInputLayout",
"groupViewChildPosition": 1
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "android.support.design.widget.FloatingActionButton",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/done"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/content"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 0,
"resourceId": "com.google.samples.apps.topeka:id/sign_in_content"
}
]
}
]
Execution options
You can optionally prefix the list of actions in a Robo script with a JSON object that specifies the execution options for that Robo script. This configuration header starts with the roboscript
keyword followed by a JSON representation of the desired execution options.
Robo scripts support the following execution options:
-
executionMode
- execution options applied when a Robo script is running:-
strict
- if set totrue
, Robo script does not employ partial matching, skipping current action, and suspension . That is, the Robo script is executed as a regular instrumentation test and fails as soon as any of its actions cannot be performed.
-
-
postscript
- execution options applied after a Robo script is completed:-
terminate
- if set totrue
, Robo test stops crawling after the Robo script is completed.
-
The following is an example of a Robo script executed in strict
mode that sleeps for three seconds, after which the crawl stops:
"roboscript": {
"executionMode": {
"strict": true
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
Template parameters
A template parameter is a placeholder in a Robo script that is replaced with the actual value when Robo test loads that Robo script for execution. Template parameters are prefixed with a double underscore followed by a percent sign, and are postfixed with a percent sign followed by a double underscore.
Robo scripts support the following template parameter:
-
__%APP_PACKAGE_NAME%__
- the package name of the app-under-test.
The following is an example of a Robo script that stops the app-under-test process:
[
{
"eventType": "ADB_SHELL_COMMAND",
"command": "am force-stop __%APP_PACKAGE_NAME%__"
}
]
Comments
A Robo script can contain comment lines, which are lines that start with #
or //
.
The following is an example of a Robo script with a couple of comments:
# Confirm a user account.
[
{
// Click the DONE button.
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
]
Capabilities
By default, until all actions of a Robo script are completed (or at least attempted), the Robo script remains active. Robo test keeps trying to match a Robo script action whenever it is picking an action to perform. Robo script employs the following techniques to increase robustness:
Technique | Description |
Partial matching | If the current Robo script action cannot be fully matched, the matching criteria are relaxed and the matching is retried. The partial matching doesn't consider the outermost element descriptor while matching the target UI widget of a Robo script action. If the partial matching succeeds, the corresponding Robo script action is performed as usual. This technique supports scenarios in which the app structure changes, for example, between app versions, when screen elements are rearranged. |
Skip current action | If the current Robo script action cannot be fully or partially matched, Robo tries to match the subsequent Robo script action. If the subsequent action fully or partially matches, Robo test skips (and never returns to) the current Robo script action and performs the subsequent one. This technique supports scenarios when app behavior changes between versions or is flaky, for example, when an intermittent dialog might appear at different screens during recording versus replaying of a Robo script. |
Suspend | If neither current nor subsequent Robo script actions can be fully or partially matched, Robo script is temporarily suspended and Robo test picks an action to perform using its other strategies. After this action is completed, Robo test resumes executing the Robo script. As long as current or subsequent Robo script actions cannot be matched, Robo script remains suspended for any number of actions. Thus, Robo scripts do not necessarily need to be a prologue for a Robo test, and you can intersperse Robo script actions with standard Robo test actions. This technique supports scenarios when app behavior is flaky, or when changes between app versions are large enough that Robo test needs to "fill in the gaps" with its standard actions. |
Priorities
If a Robo script reaches its maxNumberOfRuns
, it can no longer be triggered in a given crawl. If more than one Robo script can be triggered by the current context, priority is given by choosing, in the following order, the Robo script that:
- Has a
contextDescriptor
attribute. - Has the highest
priority
(by default, all Robo scripts have the same executionpriority
of1
). - Appears earliest in the list of the Robo scripts, if Robo scripts' priorities are the same.
The following is an example of a file with three Robo scripts that perform the same action and are triggered by the same condition - the app-under-test being in the foreground:
[
{
"id": 1000,
"description": "Robo script 1",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
},
{
"id": 1001,
"description": "Robo script 2",
"priority": "2",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
},
{
"id": 1002,
"description": "Robo script 3",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
}
]
When the app-under-test is in the foreground, Robo triggers the following, in order:
-
"Robo script 2"
because it has the highest priority. -
"Robo script 1"
because it appears earlier among the remaining applicable Robo scripts with the same priority. -
"Robo script 3"
as the last applicable Robo script.
Repeated runs
By default, Robo triggers a Robo script at most once during a crawl. This can be adjusted via the maxNumberOfRuns
attribute.
The following is an example of a Robo script that brings the app-under-test into the background for up to 10 times:
{
"id": 1000,
"maxNumberOfRuns": 10,
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "GO_HOME"
}
]
}
Crawl stage
Robo scripts are applicable at different stages of a given Robo crawl:
Crawl stage | Description |
pre_crawl | Before Robo launches and starts crawling the app-under-test. |
post_crawl | After Robo finishes crawling the app-under-test. |
crawl | The main crawl stage, when Robo crawls the app-under-test. |
close_screen | When Robo tries to return back (backtrack) from a given screen, when all possible actions on this screen are explored. By default, Robo presses back, which is undesirable in some scenarios. |
If the crawlStage
attribute of a Robo script is unspecified, it is implied to be crawl
.
The following is an example of a Robo script that clears the app-under-test user data before Robo starts crawling it:
{
"id": 1000,
"crawlStage": "pre_crawl",
"actions": [
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
]
}
The following is an example of a Robo script that instructs Robo to click "Cancel"
whenever it tries to return back (backtrack) from a confirmation dialog:
{
"id": 1000,
"crawlStage": "close_screen",
"maxNumberOfRuns": 999,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_dialog"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Cancel"
}
]
}
]
}
Conditional actions
A Robo script can contain conditional actions. Conditional actions have three additional attributes that describe how Robo performs them:
Attribute | Description |
priority | The priority of this conditional action in comparison to other conditional actions within its containing Robo script. By default, all conditional actions have a priority of 1 . |
maxNumberOfRuns | How many times this conditional action can be performed during one execution of its containing Robo script. By default, all conditional actions can be performed at most once in a single execution of their containing Robo script. |
contextDescriptor | The context/condition that triggers this conditional action. It has the same structure and offers similar capabilities as [the Robo script's contextDescriptor](#context-descriptor). |
When triggered, a Robo script performs its non-conditional actions one by one in order of appearance. If a Robo script contains conditional actions, then they are considered every time before picking a non-conditional action to perform. If any conditional action is triggered and picked based on its priority and the remaining number of runs, then the Robo script performs this conditional action. Otherwise, the Robo script performs the following non-conditional action. To be valid, a Robo script must contain at least one non-conditional action.
The following is an example of an unconditional Robo script with a conditional action that dismisses popup dialogs if they show up at any point during the Robo script execution:
{
"id": 1000,
"actions": [
{
"description": "Dismiss popup",
"maxNumberOfRuns": 100,
"contextDescriptor": {
"condition": "default_launcher_shown",
"negateCondition": true
},
"eventType": "GO_HOME"
},
{
"description": "Screen off",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 26"
},
{
"description": "Wait for 10 seconds",
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 10000
},
{
"description": "Screen on",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 82"
},
{
"description": "Wait for 10 seconds",
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 10000
}
}
Ignoring actions
A Robo script can contain instructions for Robo to ignore specific UI widgets or all UI widgets on a particular screen. These instructions are represented as ignoring "actions" with eventType
ELEMENT_IGNORED
and ALL_ELEMENTS_IGNORED
correspondingly.
Whenever the contextDescriptor
attribute of a Robo script containing ignoring actions matches a given screen, Robo does not interact with any UI widgets targeted by its ignoring actions (unless some other Robo script action makes Robo perform an action on one of the ignored UI widgets).
A Robo script can contain a mix of ignoring, conditional, and non-conditional actions. Unlike other Robo script actions, ignoring actions are applied as long as their containing Robo script's contextDescriptor
matches a screen during a Robo crawl, regardless of the values of the priority
and maxNumberOfRuns
attributes.
The following is an example of a file with two Robo scripts. The first Robo script makes Robo ignore all UI widgets on a screen containing a UI widget with a resource ID "my.app.package:id/ignored_screen"
. The second Robo script makes Robo ignore UI widgets whose resource IDs match Java regex ".*:id/done"
on a screen containing a UI widget with a resource ID "my.app.package:id/main_screen"
:
[
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/ignored_screen"
}
]
},
"actions": [
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
]
},
{
"id": 1001,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/main_screen"
}
]
},
"actions": [
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"resourceIdRegex": ".*:id/done"
}
]
}
]
}
]
RecyclerView and AdapterView support
Children of RecyclerView and AdapterView widgets are loaded dynamically and might be displayed many swipes away from the current screen. Since the size of a screen, and the number of swipes required to get to this child, is different for different device form factors, it is much more robust to rely on the child's data position, which is absolute. It is a less robust approach to rely on the number of swipes that are required to bring this child to the screen and then use its screen position.
Therefore, Robo script captures the absolute data positions of RecyclerView children that are targets of Robo script actions as recyclerViewChildPosition
. Robo script also captures the absolute data positions of AdapterView children that are targets of Robo script actions as adapterViewChildPosition
.
Actions on RecyclerView and AdapterView children are performed in the following steps:
Robo test ensures that the corresponding child is displayed on the screen through a positioning action on its containing RecyclerView or AdapterView.
Robo test performs the recorded action directly on the child element, since it is already displayed on the screen.
The following is an example of a click action on an AdapterView ( android.widget.GridView
) child:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "com.google.samples.apps.topeka.widget.AvatarView",
"adapterViewChildPosition": 5,
"resourceId": "com.google.samples.apps.topeka:id/avatar",
"contentDescription": "Avatar 6"
},
{
"className": "android.widget.GridView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/avatars"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 1
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
The following is an example of a click action on a RecyclerView ( android.support.v7.widget.RecyclerView
) child:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "android.support.v7.widget.AppCompatTextView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_title"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": 8,
"resourceId": "com.google.samples.apps.topeka:id/category_item"
},
{
"className": "android.support.v7.widget.RecyclerView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/categories"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_container"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
Record a Robo script in Android Studio and run it in Test Lab
You can create a Robo script in Android Studio, which saves the script as a JSON file. You can then upload the JSON file to Firebase Test Lab with the application and run the test accordingly.
When you run a Robo test with a script attached, Robo test first steps through your pre-scripted actions and then explores the app as usual.
To create a Robo script JSON file in Android Studio, follow the steps in Record a Robo script using Test Lab in Android Studio .
Robo script actions
The following common optional attribute applies to all actions:
-
description
- helps track execution of this Robo script action in Robo test outputs.
Assertion
If the asserted condition is true, the Robo script continues to the next action, which could be another assertion. Otherwise, the Robo script execution is halted due to a failed assertion.
The following table lists required attributes:
Attribute | Description |
"eventType": "ASSERTION" | -- |
contextDescriptor | Describes the asserted context or condition. It has the same structure and offers similar capabilities as the Robo script's contextDescriptor . |
The following is an example of a Robo script assertion that checks that the app-under-test is in the foreground:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
The following is an example of a Robo script assertion that checks that a UI widget with the resource ID "com.google.samples.apps.topeka:id/done"
is present on a screen:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
The following is an example of a Robo script assertion that checks that "Settings"
is NOT detected on a screen using OCR:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
Click
The following table lists required attributes:
Attribute | Description |
---|---|
eventType | Specifies the type of the Robo script action. |
"eventType": "VIEW_CLICKED" | Clicks the target element of the app-under-test. |
"eventType": "SOFT_KEYBOARD_CLICK" | Clicks the target element of the soft keyboard. |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" | Clicks random elements of the soft keyboard up to maxNumberOfRuns times. |
"eventType": "LIST_ITEM_CLICKED" | Used by the Robo script recorder in Android Studio for clicking list items. |
elementDescriptors | Identifies the clicked UI widget using the Android UI hierarchy. Mutually exclusive with visionText . |
visionText | Identifies the clicked element using OCR. Mutually exclusive with elementDescriptors . |
maxNumberOfRuns | Specifies how many times to click a random element of the soft keyboard, when eventType is SOFT_KEYBOARD_RANDOM_CLICK . The default value is 1 . |
The following is an example of a Robo script action that clicks a button with the resource ID "com.google.samples.apps.topeka:id/done"
:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
The following is an example of a Robo script action that clicks on "Privacy Policy"
detected on a screen using OCR:
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
The following is an example of a Robo script action that clicks a soft keyboard element with a content description "Emoji button"
:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
The following is an example of a Robo script action that clicks random soft keyboard elements up to five times:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
Disable soft keyboard
The following table lists required attributes:
Attribute | Description |
"eventType": "DISABLE_KEYBOARD" | -- |
The following is an example of a Robo script action that disables the soft keyboard:
{
"eventType": "DISABLE_KEYBOARD"
}
Execute adb shell command
The following table lists required attributes:
Attribute | Description |
"eventType": "ADB_SHELL_COMMAND" | -- |
command | The Android Debug Bridge (adb) shell command to execute. |
The following is an example of a Robo script action that clears the app-under-test user data:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
Grant permissions
This action is recorded by the Robo script recorder in Android Studio for backward compatibility with Espresso Test Recorder . Robo test grants all permissions to the app-under-test at the beginning of every crawl, and thus, this action is a no-op. Do NOT use this action in your Robo scripts.
The following table lists required attributes:
Attribute | Description |
"eventType": "PERMISSIONS_REQUEST" | -- |
Ignore all elements on a screen
This action makes Robo ignore all elements on any screen that triggers the containing Robo script.
The following table lists required attributes:
Attribute | Description |
"eventType": "ALL_ELEMENTS_IGNORED" | -- |
The following is an example of a Robo script action that makes Robo ignore all elements on a screen:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
Ignore an element
This action makes Robo ignore an element (or elements) that match the specified elementDescriptors
.
The following table lists required attributes:
Attribute | Description |
"eventType": "ELEMENT_IGNORED" | -- |
elementDescriptors | Identifies the ignored UI widget(s) using the Android UI hierarchy. |
The following is an example of a Robo script action that makes Robo ignore all elements, whose content descriptions start with "Avatar"
:
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
Input text
The following table lists required attributes:
Attribute | Description |
---|---|
eventType | Specifies the type of the Robo script action. |
"eventType": "VIEW_TEXT_CHANGED" | Inputs the given text into the target UI widget. |
"eventType": "ENTER_TEXT" | inputs the given text into the target UI widget and then sends a KEYCODE_ENTER event to this UI widget. |
elementDescriptors | Identifies the target UI widget using the Android UI hierarchy. |
replacementText | The text to input into the target UI widget. |
The following is an example of a Robo script action that inputs "John"
into a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Long click
The following table lists required attributes:
Attribute | Description |
"eventType": "VIEW_LONG_CLICKED" | -- |
elementDescriptors | Identifies the target UI widget using the Android UI hierarchy. |
The following attribute is optional:
-
delayTime
- specifies how long the press down of a long click lasts, in milliseconds.
The following is an example of a Robo script action that performs a five seconds-long click on a UI widget with content description "Avatar 8"
:
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
Perform a one-point gesture
The following table lists required attributes:
Attribute | Description |
---|---|
"eventType": "ONE_POINT_GESTURE" | -- |
coordinates | Two coordinates for a one-point gesture, formatted as "(x1,y1)->(x2,y2)" as percentages or pixels. |
The following attribute is optional:
-
dragAndDrop
- if set totrue
, the one-point gesture performs a drag-and-drop action. By default, it isfalse
.
The following is an example of a Robo script one-point gesture action that performs a swipe down:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
Perform a two-point gesture
The following table lists required attributes:
Attribute | Description |
---|---|
"eventType": "TWO_POINT_GESTURE" | -- |
coordinates | Four coordinates for a two-point gesture, formatted as "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" as percentages or pixels. |
The following is an example of a Robo script action that performs a pinch out gesture:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
Perform an IME action
This action presses the current action button, for example, next, done, and search, on the Input Method Editor (IME) for the specified target UI widget.
The following table lists required attributes:
Attribute | Description |
---|---|
"eventType": "PRESSED_EDITOR_ACTION" | -- |
elementDescriptors | Identifies the target UI widget using the Android UI hierarchy. |
The following is an example of a Robo script action that performs an IME action on a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Press back
The following table lists required attributes:
Attribute | Description |
eventType | Specifies the type of the Robo script action. |
"eventType": "PRESSED_BACK" | Sends a KEYCODE_BACK event to the device. |
"eventType": "PRESSED_BACK_EMULATOR_28" | Used by the Robo script recorder in Android Studio for pressing back on emulators API 28. |
The following is an example of a Robo script action that presses back:
{
"eventType": "PRESSED_BACK"
}
Press home
This action sends a KEYCODE_HOME
event to the device.
The following table lists required attributes:
Attribute | Description |
"eventType": "GO_HOME" | -- |
The following is an example of a Robo script action that presses home:
{
"eventType": "GO_HOME"
}
Scroll an element into view
This action makes Robo test scroll forward the UI widget that matches the specified elementDescriptors
until the UI widget that matches the specified childElementDescriptors
is present on the screen, or the scrolled widget can no longer be scrolled, or the max number of 50 scrolls is reached.
The following table lists required attributes:
Attribute | Description |
"eventType": "ELEMENT_SCROLL_INTO_VIEW" | -- |
elementDescriptors | Identifies the scrolled UI widget using the Android UI hierarchy. |
childElementDescriptors | Identifies the UI widget to scroll to using the Android UI hierarchy. |
The following is an example of a Robo script action that scrolls the UI widget with the resource ID "my.app.package:id/scrollable_card_container"
until the UI widget with text "Orange"
is present on the screen (or no more scrolls can be performed, or the max number of 50 scrolls is reached):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
Swipe
The following table lists required attributes:
Attribute | Description |
---|---|
"eventType": "VIEW_SWIPED" | -- |
swipeDirection | Specifies the direction of the swipe:
|
elementDescriptors | Identifies the target UI widget using the Android UI hierarchy. |
The following is an example of a Robo script action that swipes up a UI widget with the resource ID "my.app.package:id/custom_content"
:
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
Take screenshot
The following table lists required attributes:
Attribute | Description |
"eventType": "TAKE_SCREENSHOT" | -- |
screenshotName | Specifies the screenshot file name. |
The following is an example of a Robo script action that takes a screenshot:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
Tap a point on the screen
The following table lists required attributes:
Attribute | Description |
---|---|
"eventType": "POINT_TAP" | -- |
pointTapXCoordinate | The pixel X coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent . |
pointTapYCoordinate | The pixel Y coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent . |
pointTapXPercent | The percentage X coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate . |
pointTapYPercent | The percentage Y coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate . |
The following is an example of a Robo script action that taps in the middle of a screen:
{
"eventType": "POINT_TAP",
"pointTapXPercent": 50,
"pointTapYPercent": 50
}
Tap a point within an element
The following table lists required attributes:
Attribute | Description |
"eventType": "POINT_TAP_ELEMENT" | -- |
pointTapXPercent | The percentage X coordinate within the target element. |
pointTapYPercent | The percentage Y coordinate within the target element. |
elementDescriptors | Identifies the target UI widget using Android UI hierarchy. |
The following is an example of a Robo script action that moves a seekbar's slider to the right:
{
"eventType": "POINT_TAP_ELEMENT",
"pointTapXPercent": 80,
"pointTapYPercent": 50,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/my_seekbar"
}
]
}
Terminate crawl
This action stops the Robo test.
The following table lists required attributes:
Attribute | Description |
---|---|
"eventType": "TERMINATE_CRAWL" | -- |
The following is an example of a Robo script action that stops a Robo test:
{
"eventType": "TERMINATE_CRAWL"
}
Wait
The following table lists required attributes:
Attribute | Description |
"eventType": "DELAYED_MESSAGE_POSTED" | -- |
delayTime | Specifies how long to wait, in milliseconds. |
The following is an example of a Robo script action that waits for three seconds:
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
Wait for an element
This action makes Robo test wait for an element to appear on the screen up to the specified timeout.
The following table lists required attributes:
Attribute | Description |
"eventType": "WAIT_FOR_ELEMENT" | -- |
delayTime | Specifies the waiting timeout, in milliseconds. |
elementDescriptors | Identifies the waited-for UI widget using the Android UI hierarchy. |
The following is an example of a Robo script action that waits for up to 30 seconds for a UI widget with the resource ID "my.app.package:id/confirmation_button"
to appear on the screen:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}