Guía de referencia de scripts de Robo

Este documento proporciona información de referencia sobre los scripts de Robo, incluida la estructura, las capacidades, el uso, la grabación y las acciones. Los scripts Robo son pruebas que automatizan las tareas manuales de control de calidad (QA) para aplicaciones móviles y permiten la integración continua (CI) y estrategias de prueba previas al lanzamiento. Un script Robo es un archivo JSON que describe una secuencia de interfaz de usuario (UI) y otras acciones.

Puede crear un script Robo de las siguientes maneras:

  • Utilice la función de grabación de script Robo. (solo Android)

  • Cree el script Robo manualmente. (Android e iOS+)

  • Grabe el script de Robo y luego edítelo manualmente. (solo Android)

Para obtener más información sobre el uso de scripts Robo, consulte Ejecutar un script Robo .

Introducción

El script de Robo se proporciona para la prueba de Robo junto con otras entradas, como el paquete de aplicaciones de Android (APK) de la aplicación bajo prueba.

El siguiente es un ejemplo de un script Robo que inicia la sesión de un usuario en una aplicación, que se activa cuando se inicia la aplicación bajo 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 hay un único script Robo en un archivo y tiene la condición de activación predeterminada app_under_test_shown , como en el ejemplo anterior, entonces puede especificar el script Robo en un archivo usando un formato más simple, solo como una secuencia de sus 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"
      }
    ]
  }
]

Soporte iOS+ para secuencias de comandos Robo

Robo para iOS+ (Beta) tiene soporte limitado para scripts de Robo. La sintaxis del script Robo para iOS+ es idéntica a la sintaxis de Android, y las funciones compatibles de iOS+ se comportan de manera similar a sus contrapartes de Android.

Las siguientes acciones son compatibles con iOS+:

  • Afirmación
  • Hacer clic
  • clic largo
  • Golpe fuerte
  • Ignorar todos los elementos
  • Esperar
  • Tomar captura de pantalla
  • Terminar el rastreo

Los siguientes atributos de identificación en los descriptores de elementos son compatibles con iOS+:

  • Nombre de la clase
  • Nombre de clase de antepasado
  • Descripción del contenido (y expresiones regulares)
  • Texto (y expresiones regulares)

Las siguientes condiciones de activación en descriptores de contexto son compatibles con iOS+:

  • Se muestra la aplicación bajo prueba
  • Elemento presente
  • Se realizó una acción de script que no es de Robo

Estructura

Un script de Robo tiene varios atributos que describen cómo lo 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 rastrear este script Robo en los resultados de rastreo. Robo tiene scripts Robo integrados con sus propios id . Aunque la misma id en diferentes scripts de Robo no afecta su comportamiento, distinguir las acciones de estos scripts de Robo en los resultados del rastreo puede resultar complicado. Recomendamos asignar una id única de 1000 o superior para sus scripts de Robo para evitar conflictos.
description Similar a id pero más descriptivo.
crawlStage Robo aplica este script de Robo en la etapa de rastreo. De forma predeterminada, es la etapa de rastreo principal.
priority La prioridad de este script Robo en comparación con otros scripts Robo. De forma predeterminada, todos los scripts de Robo tienen una prioridad de 1 .
maxNumberOfRuns Especifica cuántas veces durante un rastreo Robo puede ejecutar este script Robo. De forma predeterminada, Robo puede ejecutar un script Robo una vez.
contextDescriptor Describe el contexto o condición que desencadena este script Robo. Si se omite, se considera que la condición de activación de este script Robo siempre se cumple; en otras palabras, el guión de Robo es incondicional.
actions Todas las acciones de este script Robo.

Un único archivo contiene una colección de uno o más scripts Robo.

El siguiente es un ejemplo de un archivo con dos scripts Robo incondicionales, cada uno con una única 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 condición que desencadena un script Robo utilizando uno o una combinación de varios atributos:

Atributo Descripción
"condition": "always" Siempre activa un script Robo.
"condition": "element_present" Comprueba que un widget de interfaz de usuario que coincida con elementDescriptors o el texto especificado por visionText esté presente en la pantalla.
"condition": "element_disabled" Comprueba que un widget de interfaz de usuario que coincida con elementDescriptors esté presente en la pantalla y no se pueda interactuar con él.
"condition": "element_checked" Comprueba que un widget de interfaz de usuario que coincida con elementDescriptors esté presente en la pantalla y esté marcado.
"condition": "app_under_test_shown" Comprueba que la aplicación bajo prueba se esté ejecutando en primer plano.
"condition": "default_launcher_shown" Comprueba que se muestra la pantalla de inicio de un dispositivo, lo que significa que no se están ejecutando aplicaciones en primer plano.
"condition": "non_roboscript_action_performed" Comprueba que las últimas acciones consecutivas nonRoboscriptActionCount realizadas por la prueba Robo no sean acciones de script Robo.
negateCondition Si se establece en true , niega la condition . Por ejemplo, puede utilizar este atributo para comprobar si un widget de interfaz de usuario NO está presente en la pantalla o si la aplicación bajo prueba NO se está ejecutando en primer plano.
elementDescriptors Uno o más descriptores de elementos que identifican un widget de interfaz de usuario en la pantalla. Se utiliza en combinación con las condiciones element_present , element_disabled y element_checked . Mutuamente excluyente con visionText . Para obtener más información, consulte Descriptores de elementos .
visionText El texto en la pantalla se detecta mediante la API de reconocimiento óptico de caracteres (OCR). visionText se utiliza en combinación con la condición element_present . Mutuamente excluyentes con elementDescriptors .
nonRoboscriptActionCount El número de acciones consecutivas de secuencias de comandos que no son de Robo realizadas anteriormente. Se utiliza en combinación con la condición non_roboscript_action_performed para activar un script Robo después de cada acción Robo nonRoboscriptActionCount . Por defecto es 1 .

El siguiente es un ejemplo de un script Robo que se activa mediante un widget de interfaz de usuario 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 un script Robo activado por "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 un script Robo que espera 5 segundos después de cada acción Robo que no es un script:

{
  "contextDescriptor": {
    "condition": "non_roboscript_action_performed"
  },
  "maxNumberOfRuns" : 1000,
  "actions" : [
    {
      "eventType" : "DELAYED_MESSAGE_POSTED",
      "delayTime" : 5000
    }]
}

Comportamiento

Cada acción en un script Robo se representa como un paquete de uno o más pares atributo-valor, que se describen en la siguiente tabla:

Atributo Descripción
eventType Especifica el tipo de acción, por ejemplo, hacer clic, editar texto, etc. Requerido para cada acción.
elementDescriptors Descriptores que identifican un widget de interfaz de usuario. Requerido para todas las acciones que tienen un widget de interfaz de usuario de destino, como hacer clic en un botón en particular.
optional Si se establece en true , esta acción se omite cuando no se puede realizar. Por ejemplo, esta acción se omite cuando no puede encontrar el widget de interfaz de usuario de destino en una pantalla, sin fallar el script Robo que lo contiene. De forma predeterminada, el valor es false .
replacementText El texto que se introducirá en el widget de interfaz de usuario de destino. Requerido para acciones de edición de texto.
swipeDirection Especifica la dirección del deslizamiento. Requerido para acciones de deslizamiento.
delayTime Especifica cuánto tiempo esperar, en milisegundos. Requerido para acciones de espera.
pointTapXCoordinate y pointTapYCoordinate Las coordenadas X e Y del píxel del punto tocado. Se excluyen mutuamente con pointTapXPercent y pointTapYPercent . Requerido para acciones de toque puntual.
pointTapXPercent y pointTapYPercent El porcentaje de coordenadas X e Y del punto roscado. Se excluyen mutuamente con pointTapXCoordinate y pointTapYCoordinate . Requerido para acciones de toque puntual.

El siguiente es un ejemplo de un script Robo con dos acciones sin widgets de UI de destino, lo que significa que estas acciones no operan en un widget de UI específico:

[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "delayTime": 3000
  },
  {
    "eventType": "PRESSED_BACK"
  }
]

Descriptores de elementos

Un descriptor de elemento identifica un widget de interfaz de usuario utilizando uno o más de los siguientes atributos de identificación:

Atributo Descripción
className
ancestorClassName Nombre de clase del antecesor de la jerarquía de la interfaz de usuario del elemento. Un antepasado es cualquiera de los nodos principales en la jerarquía de la interfaz de usuario del elemento, incluido el elemento mismo.
resourceId
resourceIdRegex Expresión regular de Java para que coincida con resourceId .
contentDescription
contentDescriptionRegex Expresión regular de Java para que coincida con contentDescription .
text (que aparece en la pantalla)
textRegex Expresión regular de Java para hacer coincidir text .
groupViewChildPosition , recyclerViewChildPosition o adapterViewChildPosition Representa la posición secundaria de un widget de interfaz de usuario según el tipo de widget principal.

Con frecuencia, estos atributos no están definidos; por ejemplo, es posible que un botón no tenga texto ni descripción de contenido. Incluso si algunos valores de atributos están presentes, es posible que no sean únicos en una pantalla de aplicación determinada (incluido resourceId ).

Por ejemplo, normalmente solo es posible diferenciar entre elementos de una lista utilizando sus diferentes posiciones secundarias dentro de su widget principal. Esto significa que utilizar un solo descriptor de elemento para identificar un widget de interfaz de usuario suele ser insuficiente. Por lo tanto, el atributo elementDescriptors de una acción contiene una secuencia de descriptores de elementos que están ordenados de manera que el primero corresponda al widget de IU de destino, el segundo corresponda al widget principal del widget de IU de destino, y así sucesivamente. El widget de UI de destino de una acción coincide cuando todos sus descriptores de elementos coinciden con la subjerarquía de widgets de UI correspondiente.

El siguiente es un ejemplo de un script Robo con un cambio de texto y acciones de clic, las cuales requieren que identifique el widget de interfaz de usuario de destino utilizando 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

Opcionalmente, puede anteponer la lista de acciones en un script Robo con un objeto JSON que especifique las opciones de ejecución para ese script Robo. Este encabezado de configuración comienza con la palabra clave roboscript seguida de una representación JSON de las opciones de ejecución deseadas.

Los scripts Robo admiten las siguientes opciones de ejecución:

  • executionMode : opciones de ejecución que se aplican cuando se ejecuta un script Robo:
    • strict : si se establece en true , el script Robo no emplea coincidencias parciales, omite la acción actual ni suspende . Es decir, el script Robo se ejecuta como una prueba de instrumentación normal y falla tan pronto como no se puede realizar alguna de sus acciones. Por defecto es false .
    • notify : si se establece en false , el script Robo no muestra notificaciones en pantalla al principio y al final de su ejecución. Por defecto, es true .
  • postscript : opciones de ejecución aplicadas después de completar un script Robo:
    • terminate : si se establece en true , la prueba de Robo deja de rastrearse una vez que se completa el script de Robo. Por defecto es false .

El siguiente es un ejemplo de un script Robo ejecutado en modo strict sin notificaciones en pantalla que duerme durante tres segundos, después de lo cual el rastreo se detiene:

"roboscript": {
  "executionMode": {
    "strict": true,
    "notify": false
  },
  "postscript": {
    "terminate": true
  }
}
[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "delayTime": 3000
  }
]

Parámetros de plantilla

Un parámetro de plantilla es un marcador de posición en un script Robo que se reemplaza con el valor real cuando la prueba Robo carga ese script Robo para su ejecución. Los parámetros de plantilla tienen como prefijo un guión bajo doble seguido de un signo de porcentaje, y tienen como prefijo un signo de porcentaje seguido de un guión bajo doble.

Los scripts Robo admiten el siguiente parámetro de plantilla:

  • __%APP_PACKAGE_NAME%__ : el nombre del paquete de la aplicación bajo prueba.

El siguiente es un ejemplo de un script Robo que detiene el proceso de prueba de la aplicación:

[
  {
    "eventType": "ADB_SHELL_COMMAND",
    "command": "am force-stop __%APP_PACKAGE_NAME%__"
  }
]

Comentarios

Un script Robo puede contener líneas de comentarios, que son líneas que comienzan con # o // .

El siguiente es un ejemplo de un script Robo con un par de comentarios:

# Confirm a user account.
[
  {
    // Click the DONE button.
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
]

Capacidades

De forma predeterminada, hasta que se completen todas las acciones de un script Robo (o al menos se intenten), el script Robo permanece activo. La prueba Robo sigue intentando hacer coincidir una acción de script Robo cada vez que selecciona una acción para realizar. Robo script emplea las siguientes técnicas para aumentar la solidez:

Técnica Descripción
Coincidencia parcial Si la acción actual del script Robo no puede coincidir completamente, los criterios de coincidencia se relajan y se vuelve a intentar la coincidencia. La coincidencia parcial no considera el descriptor del elemento más externo mientras coincide con el widget de interfaz de usuario de destino de una acción de script Robo.

Si la coincidencia parcial tiene éxito, la acción del script Robo correspondiente se realiza como de costumbre. Esta técnica admite escenarios en los que la estructura de la aplicación cambia, por ejemplo, entre versiones de la aplicación, cuando se reorganizan los elementos de la pantalla.

Saltar acción actual Si la acción actual del script Robo no puede coincidir total o parcialmente, Robo intenta hacer coincidir la acción del script Robo posterior. Si la acción posterior coincide total o parcialmente, la prueba de Robo omite (y nunca regresa) la acción del script de Robo actual y realiza la siguiente.

Esta técnica admite escenarios en los que el comportamiento de la aplicación cambia entre versiones o es inestable, por ejemplo, cuando puede aparecer un cuadro de diálogo intermitente en diferentes pantallas durante la grabación o la reproducción de un script de Robo.

Suspender Si ni las acciones de Robo script actuales ni posteriores pueden coincidir total o parcialmente, Robo script se suspende temporalmente y la prueba de Robo elige una acción para realizar utilizando sus otras estrategias. Una vez completada esta acción, la prueba de Robo continúa ejecutando el script de Robo.

Mientras las acciones de Robo script actuales o posteriores no puedan coincidir, Robo script permanecerá suspendido durante cualquier número de acciones. Por lo tanto, los scripts de Robo no necesariamente tienen que ser un prólogo para una prueba de Robo, y puede intercalar acciones de script de Robo con acciones de prueba de Robo estándar. Esta técnica admite escenarios en los que el comportamiento de la aplicación es inestable o cuando los cambios entre las versiones de la aplicación son lo suficientemente grandes como para que Robo test necesite "llenar los vacíos" con sus acciones estándar.

Prioridades

Si un script Robo alcanza su maxNumberOfRuns , ya no se puede activar en un rastreo determinado. Si el contexto actual puede activar más de un script Robo, se da prioridad eligiendo, en el siguiente orden, el script Robo que:

  1. Tiene un atributo contextDescriptor .
  2. Tiene la priority más alta (de forma predeterminada, todos los scripts de Robo tienen la misma priority de ejecución de 1 ).
  3. Aparece primero en la lista de scripts de Robo, si las prioridades de los scripts de Robo son las mismas.

El siguiente es un ejemplo de un archivo con tres scripts Robo que realizan la misma acción y se activan por la misma condición: la aplicación bajo prueba está 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 aplicación bajo prueba está en primer plano, Robo activa lo siguiente, en orden:

  1. "Robo script 2" porque tiene la máxima prioridad.
  2. "Robo script 1" porque aparece antes entre los restantes scripts Robo aplicables con la misma prioridad.
  3. "Robo script 3" como último script Robo aplicable.

Carreras repetidas

De forma predeterminada, Robo activa un script Robo como máximo una vez durante un rastreo. Esto se puede ajustar mediante el atributo maxNumberOfRuns .

El siguiente es un ejemplo de un script Robo que pone la aplicación bajo prueba en segundo plano hasta 10 veces:

{
  "id": 1000,
  "maxNumberOfRuns": 10,
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  },
  "actions": [
    {
      "eventType": "GO_HOME"
    }
  ]
}

Etapa de rastreo

Los scripts de Robo se aplican en diferentes etapas de un rastreo de Robo determinado:

Etapa de rastreo Descripción
pre_crawl Antes de que Robo se inicie y comience a rastrear la aplicación bajo prueba.
post_crawl Después de que Robo termine de rastrear la aplicación bajo prueba.
crawl La etapa de rastreo principal, cuando Robo rastrea la aplicación bajo prueba.
close_screen Cuando Robo intenta regresar (retroceder) desde una pantalla determinada, cuando se exploran todas las acciones posibles en esta pantalla. De forma predeterminada, Robo presiona hacia atrás, lo cual no es deseable en algunos escenarios.

Si el atributo crawlStage de un script Robo no está especificado, se da a entender que es crawl .

El siguiente es un ejemplo de un script de Robo que borra los datos del usuario de la aplicación bajo 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 un script de Robo que le indica a Robo que haga clic en "Cancel" cada vez que intenta regresar (retroceder) desde un cuadro de 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

Un script Robo puede contener acciones condicionales. Las acciones condicionales 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 del script Robo que la contiene. De forma predeterminada, todas las acciones condicionales tienen una prioridad de 1 .
maxNumberOfRuns Cuántas veces se puede realizar esta acción condicional durante una ejecución del script Robo que lo contiene. De forma predeterminada, todas las acciones condicionales se pueden realizar como máximo una vez en una única ejecución del script Robo que las contiene.
contextDescriptor El contexto/condición que desencadena esta acción condicional. Tiene la misma estructura y ofrece capacidades similares a [el contextDescriptor del script Robo](#context-descriptor).

Cuando se activa, un script Robo realiza sus acciones no condicionales una por una en orden de aparición. Si un script Robo contiene acciones condicionales, se consideran cada vez antes de elegir una acción no condicional para realizar. Si se activa y selecciona alguna acción condicional en función de su prioridad y el número restante de ejecuciones, entonces el script Robo realiza esta acción condicional. De lo contrario, el script Robo realiza la siguiente acción no condicional. Para ser válido, un script Robo debe contener al menos una acción no condicional.

El siguiente es un ejemplo de un script Robo incondicional con una acción condicional que descarta los cuadros de diálogo emergentes si aparecen en cualquier momento durante la ejecución del script Robo:

{
  "id": 1000,
  "actions": [
    {
      "description": "Dismiss popup",
      "maxNumberOfRuns": 100,
      "contextDescriptor": {
        "condition": "default_launcher_shown",
        "negateCondition": true
      },
      "eventType": "GO_HOME"
    },
    {
      "description": "Screen off",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 26"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    }
}

Ignorar acciones

Un script de Robo puede contener instrucciones para que Robo ignore widgets de UI específicos o todos los widgets de UI en una pantalla en particular. Estas instrucciones se representan ignorando "acciones" con eventType ELEMENT_IGNORED y ALL_ELEMENTS_IGNORED correspondientemente.

Siempre que el atributo contextDescriptor de un script de Robo que contiene acciones de ignorar coincide con una pantalla determinada, Robo no interactúa con ningún widget de UI objetivo de sus acciones de ignorar (a menos que alguna otra acción de script de Robo haga que Robo realice una acción en uno de los widgets de UI ignorados).

Un script Robo puede contener una combinación de acciones de ignorar, condicionales y no condicionales. A diferencia de otras acciones de script de Robo, las acciones de ignorar se aplican siempre que contextDescriptor del script de Robo que contiene coincida con una pantalla durante un rastreo de Robo, independientemente de los valores de los atributos priority y maxNumberOfRuns .

El siguiente es un ejemplo de un archivo con dos scripts Robo. El primer script de Robo hace que Robo ignore todos los widgets de UI en una pantalla que contiene un widget de UI con un ID de recurso "my.app.package:id/ignored_screen" . El segundo script de Robo hace que Robo ignore los widgets de UI cuyos ID de recursos coincidan con la expresión regular de Java ".*:id/done" en una pantalla que contiene un widget de UI 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 widgets secundarios de RecyclerView y AdapterView se cargan dinámicamente y pueden mostrarse al deslizar el dedo desde la pantalla actual. Dado que el tamaño de una pantalla y la cantidad de deslizamientos necesarios para llegar a este niño son diferentes para diferentes factores de forma del dispositivo, es mucho más sólido confiar en la posición de los datos del niño, que es absoluta. Es un enfoque menos sólido confiar en la cantidad de golpes que se requieren para llevar a este niño a la pantalla y luego usar su posición en la pantalla.

Por lo tanto, Robo script captura las posiciones de datos absolutas de los elementos secundarios de RecyclerView que son objetivos de las acciones de Robo script como recyclerViewChildPosition . Robo script también captura las posiciones de datos absolutas de los elementos secundarios de AdapterView que son objetivos de las acciones de Robo script como adapterViewChildPosition .

Las acciones en los elementos secundarios de RecyclerView y AdapterView se realizan en los siguientes pasos:

  1. La prueba Robo garantiza que el niño correspondiente se muestre en la pantalla mediante una acción de posicionamiento en el RecyclerView o AdapterView que lo contiene.

  2. Robo test realiza la acción grabada directamente en el elemento secundario, ya que ya se muestra en la pantalla.

El siguiente es un ejemplo de una acción de hacer clic en un elemento secundario 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 hacer 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
    }
  ]
}

Grabe un script Robo en Android Studio y ejecútelo en Test Lab

Puede crear un script Robo en Android Studio, que guarda el script como un archivo JSON. Luego puede cargar el archivo JSON en Firebase Test Lab con la aplicación y ejecutar la prueba en consecuencia.

Cuando ejecuta una prueba de Robo con un script adjunto, la prueba de Robo primero avanza a través de las acciones preescritas y luego explora la aplicación como de costumbre.

Para crear un archivo JSON de Robo script en Android Studio, siga los pasos en Grabar un script Robo usando Test Lab en Android Studio .

Acciones de script robótico

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 script de Robo en los resultados de las pruebas de Robo.

Afirmación

Si la condición afirmada es verdadera, el script Robo continúa con la siguiente acción, que podría ser otra afirmación. De lo contrario, la ejecución del script Robo se detiene debido a una aserción fallida.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "ASSERTION" --
contextDescriptor Describe el contexto o condición afirmada. Tiene la misma estructura y ofrece capacidades similares a las del contextDescriptor del script Robo .

El siguiente es un ejemplo de una aserción de script Robo que verifica que la aplicación bajo prueba esté en primer plano:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  }
}

El siguiente es un ejemplo de una aserción de script Robo que verifica que un widget de interfaz de usuario 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 script Robo que verifica que NO se detecte "Settings" en una pantalla usando OCR:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "negateCondition": true,
    "visionText": "Settings"
  }
}

Hacer clic

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
eventType Especifica el tipo de acción del script Robo.
"eventType": "VIEW_CLICKED" Hace clic en el elemento de destino de la aplicación bajo prueba.
"eventType": "SOFT_KEYBOARD_CLICK" Hace clic en el elemento de destino del teclado virtual.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Hace clic en elementos aleatorios del teclado virtual hasta maxNumberOfRuns veces.
"eventType": "LIST_ITEM_CLICKED" Utilizado por la grabadora de scripts Robo en Android Studio para hacer clic en elementos de la lista.
elementDescriptors Identifica el widget de UI en el que se hizo clic mediante la jerarquía de UI de Android. Mutuamente excluyente con visionText .
visionText Identifica el elemento en el que se hizo clic mediante OCR. Mutuamente excluyentes con elementDescriptors .
maxNumberOfRuns Especifica cuántas veces hacer clic en un elemento aleatorio del teclado virtual, cuando eventType es SOFT_KEYBOARD_RANDOM_CLICK . El valor predeterminado es 1 .

El siguiente es un ejemplo de una acción de secuencia de comandos 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 script Robo que hace clic en "Privacy Policy" detectada en una pantalla usando OCR:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

El siguiente es un ejemplo de una acción de secuencia de comandos Robo que hace clic en un elemento del teclado virtual 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 Robo que hace clic en elementos aleatorios del teclado en pantalla hasta cinco veces:

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

Deshabilitar el teclado virtual

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "DISABLE_KEYBOARD" --

El siguiente es un ejemplo de una acción de script Robo que desactiva el teclado virtual:

{
  "eventType": "DISABLE_KEYBOARD"
}

Ejecutar el comando adb shell

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "ADB_SHELL_COMMAND" --
command El comando de shell de Android Debug Bridge (adb) que se ejecutará.

El siguiente atributo es opcional:

  • expectedOutputRegex : el resultado esperado del comando como una expresión regular de Java. Si el resultado no coincide, la acción del script Robo falla. De forma predeterminada, es una cadena vacía, lo que significa que la salida no se verifica.

El siguiente es un ejemplo de una acción de secuencia de comandos Robo que borra los datos del usuario de la aplicación bajo prueba:

{
  "eventType": "ADB_SHELL_COMMAND",
  "command": "pm clear __%APP_PACKAGE_NAME%__"
}

Conceder permisos

Esta acción es registrada por la grabadora de scripts Robo en Android Studio para compatibilidad con versiones anteriores de Espresso Test Recorder . La prueba Robo otorga todos los permisos a la aplicación bajo prueba al comienzo de cada rastreo y, por lo tanto, esta acción no es operativa. NO utilice esta acción en sus scripts Robo.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "PERMISSIONS_REQUEST" --

Ignorar todos los elementos en una pantalla.

Esta acción hace que Robo ignore todos los elementos en cualquier pantalla que active el script de Robo que lo contiene.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "ALL_ELEMENTS_IGNORED" --

El siguiente es un ejemplo de una acción de script de Robo que hace que Robo ignore todos los elementos en una pantalla:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Ignorar un elemento

Esta acción hace que Robo ignore un elemento (o elementos) que coincidan con los elementDescriptors especificados.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Identifica los widgets de UI ignorados usando la jerarquía de UI de Android.

El siguiente atributo es opcional:

  • ignoreChildren : si se establece en true , Robo también ignora todos los descendientes de los widgets de UI ignorados. Por defecto es false .

El siguiente es un ejemplo de una acción de script de Robo que hace que Robo ignore todos los elementos, cuyas descripciones de contenido comienzan con "Avatar" :

{
  "eventType": "ELEMENT_IGNORED",
  "elementDescriptors": [
    {
      "contentDescriptionRegex": "Avatar.*"
    }
  ]
}

Texto de entrada

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
eventType Especifica el tipo de acción del script Robo.
"eventType": "VIEW_TEXT_CHANGED" Ingresa el texto dado en el widget de interfaz de usuario de destino.
"eventType": "ENTER_TEXT" ingresa el texto dado en el widget de UI de destino y luego envía un evento KEYCODE_ENTER a este widget de UI.
elementDescriptors Identifica el widget de la interfaz de usuario de destino mediante la jerarquía de la interfaz de usuario de Android.
replacementText El texto que se introducirá en el widget de interfaz de usuario de destino.

El siguiente es un ejemplo de una acción de secuencia de comandos Robo que ingresa "John" en un widget de interfaz de usuario 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 largo

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identifica el widget de la interfaz de usuario de destino mediante la jerarquía de la interfaz de usuario de Android. Mutuamente excluyente con visionText .
visionText Identifica el elemento en el que se hizo clic durante mucho tiempo mediante OCR. Mutuamente excluyentes con elementDescriptors .

El siguiente atributo es opcional:

  • delayTime : especifica cuánto dura la pulsación de un clic largo, en milisegundos.

El siguiente es un ejemplo de una acción de script Robo que realiza un clic de cinco segundos de duración en un widget de interfaz de usuario con la descripción del contenido "Avatar 8" :

{
  "eventType": "VIEW_LONG_CLICKED",
  "elementDescriptors": [
    {
      "contentDescription": "Avatar 8"
    }
  ],
  "delayTime": 5000
}

Realizar un gesto de un punto

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "ONE_POINT_GESTURE" --
coordinates Dos coordenadas para un gesto de un punto, formateadas como "(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 realiza una acción de arrastrar y soltar. Por defecto es false .

El siguiente es un ejemplo de una acción de gesto de un punto de Robo script que realiza un deslizamiento hacia abajo:

{
  "eventType": "ONE_POINT_GESTURE",
  "coordinates": "(50%,25%)->(50%,75%)"
}

Realizar un gesto de dos puntos.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "TWO_POINT_GESTURE" --
coordinates Cuatro coordenadas para un gesto de dos puntos, formateadas como "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" como porcentajes o píxeles.

El siguiente es un ejemplo de una acción de script Robo que realiza un gesto de pellizcar:

{
  "eventType": "TWO_POINT_GESTURE",
  "coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}

Realizar una acción IME

Esta acción presiona el botón de acción actual, por ejemplo, siguiente, listo y buscar, en el Editor de métodos de entrada (IME) para el widget de interfaz de usuario de destino especificado.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Identifica el widget de la interfaz de usuario de destino mediante la jerarquía de la interfaz de usuario de Android.

El siguiente es un ejemplo de una acción de secuencia de comandos Robo que realiza una acción IME en un widget de interfaz de usuario con el ID de recurso "com.google.samples.apps.topeka:id/first_name" :

{
  "eventType": "PRESSED_EDITOR_ACTION",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/first_name"
    }
  ]
}

Contener

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
eventType Especifica el tipo de acción del script Robo.
"eventType": "PRESSED_BACK" Envía un evento KEYCODE_BACK al dispositivo.
"eventType": "PRESSED_BACK_EMULATOR_28" Utilizado por la grabadora de scripts Robo en Android Studio para presionar hacia atrás en los emuladores API 28.

El siguiente es un ejemplo de una acción de script Robo que presiona hacia atrás:

{
  "eventType": "PRESSED_BACK"
}

Presione inicio

Esta acción envía un evento KEYCODE_HOME al dispositivo.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "GO_HOME" --

El siguiente es un ejemplo de una acción de script Robo que presiona inicio:

{
  "eventType": "GO_HOME"
}

Desplazar un elemento a la vista

Esta acción hace que la prueba de Robo se desplace hacia adelante en el widget de UI que coincide con los elementDescriptors especificados hasta que el widget de UI que coincide con los childElementDescriptors especificados esté presente en la pantalla, o el widget desplazado ya no se pueda desplazar, o se alcance el número máximo de 50 desplazamientos.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identifica el widget de IU desplazado mediante la jerarquía de IU de Android.
childElementDescriptors Identifica el widget de la interfaz de usuario al que desplazarse utilizando la jerarquía de la interfaz de usuario de Android.

El siguiente es un ejemplo de una acción de script Robo que desplaza el widget de UI con el ID de recurso "my.app.package:id/scrollable_card_container" hasta que el widget de UI con el texto "Orange" esté presente en la pantalla (o no se pueden realizar más desplazamientos). realizar, o se alcanza el número máximo de 50 desplazamientos):

{
  "eventType": "ELEMENT_SCROLL_INTO_VIEW",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/scrollable_card_container"
    }
  ],
  "childElementDescriptors": [
    {
      "text": "Orange"
    }
  ]
}

Golpe fuerte

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "VIEW_SWIPED" --
swipeDirection Especifica la dirección del deslizamiento:
  • Left
  • Right
  • Up
  • Down
  • Forward : Down o Right dependiendo de la capacidad de desplazamiento vertical u horizontal del widget de interfaz de usuario de destino.
  • Backward : Up o Left , según la capacidad de desplazamiento vertical u horizontal del widget de interfaz de usuario de destino.
elementDescriptors Identifica el widget de la interfaz de usuario de destino mediante la jerarquía de la interfaz de usuario de Android.

El siguiente es un ejemplo de una acción de script Robo que desliza hacia arriba un widget de interfaz de usuario con el ID de recurso "my.app.package:id/custom_content" :

{
  "eventType": "VIEW_SWIPED",
  "swipeDirection": "Up",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/custom_content"
    }
  ]
}

Tomar captura de pantalla

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "TAKE_SCREENSHOT" --
screenshotName Especifica el nombre del archivo de captura de pantalla.

El siguiente es un ejemplo de una acción de script Robo que toma una captura de pantalla:

{
  "eventType": "TAKE_SCREENSHOT",
  "screenshotName": "my_screenshot"
}

Toca un punto en la pantalla

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "POINT_TAP" --
pointTapXCoordinate La coordenada X del píxel del punto tocado. Se excluyen mutuamente con pointTapXPercent y pointTapYPercent .
pointTapYCoordinate La coordenada Y del píxel del punto tocado. Se excluyen mutuamente con pointTapXPercent y pointTapYPercent .
pointTapXPercent El porcentaje de la coordenada X del punto roscado. Se excluyen mutuamente con pointTapXCoordinate y pointTapYCoordinate .
pointTapYPercent El porcentaje de la coordenada Y del punto roscado. Se excluyen mutuamente con pointTapXCoordinate y pointTapYCoordinate .

El siguiente es un ejemplo de una acción de script Robo que toca en medio de una pantalla:

{
  "eventType": "POINT_TAP",
  "pointTapXPercent": 50,
  "pointTapYPercent": 50
}

Toque un punto dentro de un elemento

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent El porcentaje de coordenada X dentro del elemento de destino.
pointTapYPercent El porcentaje de coordenada Y dentro del elemento de destino.
elementDescriptors Identifica el widget de interfaz de usuario de destino mediante la jerarquía de interfaz de usuario de Android.

El siguiente es un ejemplo de una acción de script Robo que mueve el control deslizante de una barra de búsqueda hacia la derecha:

{
  "eventType": "POINT_TAP_ELEMENT",
  "pointTapXPercent": 80,
  "pointTapYPercent": 50,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/my_seekbar"
    }
  ]
}

Terminar el rastreo

Esta acción detiene la prueba Robo.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "TERMINATE_CRAWL" --

El siguiente es un ejemplo de una acción de script Robo que detiene una prueba Robo:

{
  "eventType": "TERMINATE_CRAWL"
}

Esperar

La siguiente tabla enumera los atributos requeridos:

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 script Robo que espera tres segundos:

{
  "eventType": "DELAYED_MESSAGE_POSTED",
  "delayTime": 3000
}

Esperar un elemento

Esta acción hace que Robo test espere a que aparezca un elemento en la pantalla hasta el tiempo de espera especificado.

La siguiente tabla enumera los atributos requeridos:

Atributo Descripción
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Especifica el tiempo de espera, en milisegundos.
elementDescriptors Identifica el widget de UI esperado usando la jerarquía de UI de Android.

El siguiente es un ejemplo de una acción de script Robo que espera hasta 30 segundos para que aparezca en la pantalla un widget de interfaz de usuario con el ID de recurso "my.app.package:id/confirmation_button" :

{
  "eventType": "WAIT_FOR_ELEMENT",
  "delayTime": 30000,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/confirmation_button"
    }
  ]
}

Próximos pasos