Guía de referencia de las secuencias de comandos de Robo

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 como true, 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, es false.
    • notify: Si se configura como false, la secuencia de comandos de Robo no muestra notificaciones en pantalla al comienzo y al final de su ejecución. De forma predeterminada, es true.
  • postscript: Son las opciones de ejecución que se aplicaron después de completar una secuencia de comandos de Robo:
    • terminate: Si se configura como true, la prueba Robo deja de rastrearse después de que se completa la secuencia de comandos de Robo. De forma predeterminada, es false.

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:

  1. Tener un atributo contextDescriptor
  2. Tener la priority más alta (de forma predeterminada, todas las secuencias de comandos de Robo tienen la misma priority de ejecución de 1)
  3. 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:

  1. "Robo script 2" porque tiene la prioridad más alta.
  2. "Robo script 1" porque aparece antes entre las secuencias de comandos de Robo aplicables que quedan con la misma prioridad.
  3. "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:

  1. 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.

  2. 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 como true, Robo también ignora todos los subordinados de los widgets de la IU omitidos. De forma predeterminada, es false.

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 en true, el gesto de un punto realizará una acción de arrastrar y soltar. De forma predeterminada, es false.

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:
  • Left
  • Right
  • Up
  • Down
  • Forward: Puede ser Down o Right, según el desplazamiento horizontal o vertical del widget de la IU objetivo.
  • Backward: Puede ser Up o Left, según el desplazamiento horizontal o vertical del widget de la IU objetivo.
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"
    }
  ]
}

Próximos pasos