En este documento, se proporciona información de referencia sobre las secuencias de comandos de Robo, lo que incluye la estructura, las capacidades, el uso, la grabación y las acciones. Las secuencias de comandos de Robo son pruebas que automatizan las tareas de control de calidad manual (QA) en apps para dispositivos móviles y habilitan las estrategias de integración continua (CI) y de pruebas previas al lanzamiento. Una secuencia de comandos de Robo es un archivo JSON en el que se describen una secuencia de interfaz de usuario (IU) y otras acciones.
Puedes crear una secuencia de comandos de Robo de las siguientes maneras:
Usa la función de grabación de secuencias de comandos de Robo. (solo para Android).
Crea la secuencia de comandos de Robo de forma manual. (para iOS y Android).
Graba la secuencia de comandos de Robo y edítala de forma manual. (solo para Android).
Para obtener más información sobre el uso de secuencias de comandos de Robo, consulta Ejecuta una secuencia de comandos de Robo.
Introducción
La secuencia de comandos de Robo se proporciona para realizar pruebas Robo junto con otras entradas como el Paquete de aplicación para Android (APK) de la app que está a prueba.
El siguiente es un ejemplo de una secuencia de comandos de Robo que permite que un usuario acceda a una app, que se activa cuando se inicia la app que está a prueba:
[
{
"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"
}
]
}
]
}
]
Si un archivo tiene una sola secuencia de comandos de Robo y tiene la condición de activación
app_under_test_shown
predeterminada, como en el ejemplo anterior, puedes
especificar la secuencia de comandos de Robo en un archivo con un formato más simple, es decir,
solo como secuencia de acciones:
[
{
"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"
}
]
}
]
Compatibilidad de iOS+ con secuencias de comandos de Robo
Robo para iOS+ (beta) tiene compatibilidad limitada con las secuencias de comandos de Robo. La sintaxis de la secuencia de comandos de Robo para iOS+ es idéntica a la de Android, y las funciones compatibles de iOS+ se comportan de manera similar a sus equivalentes de Android.
Las siguientes acciones son compatibles con iOS+:
- Aserción
- Haz clic
- Clic prolongado
- Realiza un deslizamiento
- Ignorar todos los elementos
- Espera
- Toma capturas de pantalla
- Finaliza el rastreo
En iOS+, se admiten los siguientes atributos de identificación en descriptores de elementos:
- Nombre de clase
- Nombre de la clase principal
- Descripción del contenido (y regex)
- Texto (y regex)
Las siguientes condiciones de activación en descriptores de contexto son compatibles con iOS+:
- Se muestra la app en modo de prueba
- Elemento presente
- Se realizó una acción de secuencia de comandos que no es Robo
Estructura
Una secuencia de comandos de Robo tiene varios atributos que describen cómo la ejecuta Robo. La mayoría de estos atributos son opcionales con valores predeterminados predefinidos:
Atributo | Descripción |
id
|
Un número entero que ayuda a realizar un seguimiento de esta secuencia de comandos de Robo en los resultados de rastreo. |
description
|
Es similar a id , pero más descriptivo.
|
crawlStage
|
La etapa de un rastreo en la que Robo aplica esta secuencia de comandos de Robo. De forma predeterminada, es la etapa de rastreo principal. |
priority
|
La prioridad de esta secuencia de comandos de Robo en comparación con otras.
De forma predeterminada, todas las secuencias de comandos de Robo tienen una prioridad de 1 .
|
maxNumberOfRuns
|
Especifica cuántas veces Robo puede ejecutar esta secuencia de comandos de Robo durante un rastreo. De forma predeterminada, Robo puede ejecutar una secuencia de comandos de Robo una vez. |
contextDescriptor
|
Describe el contexto o la condición que activa esta secuencia de comandos de Robo. Si se omite, se considera que siempre se cumple la condición de activación de esta secuencia de comandos de Robo. En otras palabras, la secuencia de comandos de Robo no es condicional. |
actions
|
Todas las acciones de esta secuencia de comandos de Robo. |
Un solo archivo contiene una colección de una o más secuencias de comandos de Robo.
El siguiente es un ejemplo de un archivo con dos secuencias de comandos de Robo no condicionales, cada una con una sola acción que se ejecuta una vez al comienzo de un rastreo:
[
{
"id": 1000,
"description": "My first Robo script",
"actions": [
{
"eventType": "DISABLE_KEYBOARD"
}
]
},
{
"id": 1001,
"description": "My second Robo script",
"actions": [
{
"eventType": "PRESSED_BACK"
}
]
}
]
Descriptor de contexto
Un descriptor de contexto define el contexto o la condición que activa una secuencia de comandos de Robo con un atributo o una combinación de varios atributos:
Atributo | Descripción |
---|---|
"condition": "always"
|
Siempre activa una secuencia de comandos de Robo. |
"condition": "element_present"
|
Comprueba que un widget de la IU que coincide con elementDescriptors o
el texto especificado por visionText esté presente en la pantalla.
|
"condition": "element_disabled"
|
Comprueba que un widget de la IU que coincide con elementDescriptors esté
presente en la pantalla y que no se pueda interactuar con él.
|
"condition": "element_checked"
|
Comprueba que un widget de la IU que coincide con elementDescriptors esté
presente en la pantalla y esté marcado.
|
"condition": "app_under_test_shown"
|
Comprueba que la app que está a prueba se esté ejecutando en primer plano. |
"condition": "default_launcher_shown"
|
Comprueba que se muestre la pantalla principal de un dispositivo, lo que significa que ninguna app se está ejecutando en primer plano. |
"condition": "non_roboscript_action_performed"
|
Comprueba que las últimas acciones consecutivas de nonRoboscriptActionCount
que realizó la prueba Robo no sean acciones de secuencia de comandos de Robo.
|
negateCondition
|
Si se configura en true , anula la condition . Por
ejemplo, puedes usar este atributo para comprobar si un widget de la IU NO está
presente en la pantalla o si la app que está a prueba NO se está ejecutando en
primer plano.
|
elementDescriptors
|
Uno o más descriptores de elementos que identifican un widget de la IU en la pantalla.
Se usa en combinación con las condiciones element_present ,
element_disabled y element_checked .
Este campo y visionText son exclusivos de manera mutua. Para obtener más
información, consulta Descriptores de elementos.
|
visionText
|
El texto en pantalla se detecta con la API de reconocimiento óptico de caracteres
(OCR). visionText se usa en combinación con la
condición element_present . Este campo y elementDescriptors son mutuamente
excluyentes.
|
nonRoboscriptActionCount
|
La cantidad de acciones consecutivas de secuencias de comandos que no son de Robo realizadas antes. Se usa en combinación con la condición non_roboscript_action_performed
para activar una secuencia de comandos de Robo después de cada
acción nonRoboscriptActionCount de Robo. De forma predeterminada, es 1 .
|
El siguiente es un ejemplo de una secuencia de comandos de Robo que se activa mediante un widget de la IU
con un ID de recurso "my.app.package:id/page_header"
presente en la
pantalla:
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/page_header"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Settings"
}
]
}
]
}
El siguiente es un ejemplo de una secuencia de comandos de Robo que se activa con una
"Privacy Policy"
detectada por el reconocimiento óptico de caracteres (OCR):
{
"id": 1000,
"description": "Vision text Robo script",
"contextDescriptor": {
"condition": "element_present",
"visionText": "Privacy Policy"
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
]
}
El siguiente es un ejemplo de una secuencia de comandos de Robo que espera 5 segundos después de cada acción de Robo que no sea de secuencia de comandos:
{
"contextDescriptor": {
"condition": "non_roboscript_action_performed"
},
"maxNumberOfRuns" : 1000,
"actions" : [
{
"eventType" : "DELAYED_MESSAGE_POSTED",
"delayTime" : 5000
}]
}
Acciones
Cada acción en una secuencia de comandos de Robo se representa como un conjunto de uno o más pares de atributos y valores, que se describen en la siguiente tabla:
Atributo | Descripción |
eventType
|
Especifica el tipo de acción, por ejemplo, hacer clic, editar texto, etc. Es obligatorio para cada acción. |
elementDescriptors
|
Descriptores que identifican un widget de la IU. Obligatorio para todas las acciones que tienen un widget de la IU objetivo, como hacer clic en un botón específico. |
optional
|
Si se configura en true , esta acción se omite cuando no se puede
realizar. Por ejemplo, se omite esta acción cuando no puede encontrar el
widget de la IU objetivo en una pantalla sin generar un error en la secuencia de comandos de Robo
que la contiene. De forma predeterminada, el valor es false .
|
replacementText
|
El texto que se debe ingresar en el widget de la IU objetivo. Obligatorio para las acciones de edición de texto. |
swipeDirection
|
Especifica la dirección del deslizamiento. Obligatorio para las acciones de deslizamiento. |
delayTime
|
Especifica cuánto tiempo esperar, en milisegundos. Obligatorio para las acciones de espera. |
pointTapXCoordinate y pointTapYCoordinate
|
Las coordenadas X e Y del píxel del punto presionado. Mutuamente excluyentes
con pointTapXPercent y pointTapYPercent .
Obligatorio para las acciones de presión de puntos.
|
pointTapXPercent y pointTapYPercent
|
Las coordenadas X e Y del porcentaje del punto presionado. Mutuamente
excluyentes con pointTapXCoordinate y
pointTapYCoordinate . Obligatorio para las acciones de presión de puntos.
|
El siguiente es un ejemplo de una secuencia de comandos de Robo con dos acciones sin widgets de IU objetivo, lo que significa que estas acciones no operan en un widget de IU específico:
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
Descriptores de elementos
Un descriptor de elementos identifica un widget de IU con uno o más de los siguientes atributos de identificación:
Atributo | Descripción |
className
|
– |
ancestorClassName
|
El nombre de clase de la entidad principal de la jerarquía de la IU del elemento. Una entidad principal es cualquiera de los nodos superiores en la jerarquía de la IU del elemento, incluido el elemento en sí. |
resourceId
|
– |
resourceIdRegex
|
Expresión regular de Java que coincide con resourceId .
|
contentDescription
|
– |
contentDescriptionRegex
|
Expresión regular de Java que coincide con contentDescription .
|
text (que aparece en la pantalla)
|
– |
textRegex
|
Expresión regular de Java que coincide con text .
|
groupViewChildPosition ,
recyclerViewChildPosition o
adapterViewChildPosition
|
Representa la posición secundaria de un widget de la IU, según el tipo de widget superior. |
A menudo, estos atributos no están definidos. Por ejemplo, es posible que un botón no
tenga descripción de texto y contenido. Incluso si algunos valores de atributos están presentes,
es posible que no sean únicos en una pantalla determinada de la app (incluido resourceId
).
Por ejemplo, diferenciar entre elementos de una lista suele ser posible solo
si usan las diferentes posiciones secundarias dentro de su widget superior. Esto significa
que el uso de un solo descriptor de elementos para identificar un widget de la IU suele ser
insuficiente. Por lo tanto, el atributo elementDescriptors
de una acción contiene una
secuencia de descriptores de elementos que se ordenan de modo que el primero
corresponda al widget de la IU objetivo, el segundo corresponda al widget
superior del widget de la IU objetivo y así sucesivamente. El widget de la IU objetivo de una acción coincide
cuando todos los descriptores de sus elementos coinciden con la subjerarquía correspondiente
del widget de la IU.
A continuación, se muestra un ejemplo de una secuencia de comandos de Robo con un cambio de texto y acciones de clic, que requieren que identifiques el widget de la IU objetivo mediante los descriptores de elementos proporcionados:
[
{
"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"
}
]
}
]
Opciones de ejecución
De manera opcional, puedes agregar un prefijo a la lista de acciones en una secuencia de comandos de Robo con un objeto
JSON que especifique las opciones de ejecución para esa secuencia. Este
encabezado de configuración comienza con la palabra clave roboscript
seguida de una
representación JSON de las opciones de ejecución deseadas.
Las secuencias de comandos de Robo admiten las siguientes opciones de ejecución:
executionMode
: Son las opciones de ejecución que se aplican cuando se ejecuta una secuencia de comandos de Robo:strict
: Si se configura comotrue
, la secuencia de comandos de Robo no usa la coincidencia parcial, se omite la acción actual y la suspensión. Es decir, la secuencia de comandos de Robo se ejecuta como una prueba de instrumentación normal y falla en cuanto no se puede realizar ninguna de sus acciones. De forma predeterminada, esfalse
.notify
: Si se configura comofalse
, la secuencia de comandos de Robo no muestra notificaciones en pantalla al comienzo y al final de su ejecución. De forma predeterminada, estrue
.
postscript
: Son las opciones de ejecución que se aplicaron después de completar una secuencia de comandos de Robo:terminate
: Si se configura comotrue
, la prueba Robo deja de rastrearse después de que se completa la secuencia de comandos de Robo. De forma predeterminada, esfalse
.
El siguiente es un ejemplo de una secuencia de comandos de Robo que se ejecuta en modo strict
sin
notificaciones en pantalla que se suspende durante tres segundos. Después de eso, se detiene
el rastreo:
"roboscript": {
"executionMode": {
"strict": true,
"notify": false
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
Parámetros de la plantilla
Un parámetro de plantilla es un marcador de posición en una secuencia de comandos de Robo que se reemplaza por el valor real cuando la prueba Robo carga esa secuencia para su ejecución. Los parámetros de la plantilla tienen un prefijo de guion bajo doble seguido de un signo de porcentaje y tienen un sufijo de un signo de porcentaje seguido de un guion bajo doble.
Las secuencias de comandos de Robo admiten el siguiente parámetro de plantilla:
__%APP_PACKAGE_NAME%__
: Es el nombre del paquete de la app que está a prueba.
El siguiente es un ejemplo de una secuencia de comandos de Robo que detiene el proceso de la app que está a prueba:
[
{
"eventType": "ADB_SHELL_COMMAND",
"command": "am force-stop __%APP_PACKAGE_NAME%__"
}
]
Comentarios
Una secuencia de comandos de Robo puede contener líneas de comentarios, que son líneas que comienzan con
#
o //
.
El siguiente es un ejemplo de una secuencia de comandos de Robo con algunos comentarios:
# Confirm a user account.
[
{
// Click the DONE button.
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
]
Funciones
De forma predeterminada, la secuencia de comandos de Robo permanecerá activa hasta que se completen todas las acciones de la secuencia de comandos de Robo (o, al menos, se intenten). La prueba Robo seguirá tratando de hacer coincidir una acción de secuencia de comandos de Robo cada vez que elige una acción para realizar. La secuencia de comandos de Robo usa las siguientes técnicas para aumentar la solidez:
Técnica | Descripción |
Coincidencia parcial | Si la acción actual de la secuencia de comandos de Robo no puede coincidir por completo, los criterios
de coincidencia se relajan y se vuelve a intentar la coincidencia. La coincidencia parcial
no considera el descriptor de elementos más externo cuando coincide con el
widget de la IU objetivo de una acción de secuencia de comandos de Robo.
Si la coincidencia parcial se realiza correctamente, se realiza la acción correspondiente de la secuencia de comandos de Robo como de costumbre. Esta técnica admite situaciones en las que la estructura de la app cambia, por ejemplo, entre las versiones de la app, cuando se reordenan los elementos de la pantalla. |
Omitir acción actual | Si la acción actual de la secuencia de comandos de Robo no puede coincidir de forma total o parcial,
Robo intenta hacer coincidir la acción posterior. Si la acción
posterior coincide de forma total o parcial, la prueba Robo omite la acción actual
de la secuencia de comandos de Robo (y nunca vuelve a realizarla) y realiza la siguiente.
Esta técnica admite situaciones en las que el comportamiento de la app cambia entre versiones o es inestable, por ejemplo, cuando un diálogo intermitente puede aparecer en diferentes pantallas durante la grabación y no para reproducir una secuencia de comandos de Robo. |
Suspender | Si no se pueden encontrar coincidencias totales ni parciales con una acción de secuencia de comandos de Robo
actual ni posterior, la secuencia de comandos de Robo se suspende temporalmente y la prueba Robo
elige una acción para realizar con otras estrategias. Después de completar
esta acción, la prueba Robo reanuda la ejecución de la secuencia de comandos de Robo.
Siempre y cuando las acciones de la secuencia de comandos de Robo actuales o posteriores no coincidan, la secuencia de comandos de Robo permanecerá suspendida por cualquier cantidad de acciones. Por lo tanto, no es necesario que las secuencias de comandos de Robo sean prólogos para una prueba Robo, y puedes intercalar acciones de secuencias de comandos de Robo con acciones de la prueba Robo estándar. Esta técnica admite situaciones en las que el comportamiento de la app es inestable o los cambios entre versiones de la app son lo suficientemente grandes como para que la prueba Robo deba “completar los espacios vacíos” con sus acciones estándar. |
Prioridades
Si una secuencia de comandos de Robo alcanza su maxNumberOfRuns
, ya no se puede activar
en un rastreo determinado. Si el contexto actual puede activar más de una secuencia de comandos de Robo,
puedes asignar prioridades. Para ello, elige, en el siguiente orden, la secuencia de comandos de Robo
que cumpla con los siguientes criterios:
- Tener un atributo
contextDescriptor
- Tener la
priority
más alta (de forma predeterminada, todas las secuencias de comandos de Robo tienen la mismapriority
de ejecución de1
) - Ser una de las primeras en aparecer en la lista de las secuencias de comandos de Robo, si las prioridades de estas son las mismas
El siguiente es un ejemplo de un archivo con tres secuencias de comandos de Robo que realizan la misma acción y se activan con la misma condición: la app que está a prueba se encuentra en primer plano:
[
{
"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
}
]
}
]
Cuando la app que está a prueba se encuentra en primer plano, Robo activa lo siguiente en este orden:
"Robo script 2"
porque tiene la prioridad más alta."Robo script 1"
porque aparece antes entre las secuencias de comandos de Robo aplicables que quedan con la misma prioridad."Robo script 3"
como la última secuencia de comandos de Robo aplicable.
Ejecuciones repetidas
De forma predeterminada, Robo activa una secuencia de comandos de Robo como máximo una vez durante un rastreo. Esto se puede
ajustar a través del atributo maxNumberOfRuns
.
El siguiente es un ejemplo de una secuencia de comandos de Robo que lleva la app que está a prueba al segundo plano hasta por 10 veces:
{
"id": 1000,
"maxNumberOfRuns": 10,
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "GO_HOME"
}
]
}
Etapa del rastreo
Las secuencias de comandos de Robo se pueden aplicar en diferentes etapas de un rastreo determinado de Robo:
Etapa del rastreo | Descripción |
pre_crawl
|
Antes de que se inicie Robo y comience a rastrear la app que está a prueba. |
post_crawl
|
Después de que Robo termine de rastrear la app que está a prueba. |
crawl
|
La etapa de rastreo principal, en la que Robo rastrea la app que está a prueba. |
close_screen
|
Cuando Robo intenta regresar (retroceso) desde una pantalla determinada o cuando se exploran todas las acciones posibles en esta pantalla. De forma predeterminada, Robo presiona Atrás, lo que no es conveniente en algunos casos. |
Si no se especifica el atributo crawlStage
de una secuencia de comandos de Robo, se
da a entender que es crawl
.
El siguiente es un ejemplo de una secuencia de comandos de Robo que borra los datos del usuario de la app que está a prueba antes de que Robo comience a rastrearla:
{
"id": 1000,
"crawlStage": "pre_crawl",
"actions": [
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
]
}
El siguiente es un ejemplo de una secuencia de comandos de Robo que le indica a Robo que haga clic
en "Cancel"
cada vez que intente regresar (retroceso) desde un diálogo
de confirmación:
{
"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"
}
]
}
]
}
Acciones condicionales
Una secuencia de comandos de Robo puede contener acciones condicionales, las que tienen tres atributos adicionales que describen cómo las realiza Robo:
Atributo | Descripción |
priority
|
La prioridad de esta acción condicional en comparación con otras
acciones condicionales dentro de la secuencia de comandos de Robo que la contiene. De forma predeterminada, todas las
acciones condicionales tienen una prioridad de 1 .
|
maxNumberOfRuns
|
Cantidad de veces que se puede realizar esta acción condicional durante una ejecución de la secuencia de comandos de Robo que la contiene. De forma predeterminada, todas las acciones condicionales se pueden realizar una vez como máximo en una sola ejecución de la secuencia de comandos de Robo que las contiene. |
contextDescriptor
|
El contexto o la condición que activa esta acción condicional. Tiene la misma estructura y ofrece capacidades similares a las de [la secuencia de comandos contextDescriptor de Robo](#context-descriptor). |
Cuando se activa, una secuencia de comandos de Robo realiza sus acciones no condicionales una por una en orden de aparición. Si una secuencia de comandos de Robo contiene acciones condicionales, estas se consideran cada vez antes de elegir una acción no condicional para realizarla. Si una acción condicional se activa y se elige según su prioridad y la cantidad de ejecuciones restantes, la secuencia de comandos de Robo realiza esta acción condicional. De lo contrario, la secuencia de comandos de Robo realiza la siguiente acción no condicional. Para considerarse como válida, una secuencia de comandos de Robo debe contener al menos una acción no condicional.
El siguiente es un ejemplo de una secuencia de comandos de Robo no condicional con una acción condicional que descarta los diálogos emergentes si aparecen en algún momento durante la ejecución de la secuencia de comandos de 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
}
}
Omite acciones
Una secuencia de comandos de Robo puede contener instrucciones para que Robo omita widgets específicos de la IU
o todos los widgets de la IU en una pantalla en particular. Estas instrucciones se representan como “acciones” de omisión con eventType
ELEMENT_IGNORED
y
ALL_ELEMENTS_IGNORED
, respectivamente.
Cuando el atributo contextDescriptor
de una secuencia de comandos de Robo que contiene acciones de
omisión coincide con una pantalla determinada, Robo no interactúa con ningún widget de la IU
segmentado por sus acciones de omisión (a menos que alguna otra acción de secuencia de comandos de Robo haga que
Robo realice una acción en uno de los widgets de IU que se omitieron).
Una secuencia de comandos de Robo puede contener una combinación de acciones de omisión,
condicionales y no condicionales. A diferencia de otras acciones de secuencias de comandos de Robo, las acciones de omisión se aplican siempre que
el contextDescriptor
de la secuencia de comandos de Robo que las contiene coincida con una pantalla durante un
rastreo de Robo, sin importar los valores de los atributos priority
y maxNumberOfRuns
.
El siguiente es un ejemplo de un archivo con dos secuencias de comandos de Robo. La primera secuencia de comandos de Robo
hace que Robo omita todos los widgets de la IU en una pantalla que contenga un widget de la IU con
un ID de recurso "my.app.package:id/ignored_screen"
. La segunda secuencia de comandos de Robo hace que
Robo omita los widgets de la IU cuyos IDs de recursos coincidan con la regex de Java ".*:id/done"
en una
pantalla que contenga un widget de la IU con un ID de recurso
"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"
}
]
}
]
}
]
Compatibilidad con RecyclerView y AdapterView
Los elementos secundarios de los widgets RecyclerView y AdapterView se cargan de forma dinámica y podrían mostrarse muchos deslizamientos fuera de la pantalla actual. Debido a que el tamaño de la pantalla y la cantidad de deslizamientos necesarios para acceder a este elemento secundario son diferentes según los factores de forma del dispositivo, es mucho más sólido confiar en la posición de los datos del elemento secundario, que es absoluto. Un enfoque menos sólido es confiar en la cantidad de deslizamientos que se necesitan para llevar a este elemento secundario a la pantalla y, luego, usar su posición de pantalla.
Por lo tanto, la secuencia de comandos de Robo captura las posiciones de datos absolutas de los elementos secundarios
de RecyclerView que son objetivos de las acciones de la secuencia de comandos de Robo como
recyclerViewChildPosition
. La secuencia de comandos de Robo también captura las posiciones de datos
absolutas de los elementos secundarios de AdapterView que son objetivos de las acciones de la secuencia de comandos de Robo como
adapterViewChildPosition
.
Las acciones en RecyclerView y AdapterView se realizan en los siguientes pasos:
La prueba Robo garantiza que el elemento secundario correspondiente se muestre en la pantalla mediante una acción de posicionamiento en el objeto RecyclerView o AdapterView que lo contiene.
La prueba Robo realiza la acción grabada directamente en el elemento secundario, dado que ya se muestra en la pantalla.
A continuación, se muestra un ejemplo de una acción de clic en un elemento secundario de
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
}
]
}
El siguiente es un ejemplo de una acción de clic en un elemento secundario de
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
}
]
}
Graba una secuencia de comandos de Robo en Android Studio y ejecútala en Test Lab
Puedes crear una secuencia de comandos de Robo en Android Studio, que la guarda como un archivo JSON. Luego, puedes subir el archivo JSON a Firebase Test Lab con la aplicación y ejecutar la prueba como corresponda.
Cuando ejecutas una prueba Robo con una secuencia de comandos adjunta, la prueba Robo comienza por las acciones predefinidas y, luego, explora la app como de costumbre.
Para crear un archivo JSON de una secuencia de comandos de Robo en Android Studio, sigue los pasos que se indican en Cómo grabar una secuencia de comandos de Robo con Test Lab en Android Studio.
Acciones de secuencias de comandos de Robo
El siguiente atributo opcional común se aplica a todas las acciones:
description
: Ayuda a realizar un seguimiento de la ejecución de esta acción de secuencia de comandos de Robo en los resultados de la prueba Robo.
Aserción
Si la condición declarada es verdadera, la secuencia de comandos de Robo continúa con la siguiente acción, que podría ser otra aserción. De lo contrario, la ejecución de la secuencia de comandos de Robo se detiene debido a una aserción con errores.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "ASSERTION"
|
-- |
contextDescriptor
|
Describe el contexto o la condición con aserción. Tiene la misma estructura y ofrece capacidades similares a las de la secuencia de comandos contextDescriptor de Robo. |
El siguiente es un ejemplo de una aserción de secuencia de comandos de Robo que verifica que la app que está a prueba esté en primer plano:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
A continuación, se muestra un ejemplo de una aserción de secuencia de comandos de Robo que verifica que un widget de
la IU con el ID de recurso "com.google.samples.apps.topeka:id/done"
esté
presente en una pantalla:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
El siguiente es un ejemplo de una aserción de secuencia de comandos de Robo que verifica
que "Settings"
NO se detecte en una pantalla mediante OCR:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
Haz clic
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
eventType
|
Especifica el tipo de acción de la secuencia de comandos de Robo. |
"eventType": "VIEW_CLICKED"
|
Hace clic en el elemento de destino de la app que está a prueba. |
"eventType": "SOFT_KEYBOARD_CLICK"
|
Hace clic en el elemento de destino del teclado en pantalla. |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK"
|
Hace clic en elementos aleatorios del teclado en pantalla hasta
maxNumberOfRuns veces.
|
"eventType": "LIST_ITEM_CLICKED"
|
Lo usa la grabadora de secuencias de comandos de Robo en Android Studio para hacer clic en los elementos de la lista. |
elementDescriptors
|
Identifica el widget de la IU en el que se hizo clic con la jerarquía de la IU de Android.
Este campo y visionText son mutuamente excluyentes.
|
visionText
|
Identifica el elemento en el que se hizo clic con OCR. Este campo y elementDescriptors son mutuamente
excluyentes.
|
maxNumberOfRuns
|
Especifica cuántas veces hacer clic en un elemento aleatorio del teclado en pantalla
cuando eventType es SOFT_KEYBOARD_RANDOM_CLICK .
El valor predeterminado es 1 .
|
A continuación, se muestra un ejemplo de una acción de secuencia de comandos de Robo que hace clic en un botón con
el ID de recurso "com.google.samples.apps.topeka:id/done"
:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que hace clic en
"Privacy Policy"
detectado en una pantalla mediante OCR:
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que hace clic en un elemento
del teclado en pantalla con una descripción de contenido "Emoji button"
:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que hace clic en elementos aleatorios del teclado en pantalla hasta cinco veces:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
Inhabilita el teclado en pantalla
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "DISABLE_KEYBOARD"
|
-- |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que inhabilita el teclado en pantalla:
{
"eventType": "DISABLE_KEYBOARD"
}
Ejecuta el comando adb shell
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "ADB_SHELL_COMMAND"
|
-- |
command
|
El comando de Android Debug Bridge (adb) shell que se ejecutará. |
El siguiente atributo es opcional:
expectedOutputRegex
: Es el resultado esperado del comando como una expresión regular de Java. Si el resultado no coincide, falla la acción de la secuencia de comandos de Robo. De forma predeterminada, es una string vacía, es decir, no se verifica el resultado.
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que borra los datos del usuario de la app que está a prueba:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
Otorga permisos
La grabación de secuencias de comandos de Robo de Android Studio graba esta acción para la retrocompatibilidad con la grabadora de pruebas Espresso. La prueba Robo otorga todos los permisos a la app que está a prueba al comienzo de cada rastreo y, por lo tanto, esta acción es una no-op. NO uses esta acción en tus secuencias de comandos de Robo.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "PERMISSIONS_REQUEST"
|
-- |
Omite todos los elementos de una pantalla
Esta acción hace que Robo omita todos los elementos en cualquier pantalla que active la secuencia de comandos de Robo que la contiene.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "ALL_ELEMENTS_IGNORED"
|
-- |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que hace que Robo omita todos los elementos en una pantalla:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
Omite un elemento
Esta acción hace que Robo omita uno o más elementos que coincidan con el elementDescriptors
especificado.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "ELEMENT_IGNORED"
|
-- |
elementDescriptors
|
Identifica los widgets de la IU omitidos con la jerarquía de la IU de Android. |
El siguiente atributo es opcional:
ignoreChildren
: Si se configura comotrue
, Robo también ignora todos los subordinados de los widgets de la IU omitidos. De forma predeterminada, esfalse
.
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que hace que Robo omita todos
los elementos cuyas descripciones de contenido comienzan con "Avatar"
:
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
Texto de entrada
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
eventType
|
Especifica el tipo de acción de la secuencia de comandos de Robo. |
"eventType": "VIEW_TEXT_CHANGED"
|
Ingresa el texto dado en el widget de la IU objetivo. |
"eventType": "ENTER_TEXT"
|
Ingresa el texto dado en el widget de la IU objetivo y, luego, envía un
evento KEYCODE_ENTER al widget de esta IU.
|
elementDescriptors
|
Identifica el widget de la IU objetivo con la jerarquía de la IU de Android. |
replacementText
|
El texto que se debe ingresar en el widget de la IU objetivo. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que ingresa "John"
en
un widget de la IU con el ID de recurso
"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 prolongado
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "VIEW_LONG_CLICKED"
|
-- |
elementDescriptors
|
Identifica el widget de la IU objetivo con la jerarquía de la IU de Android. Este campo y visionText son mutuamente
excluyentes.
|
visionText
|
Identifica el elemento en el que se hizo clic prolongado con OCR. Este campo y elementDescriptors son mutuamente
excluyentes.
|
El siguiente atributo es opcional:
delayTime
: Especifica cuánto tiempo dura la presión de un clic largo en milisegundos.
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que realiza un clic
de cinco segundos en un widget de la IU con la descripción de contenido "Avatar 8"
:
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
Realiza un gesto de un punto
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
"eventType": "ONE_POINT_GESTURE"
|
-- |
coordinates
|
Dos coordenadas para un gesto de un punto, con el formato “(x1,y1)->(x2,y2)” como porcentajes o píxeles. |
El siguiente atributo es opcional:
dragAndDrop
: Si se establece entrue
, el gesto de un punto realizará una acción de arrastrar y soltar. De forma predeterminada, esfalse
.
El siguiente es un ejemplo de una acción de gesto de un punto de una secuencia de comandos de Robo que realiza un deslizamiento hacia abajo:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
Realiza un gesto de dos puntos
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
"eventType": "TWO_POINT_GESTURE"
|
-- |
coordinates
|
Cuatro coordenadas para un gesto de dos puntos, con el formato “(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)” como porcentajes o píxeles. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que realiza un gesto de pellizcar:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
Realiza una acción del IME
Esta acción presiona el botón de acción actual, por ejemplo, siguiente, listo y búsqueda, en el Editor de método de entrada (IME) del widget de la IU objetivo especificado.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
"eventType": "PRESSED_EDITOR_ACTION"
|
-- |
elementDescriptors
|
Identifica el widget de la IU objetivo con la jerarquía de la IU de Android. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que realiza una acción del IME
en un widget de la IU con el ID del recurso
"com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Presiona el botón Atrás
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
eventType
|
Especifica el tipo de acción de la secuencia de comandos de Robo. |
"eventType": "PRESSED_BACK"
|
Envía un evento KEYCODE_BACK al dispositivo.
|
"eventType": "PRESSED_BACK_EMULATOR_28"
|
Lo usa la grabadora de secuencias de comandos de Robo en Android Studio para presionar el botón Atrás en la API 28 del emulador. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que presiona el botón Atrás:
{
"eventType": "PRESSED_BACK"
}
Presiona el botón de inicio
Esta acción envía un evento KEYCODE_HOME
al dispositivo.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "GO_HOME"
|
-- |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que presiona el botón de inicio:
{
"eventType": "GO_HOME"
}
Desplaza un elemento para que se vea
Esta acción hace que la prueba Robo desplace el widget de la IU que coincida con el
elementDescriptors
especificado hasta que aparezca en la pantalla el widget de la IU que
coincida con el childElementDescriptors
especificado, el widget desplazado ya no se pueda desplazar o se alcance la cantidad máxima de 50 desplazamientos.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "ELEMENT_SCROLL_INTO_VIEW"
|
-- |
elementDescriptors
|
Identifica el widget de la IU desplazado con la jerarquía de la IU de Android. |
childElementDescriptors
|
Identifica el widget de la IU que se debe desplazar con la jerarquía de la IU de Android. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que desplaza el widget de la IU
con el ID de recurso "my.app.package:id/scrollable_card_container"
hasta que el widget de
la IU con texto "Orange"
esté presente en la pantalla (o no se puedan realizar más desplazamientos o se alcance
la cantidad máxima de 50 desplazamientos):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
Realiza un deslizamiento
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
"eventType": "VIEW_SWIPED"
|
-- |
swipeDirection
|
Especifica la dirección del deslizamiento:
|
elementDescriptors
|
Identifica el widget de la IU objetivo con la jerarquía de la IU de Android. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que desliza un widget de la IU hacia arriba
con el ID de recurso "my.app.package:id/custom_content"
:
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
Toma capturas de pantalla
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "TAKE_SCREENSHOT"
|
-- |
screenshotName
|
Especifica el nombre de archivo de la captura de pantalla. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que toma una captura de pantalla:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
Presiona un punto en la pantalla
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
"eventType": "POINT_TAP"
|
-- |
pointTapXCoordinate
|
La coordenada X del píxel del punto presionado. Mutuamente excluyentes con
pointTapXPercent y pointTapYPercent .
|
pointTapYCoordinate
|
La coordenada Y del píxel del punto presionado. Mutuamente excluyentes con
pointTapXPercent y pointTapYPercent .
|
pointTapXPercent
|
La coordenada X del porcentaje del punto presionado. Mutuamente excluyentes con
pointTapXCoordinate y pointTapYCoordinate .
|
pointTapYPercent
|
La coordenada Y del porcentaje del punto presionado. Mutuamente excluyentes con
pointTapXCoordinate y pointTapYCoordinate .
|
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que presiona en el medio de una pantalla:
{
"eventType": "POINT_TAP",
"pointTapXPercent": 50,
"pointTapYPercent": 50
}
Presiona un punto dentro de un elemento
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "POINT_TAP_ELEMENT"
|
-- |
pointTapXPercent
|
La coordenada X del porcentaje dentro del elemento de destino. |
pointTapYPercent
|
La coordenada Y del porcentaje dentro del elemento de destino. |
elementDescriptors
|
Identifica el widget de la IU objetivo con la jerarquía de la IU de Android. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que mueve el control deslizante de una barra deslizante de búsqueda hacia la derecha:
{
"eventType": "POINT_TAP_ELEMENT",
"pointTapXPercent": 80,
"pointTapYPercent": 50,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/my_seekbar"
}
]
}
Finaliza el rastreo
Esta acción detiene la prueba Robo.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
---|---|
"eventType": "TERMINATE_CRAWL"
|
-- |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que detiene una prueba Robo:
{
"eventType": "TERMINATE_CRAWL"
}
Espera
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "DELAYED_MESSAGE_POSTED"
|
-- |
delayTime
|
Especifica cuánto tiempo esperar, en milisegundos. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que espera tres segundos:
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
Espera un elemento
Esta acción hace que la prueba Robo espere a que un elemento aparezca en la pantalla durante el tiempo de espera especificado.
En la siguiente tabla, se indican los atributos obligatorios:
Atributo | Descripción |
"eventType": "WAIT_FOR_ELEMENT"
|
-- |
delayTime
|
Especifica el tiempo de espera, en milisegundos. |
elementDescriptors
|
Identifica el widget de la IU esperado con la jerarquía de la IU de Android. |
El siguiente es un ejemplo de una acción de secuencia de comandos de Robo que espera hasta
30 segundos para que aparezca un widget de IU con el ID de
recurso "my.app.package:id/confirmation_button"
en la pantalla:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}