Referenzhandbuch für Robo-Skripte

Dieses Dokument enthält Referenzinformationen zu Robo-Skripten, einschließlich Struktur, Funktionen, Verwendung, Aufzeichnung und Aktionen. Robo-Skripte sind Tests, die manuelle Qualitätssicherungsaufgaben (QA) für mobile Apps automatisieren und kontinuierliche Integration (CI) und Teststrategien vor dem Start ermöglichen. Ein Robo-Skript ist eine JSON-Datei, die eine Abfolge von Benutzeroberflächen (UI) und anderen Aktionen beschreibt.

Sie können ein Robo-Skript auf folgende Weise erstellen:

  • Nutzen Sie die Robo-Skriptaufzeichnungsfunktion. (Nur Android)

  • Erstellen Sie das Robo-Skript manuell. (Android und iOS+)

  • Zeichnen Sie das Robo-Skript auf und bearbeiten Sie es dann manuell. (Nur Android)

Weitere Informationen zur Verwendung von Robo-Skripten finden Sie unter Ausführen eines Robo-Skripts .

Einführung

Robo-Skript wird für Robo-Tests zusammen mit anderen Eingaben wie dem Android Application Package (APK) der zu testenden App bereitgestellt.

Das Folgende ist ein Beispiel für ein Robo-Skript, das einen Benutzer bei einer App anmeldet und ausgelöst wird, wenn die zu testende App gestartet wird:

[
  {
    "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"
          }
        ]
      }
    ]
  }
]

Wenn es in einer Datei ein einzelnes Robo-Skript gibt und es über die standardmäßige Auslösebedingung app_under_test_shown verfügt, wie im Beispiel oben, können Sie das Robo-Skript in einer Datei in einem einfacheren Format angeben – einfach als Folge seiner Aktionen:

[
  {
    "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"
      }
    ]
  }
]

iOS+-Unterstützung für Robo-Skripte

Robo für iOS+ (Beta) bietet eingeschränkte Unterstützung für Robo-Skripte. Die Robo-Skriptsyntax für iOS+ ist identisch mit der Android-Syntax und die unterstützten iOS+-Funktionen verhalten sich ähnlich wie ihre Android-Gegenstücke.

Die folgenden Aktionen werden in iOS+ unterstützt:

  • Behauptung
  • Klicken
  • Langer Klick
  • Wischen
  • Alle Elemente ignorieren
  • Warten
  • Einen Screenshot machen
  • Crawl beenden

Die folgenden identifizierenden Attribute in Elementdeskriptoren werden in iOS+ unterstützt:

  • Klassenname
  • Name der Vorgängerklasse
  • Inhaltsbeschreibung (und Regex)
  • Text (und Regex)

Die folgenden Auslösebedingungen in Kontextdeskriptoren werden in iOS+ unterstützt:

  • Die getestete App wird angezeigt
  • Element vorhanden
  • Nicht-Robo-Skriptaktion ausgeführt

Struktur

Ein Robo-Skript verfügt über mehrere Attribute, die beschreiben, wie Robo es ausführt. Die meisten dieser Attribute sind optional mit vordefinierten Standardwerten:

Attribut Beschreibung
id Eine Ganzzahl, die dabei hilft, dieses Robo-Skript in Crawl-Ausgaben zu verfolgen. Robo verfügt über integrierte Robo-Skripte mit eigenen id . Obwohl die gleiche id in verschiedenen Robo-Skripten keinen Einfluss auf deren Verhalten hat, kann es schwierig sein, Aktionen dieser Robo-Skripte in Crawl-Ausgaben zu unterscheiden. Wir empfehlen, Ihren Robo-Skripten eine eindeutige id von 1000 oder höher zuzuweisen, um Konflikte zu vermeiden.
description Ähnlich wie id , aber aussagekräftiger.
crawlStage In der Phase eines Crawls wendet Robo dieses Robo-Skript an. Standardmäßig handelt es sich um die Haupt-Crawling-Phase.
priority Die Priorität dieses Robo-Skripts im Vergleich zu anderen Robo-Skripten. Standardmäßig haben alle Robo-Skripte die Priorität 1 .
maxNumberOfRuns Gibt an, wie oft Robo während eines Crawls dieses Robo-Skript ausführen kann. Standardmäßig kann Robo ein Robo-Skript einmalig ausführen.
contextDescriptor Beschreibt den Kontext oder die Bedingung, die dieses Robo-Skript auslöst. Wenn es weggelassen wird, wird davon ausgegangen, dass die Auslösebedingung dieses Robo-Skripts immer erfüllt ist. Mit anderen Worten: Das Robo-Skript ist bedingungslos.
actions Alle Aktionen dieses Robo-Skripts.

Eine einzelne Datei enthält eine Sammlung von einem oder mehreren Robo-Skripten.

Das Folgende ist ein Beispiel für eine Datei mit zwei unbedingten Robo-Skripten, jedes mit einer einzelnen Aktion, die einmal zu Beginn eines Crawls ausgeführt wird:

[
  {
    "id": 1000,
    "description": "My first Robo script",
    "actions": [
      {
        "eventType": "DISABLE_KEYBOARD"
      }
    ]
  },
  {
    "id": 1001,
    "description": "My second Robo script",
    "actions": [
      {
        "eventType": "PRESSED_BACK"
      }
    ]
  }
]

Kontextdeskriptor

Ein Kontextdeskriptor definiert den Kontext oder die Bedingung, die ein Robo-Skript auslöst, indem er ein oder eine Kombination mehrerer Attribute verwendet:

Attribut Beschreibung
"condition": "always" Löst immer ein Robo-Skript aus.
"condition": "element_present" Überprüft, ob ein UI-Widget, das elementDescriptors oder dem von visionText angegebenen Text entspricht, auf dem Bildschirm vorhanden ist.
"condition": "element_disabled" Überprüft, ob ein UI-Widget, das elementDescriptors entspricht, auf dem Bildschirm vorhanden ist und nicht interagiert werden kann.
"condition": "element_checked" Überprüft, ob ein UI-Widget, das mit elementDescriptors übereinstimmt, auf dem Bildschirm vorhanden ist und überprüft wird.
"condition": "app_under_test_shown" Überprüft, ob die zu testende App im Vordergrund ausgeführt wird.
"condition": "default_launcher_shown" Überprüft, ob der Startbildschirm eines Geräts angezeigt wird, was bedeutet, dass keine Apps im Vordergrund ausgeführt werden.
"condition": "non_roboscript_action_performed" Überprüft, ob die letzten vom Robo-Test ausgeführten aufeinanderfolgenden nonRoboscriptActionCount Aktionen keine Robo-Skriptaktionen sind.
negateCondition Wenn auf true gesetzt, wird die condition negiert. Mit diesem Attribut können Sie beispielsweise prüfen, ob auf dem Bildschirm KEIN UI-Widget vorhanden ist oder ob die zu testende App NICHT im Vordergrund ausgeführt wird.
elementDescriptors Ein oder mehrere Elementdeskriptoren, die ein UI-Widget auf dem Bildschirm identifizieren. Es wird in Kombination mit den Bedingungen element_present , element_disabled und element_checked verwendet. Gegenseitig ausschließend mit visionText . Weitere Informationen finden Sie unter Elementdeskriptoren .
visionText Text auf dem Bildschirm wird mithilfe der OCR-API (Optical Character Recognition) erkannt. visionText wird in Kombination mit der Bedingung element_present verwendet. Sich gegenseitig ausschließend mit elementDescriptors .
nonRoboscriptActionCount Die Anzahl der zuvor ausgeführten aufeinanderfolgenden Nicht-Robo-Skriptaktionen. Es wird in Kombination mit der Bedingung non_roboscript_action_performed verwendet, um nach jeder nonRoboscriptActionCount Robo-Aktion ein Robo-Skript auszulösen. Standardmäßig ist es 1 .

Das Folgende ist ein Beispiel für ein Robo-Skript, das durch ein UI-Widget mit der Ressourcen-ID "my.app.package:id/page_header" auf dem Bildschirm ausgelöst wird:

{
  "id": 1000,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/page_header"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Settings"
        }
      ]
    }
  ]
}

Das Folgende ist ein Beispiel für ein Robo-Skript, das durch "Privacy Policy" ausgelöst wird, die durch die optische Zeichenerkennung (OCR) erkannt wird:

{
  "id": 1000,
  "description": "Vision text Robo script",
  "contextDescriptor": {
    "condition": "element_present",
    "visionText": "Privacy Policy"
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "visionText": "Privacy Policy"
    }
  ]
}

Das Folgende ist ein Beispiel für ein Robo-Skript, das nach jeder Robo-Aktion, die kein Skript ist, 5 Sekunden wartet:

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

Aktionen

Jede Aktion in einem Robo-Skript wird als Bündel aus einem oder mehreren Attribut-Wert-Paaren dargestellt, die in der folgenden Tabelle beschrieben werden:

Attribut Beschreibung
eventType Gibt den Typ der Aktion an, z. B. Klicken, Textbearbeitung usw. Für jede Aktion erforderlich.
elementDescriptors Deskriptoren, die ein UI-Widget identifizieren. Erforderlich für alle Aktionen, die über ein Ziel-UI-Widget verfügen, z. B. das Klicken auf eine bestimmte Schaltfläche.
optional Wenn auf true gesetzt, wird diese Aktion übersprungen, wenn sie nicht ausgeführt werden kann. Diese Aktion wird beispielsweise übersprungen, wenn das Ziel-UI-Widget auf einem Bildschirm nicht gefunden werden kann – ohne dass das enthaltende Robo-Skript fehlschlägt. Standardmäßig ist der Wert false .
replacementText Der Text, der in das Ziel-UI-Widget eingegeben werden soll. Erforderlich für Textbearbeitungsaktionen.
swipeDirection Gibt die Richtung des Wischens an. Erforderlich für Wischaktionen.
delayTime Gibt an, wie lange in Millisekunden gewartet werden soll. Erforderlich für Warteaktionen.
pointTapXCoordinate und pointTapYCoordinate Die Pixel-X- und Y-Koordinaten des angetippten Punkts. Schließt sich gegenseitig mit pointTapXPercent und pointTapYPercent aus. Erforderlich für Punkttippaktionen.
pointTapXPercent und pointTapYPercent Die prozentualen X- und Y-Koordinaten des angetippten Punkts. Schließt sich gegenseitig mit pointTapXCoordinate und pointTapYCoordinate aus. Erforderlich für Punkttippaktionen.

Das Folgende ist ein Beispiel für ein Robo-Skript mit zwei Aktionen ohne Ziel-UI-Widgets, was bedeutet, dass diese Aktionen nicht auf einem bestimmten UI-Widget ausgeführt werden:

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

Elementdeskriptoren

Ein Elementdeskriptor identifiziert ein UI-Widget mithilfe eines oder mehrerer der folgenden identifizierenden Attribute:

Attribut Beschreibung
className
ancestorClassName Klassenname des Vorfahren der UI-Hierarchie des Elements. Ein Vorfahre ist jeder der übergeordneten Knoten in der UI-Hierarchie des Elements, einschließlich des Elements selbst.
resourceId
resourceIdRegex Regulärer Java-Ausdruck, der mit resourceId übereinstimmt.
contentDescription
contentDescriptionRegex Regulärer Java-Ausdruck, der mit contentDescription übereinstimmt.
text (der auf dem Bildschirm erscheint)
textRegex Regulärer Java-Ausdruck zum Abgleichen text .
groupViewChildPosition , recyclerViewChildPosition oder adapterViewChildPosition Stellt die untergeordnete Position eines UI-Widgets abhängig von der Art seines übergeordneten Widgets dar.

Häufig sind diese Attribute undefiniert, beispielsweise verfügt eine Schaltfläche möglicherweise nicht über Text und Inhaltsbeschreibung. Selbst wenn einige Attributwerte vorhanden sind, sind sie möglicherweise auf einem bestimmten App-Bildschirm (einschließlich resourceId ) nicht eindeutig.

Beispielsweise ist die Unterscheidung zwischen Elementen einer Liste im Allgemeinen nur durch die Verwendung ihrer unterschiedlichen untergeordneten Positionen innerhalb ihres übergeordneten Widgets möglich. Dies bedeutet, dass die Verwendung nur eines Elementdeskriptors zur Identifizierung eines UI-Widgets normalerweise nicht ausreicht. Daher enthält das Attribut elementDescriptors einer Aktion eine Folge von Elementdeskriptoren, die so angeordnet sind, dass der erste dem Ziel-UI-Widget entspricht, der zweite dem übergeordneten Widget des Ziel-UI-Widgets usw. Das Ziel-UI-Widget einer Aktion stimmt überein, wenn alle seine Elementdeskriptoren mit der entsprechenden Unterhierarchie des UI-Widgets übereinstimmen.

Im Folgenden sehen Sie ein Beispiel für ein Robo-Skript mit einer Textänderung und Klickaktionen, die beide erfordern, dass Sie das Ziel-UI-Widget mithilfe der bereitgestellten Elementdeskriptoren identifizieren:

[
  {
    "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"
      }
    ]
  }
]

Ausführungsmöglichkeiten

Sie können der Liste der Aktionen in einem Robo-Skript optional ein JSON-Objekt voranstellen, das die Ausführungsoptionen für dieses Robo-Skript angibt. Dieser Konfigurationsheader beginnt mit dem Schlüsselwort roboscript , gefolgt von einer JSON-Darstellung der gewünschten Ausführungsoptionen.

Robo-Skripte unterstützen die folgenden Ausführungsoptionen:

  • executionMode – Ausführungsoptionen, die angewendet werden, wenn ein Robo-Skript ausgeführt wird:
    • strict – wenn auf true gesetzt, verwendet das Robo-Skript keinen partiellen Abgleich, überspringt die aktuelle Aktion und sperrt nicht . Das heißt, das Robo-Skript wird als regulärer Instrumentierungstest ausgeführt und schlägt fehl, sobald eine seiner Aktionen nicht ausgeführt werden kann. Standardmäßig ist es false .
    • notify – wenn auf false gesetzt, zeigt das Robo-Skript zu Beginn und am Ende seiner Ausführung keine Bildschirmbenachrichtigungen an. Standardmäßig ist es true .
  • postscript – Ausführungsoptionen, die nach Abschluss eines Robo-Skripts angewendet werden:
    • terminate – wenn auf true gesetzt, stoppt der Robo-Test das Crawlen, nachdem das Robo-Skript abgeschlossen ist. Standardmäßig ist es false .

Das Folgende ist ein Beispiel für ein Robo-Skript, das im strict Modus ohne Benachrichtigungen auf dem Bildschirm ausgeführt wird und drei Sekunden lang schläft, wonach der Crawl stoppt:

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

Vorlagenparameter

Ein Vorlagenparameter ist ein Platzhalter in einem Robo-Skript, der durch den tatsächlichen Wert ersetzt wird, wenn der Robo-Test das Robo-Skript zur Ausführung lädt. Vorlagenparametern wird ein doppelter Unterstrich gefolgt von einem Prozentzeichen vorangestellt und ihnen wird ein Prozentzeichen gefolgt von einem doppelten Unterstrich vorangestellt.

Robo-Skripte unterstützen den folgenden Vorlagenparameter:

  • __%APP_PACKAGE_NAME%__ – der Paketname der zu testenden App.

Das Folgende ist ein Beispiel für ein Robo-Skript, das den Prozess der zu testenden App stoppt:

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

Kommentare

Ein Robo-Skript kann Kommentarzeilen enthalten, also Zeilen, die mit # oder // beginnen.

Das Folgende ist ein Beispiel eines Robo-Skripts mit einigen Kommentaren:

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

Fähigkeiten

Standardmäßig bleibt das Robo-Skript aktiv, bis alle Aktionen eines Robo-Skripts abgeschlossen (oder zumindest versucht) sind. Der Robo-Test versucht immer wieder, eine Robo-Skript-Aktion abzugleichen, wenn er eine auszuführende Aktion auswählt. Robo-Skripte nutzen die folgenden Techniken, um die Robustheit zu erhöhen:

Technik Beschreibung
Teilweise Übereinstimmung Wenn die aktuelle Robo-Skriptaktion nicht vollständig abgeglichen werden kann, werden die Abgleichskriterien gelockert und der Abgleich wird erneut versucht. Beim teilweisen Abgleich wird der äußerste Elementdeskriptor beim Abgleich mit dem Ziel-UI-Widget einer Robo-Skriptaktion nicht berücksichtigt.

Wenn der teilweise Abgleich erfolgreich ist, wird die entsprechende Robo-Skript-Aktion wie gewohnt ausgeführt. Diese Technik unterstützt Szenarien, in denen sich die App-Struktur ändert, beispielsweise zwischen App-Versionen, wenn Bildschirmelemente neu angeordnet werden.

Aktuelle Aktion überspringen Wenn die aktuelle Robo-Skriptaktion nicht ganz oder teilweise übereinstimmen kann, versucht Robo, mit der nachfolgenden Robo-Skriptaktion übereinzustimmen. Wenn die nachfolgende Aktion ganz oder teilweise übereinstimmt, überspringt der Robo-Test die aktuelle Robo-Skript-Aktion (und kehrt nie zu ihr zurück) und führt die nachfolgende Aktion aus.

Diese Technik unterstützt Szenarien, in denen sich das App-Verhalten zwischen den Versionen ändert oder unregelmäßig ist, beispielsweise wenn während der Aufzeichnung oder Wiedergabe eines Robo-Skripts ein zeitweiliger Dialog auf verschiedenen Bildschirmen angezeigt wird.

Aussetzen Wenn weder aktuelle noch nachfolgende Aktionen des Robo-Skripts vollständig oder teilweise übereinstimmen, wird das Robo-Skript vorübergehend ausgesetzt und der Robo-Test wählt eine Aktion aus, die mithilfe seiner anderen Strategien ausgeführt werden soll. Nachdem diese Aktion abgeschlossen ist, fährt der Robo-Test mit der Ausführung des Robo-Skripts fort.

Solange aktuelle oder nachfolgende Robo-Skript-Aktionen nicht zugeordnet werden können, bleibt das Robo-Skript für eine beliebige Anzahl von Aktionen ausgesetzt. Daher müssen Robo-Skripte nicht unbedingt ein Prolog für einen Robo-Test sein, und Sie können Robo-Skriptaktionen mit Standard-Robo-Testaktionen durchsetzen. Diese Technik unterstützt Szenarien, in denen das App-Verhalten unbeständig ist oder wenn die Änderungen zwischen App-Versionen so groß sind, dass Robo Test mit seinen Standardaktionen „die Lücken schließen“ muss.

Prioritäten

Wenn ein Robo-Skript seine maxNumberOfRuns erreicht, kann es in einem bestimmten Crawl nicht mehr ausgelöst werden. Wenn mehr als ein Robo-Skript durch den aktuellen Kontext ausgelöst werden kann, wird Priorität eingeräumt, indem in der folgenden Reihenfolge das Robo-Skript ausgewählt wird, das:

  1. Verfügt über ein contextDescriptor Attribut.
  2. Hat die höchste priority (standardmäßig haben alle Robo-Skripte die gleiche priority von 1 ).
  3. Erscheint am frühesten in der Liste der Robo-Skripte, wenn die Prioritäten der Robo-Skripte gleich sind.

Das Folgende ist ein Beispiel für eine Datei mit drei Robo-Skripten, die dieselbe Aktion ausführen und durch dieselbe Bedingung ausgelöst werden – die zu testende App befindet sich im Vordergrund:

[
  {
    "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
      }
    ]
  }
]

Wenn sich die zu testende App im Vordergrund befindet, löst Robo Folgendes in der folgenden Reihenfolge aus:

  1. "Robo script 2" , da es die höchste Priorität hat.
  2. "Robo script 1" , da es unter den verbleibenden anwendbaren Robo-Skripten mit derselben Priorität früher erscheint.
  3. "Robo script 3" als letztes anwendbares Robo-Skript.

Wiederholte Läufe

Standardmäßig löst Robo während eines Crawls höchstens einmal ein Robo-Skript aus. Dies kann über das Attribut maxNumberOfRuns angepasst werden.

Das Folgende ist ein Beispiel für ein Robo-Skript, das die zu testende App bis zu zehn Mal in den Hintergrund schaltet:

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

Kriechphase

Robo-Skripte sind in verschiedenen Phasen eines bestimmten Robo-Crawls anwendbar:

Kriechphase Beschreibung
pre_crawl Bevor Robo startet und mit dem Crawlen der zu testenden App beginnt.
post_crawl Nachdem Robo das Crawlen der zu testenden App abgeschlossen hat.
crawl Die Haupt-Crawling-Phase, in der Robo die zu testende App crawlt.
close_screen Wenn Robo versucht, von einem bestimmten Bildschirm zurückzukehren (zurückzuverfolgen), werden alle möglichen Aktionen auf diesem Bildschirm untersucht. Standardmäßig drückt Robo zurück, was in manchen Szenarien unerwünscht ist.

Wenn das crawlStage Attribut eines Robo-Skripts nicht angegeben ist, wird impliziert, dass es crawl ist.

Das Folgende ist ein Beispiel für ein Robo-Skript, das die Benutzerdaten der zu testenden App löscht, bevor Robo mit dem Crawlen beginnt:

{
  "id": 1000,
  "crawlStage": "pre_crawl",
  "actions": [
    {
      "eventType": "ADB_SHELL_COMMAND",
      "command": "pm clear __%APP_PACKAGE_NAME%__"
    }
  ]
}

Das Folgende ist ein Beispiel für ein Robo-Skript, das Robo anweist, auf "Cancel" zu klicken, wenn es versucht, von einem Bestätigungsdialog zurückzukehren (zurückzuverfolgen):

{
  "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"
        }
      ]
    }
  ]
}

Bedingte Aktionen

Ein Robo-Skript kann bedingte Aktionen enthalten. Bedingte Aktionen verfügen über drei zusätzliche Attribute, die beschreiben, wie Robo sie ausführt:

Attribut Beschreibung
priority Die Priorität dieser bedingten Aktion im Vergleich zu anderen bedingten Aktionen innerhalb des enthaltenen Robo-Skripts. Standardmäßig haben alle bedingten Aktionen die Priorität 1 .
maxNumberOfRuns Wie oft kann diese bedingte Aktion während einer Ausführung des enthaltenen Robo-Skripts ausgeführt werden? Standardmäßig können alle bedingten Aktionen höchstens einmal in einer einzigen Ausführung des sie enthaltenden Robo-Skripts ausgeführt werden.
contextDescriptor Der Kontext/die Bedingung, die diese bedingte Aktion auslöst. Es hat die gleiche Struktur und bietet ähnliche Funktionen wie [der contextDescriptor des Robo-Skripts](#context-descriptor).

Wenn es ausgelöst wird, führt ein Robo-Skript seine bedingungslosen Aktionen nacheinander in der Reihenfolge ihres Erscheinens aus. Wenn ein Robo-Skript bedingte Aktionen enthält, werden diese jedes Mal berücksichtigt, bevor eine nicht bedingte Aktion zur Ausführung ausgewählt wird. Wenn eine bedingte Aktion ausgelöst und basierend auf ihrer Priorität und der verbleibenden Anzahl an Ausführungen ausgewählt wird, führt das Robo-Skript diese bedingte Aktion aus. Andernfalls führt das Robo-Skript die folgende nicht bedingte Aktion aus. Um gültig zu sein, muss ein Robo-Skript mindestens eine nicht bedingte Aktion enthalten.

Das Folgende ist ein Beispiel für ein bedingungsloses Robo-Skript mit einer bedingten Aktion, die Popup-Dialoge schließt, wenn sie zu irgendeinem Zeitpunkt während der Ausführung des Robo-Skripts angezeigt werden:

{
  "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
    }
}

Ignorieren von Aktionen

Ein Robo-Skript kann Anweisungen für Robo enthalten, bestimmte UI-Widgets oder alle UI-Widgets auf einem bestimmten Bildschirm zu ignorieren. Diese Anweisungen werden als ignorierende „Aktionen“ mit den entsprechenden eventType ELEMENT_IGNORED und ALL_ELEMENTS_IGNORED dargestellt.

Immer wenn das contextDescriptor Attribut eines Robo-Skripts, das Ignorierungsaktionen enthält, mit einem bestimmten Bildschirm übereinstimmt, interagiert Robo nicht mit den UI-Widgets, auf die seine Ignorierungsaktionen abzielen (es sei denn, eine andere Robo-Skriptaktion veranlasst Robo, eine Aktion auf einem der ignorierten UI-Widgets auszuführen).

Ein Robo-Skript kann eine Mischung aus ignorierenden, bedingten und nicht bedingten Aktionen enthalten. Im Gegensatz zu anderen Robo-Skriptaktionen werden Ignorierungsaktionen angewendet, solange contextDescriptor des enthaltenen Robo-Skripts während eines Robo-Crawls mit einem Bildschirm übereinstimmt, unabhängig von den Werten der Attribute „ priority “ und maxNumberOfRuns “.

Im Folgenden sehen Sie ein Beispiel für eine Datei mit zwei Robo-Skripten. Das erste Robo-Skript veranlasst Robo, alle UI-Widgets auf einem Bildschirm zu ignorieren, der ein UI-Widget mit der Ressourcen-ID "my.app.package:id/ignored_screen" enthält. Das zweite Robo-Skript veranlasst Robo, UI-Widgets zu ignorieren, deren Ressourcen-IDs mit dem Java-Regex ".*:id/done" auf einem Bildschirm übereinstimmen, der ein UI-Widget mit der Ressourcen-ID "my.app.package:id/main_screen" enthält:

[
  {
    "id": 1000,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/ignored_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ALL_ELEMENTS_IGNORED"
      }
    ]
  },
  {
    "id": 1001,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/main_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ELEMENT_IGNORED",
        "elementDescriptors": [
          {
            "resourceIdRegex": ".*:id/done"
          }
        ]
      }
    ]
  }
]

RecyclerView- und AdapterView-Unterstützung

Untergeordnete Elemente der Widgets „RecyclerView“ und „AdapterView“ werden dynamisch geladen und möglicherweise viele Wischbewegungen vom aktuellen Bildschirm entfernt angezeigt. Da die Größe eines Bildschirms und die Anzahl der Wischbewegungen, die erforderlich sind, um zu diesem untergeordneten Element zu gelangen, je nach Geräteformfaktor unterschiedlich sind, ist es viel aussagekräftiger, sich auf die absolute Datenposition des untergeordneten Elements zu verlassen. Es ist ein weniger robuster Ansatz, sich auf die Anzahl der Wischbewegungen zu verlassen, die erforderlich sind, um dieses Kind zum Bildschirm zu bringen, und dann seine Bildschirmposition zu verwenden.

Daher erfasst das Robo-Skript die absoluten Datenpositionen der untergeordneten RecyclerView-Elemente, die Ziele von Robo-Skriptaktionen sind, als recyclerViewChildPosition . Das Robo-Skript erfasst auch die absoluten Datenpositionen von AdapterView-Kindern, die Ziele von Robo-Skriptaktionen sind, als adapterViewChildPosition .

Aktionen für die untergeordneten Elemente RecyclerView und AdapterView werden in den folgenden Schritten ausgeführt:

  1. Der Robo-Test stellt sicher, dass das entsprechende untergeordnete Element auf dem Bildschirm angezeigt wird, und zwar durch eine Positionierungsaktion auf der enthaltenen RecyclerView oder AdapterView.

  2. Der Robo-Test führt die aufgezeichnete Aktion direkt am untergeordneten Element aus, da diese bereits auf dem Bildschirm angezeigt wird.

Das Folgende ist ein Beispiel für eine Klickaktion auf einem AdapterView-Kind ( 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
    }
  ]
}

Das Folgende ist ein Beispiel für eine Klickaktion auf einem RecyclerView-Kind ( 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
    }
  ]
}

Zeichnen Sie ein Robo-Skript in Android Studio auf und führen Sie es im Testlabor aus

Sie können in Android Studio ein Robo-Skript erstellen, das das Skript als JSON-Datei speichert. Anschließend können Sie die JSON-Datei mit der Anwendung in Firebase Test Lab hochladen und den Test entsprechend ausführen.

Wenn Sie einen Robo-Test mit einem angehängten Skript ausführen, durchläuft der Robo-Test zunächst Ihre vorgefertigten Aktionen und erkundet dann die App wie gewohnt.

Um eine Robo-Skript-JSON-Datei in Android Studio zu erstellen, befolgen Sie die Schritte unter Aufzeichnen eines Robo-Skripts mit Test Lab in Android Studio .

Robo-Skript-Aktionen

Das folgende gemeinsame optionale Attribut gilt für alle Aktionen:

  • description – hilft, die Ausführung dieser Robo-Skriptaktion in Robo-Testausgaben zu verfolgen.

Behauptung

Wenn die geltend gemachte Bedingung wahr ist, fährt das Robo-Skript mit der nächsten Aktion fort, bei der es sich um eine weitere Behauptung handeln könnte. Andernfalls wird die Ausführung des Robo-Skripts aufgrund einer fehlgeschlagenen Behauptung angehalten.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "ASSERTION" --
contextDescriptor Beschreibt den behaupteten Kontext oder die behauptete Bedingung. Es hat die gleiche Struktur und bietet ähnliche Funktionen wie der contextDescriptor des Robo-Skripts .

Das Folgende ist ein Beispiel für eine Robo-Skript-Behauptung, die überprüft, ob die zu testende App im Vordergrund steht:

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

Das Folgende ist ein Beispiel für eine Robo-Skript-Behauptung, die überprüft, ob ein UI-Widget mit der Ressourcen-ID "com.google.samples.apps.topeka:id/done" auf einem Bildschirm vorhanden ist:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
}

Das Folgende ist ein Beispiel für eine Robo-Skript-Behauptung, die mithilfe von OCR prüft, ob "Settings" NICHT auf einem Bildschirm erkannt wird:

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

Klicken

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
eventType Gibt den Typ der Robo-Skript-Aktion an.
"eventType": "VIEW_CLICKED" Klickt auf das Zielelement der zu testenden App.
"eventType": "SOFT_KEYBOARD_CLICK" Klickt auf das Zielelement der Softtastatur.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Klickt bis zu maxNumberOfRuns -mal auf zufällige Elemente der Softtastatur.
"eventType": "LIST_ITEM_CLICKED" Wird vom Robo-Skriptrekorder in Android Studio zum Klicken auf Listenelemente verwendet.
elementDescriptors Identifiziert das angeklickte UI-Widget mithilfe der Android-UI-Hierarchie. Gegenseitig ausschließend mit visionText .
visionText Identifiziert das angeklickte Element mithilfe von OCR. Sich gegenseitig ausschließend mit elementDescriptors .
maxNumberOfRuns Gibt an, wie oft auf ein zufälliges Element der Softtastatur geklickt werden soll, wenn eventType den SOFT_KEYBOARD_RANDOM_CLICK hat. Der Standardwert ist 1 .

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die auf eine Schaltfläche mit der Ressourcen-ID "com.google.samples.apps.topeka:id/done" klickt:

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

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, bei der auf einem Bildschirm mithilfe von OCR auf "Privacy Policy" geklickt wird:

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

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die auf ein Softtastaturelement mit der Inhaltsbeschreibung "Emoji button" klickt:

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die bis zu fünf Mal auf zufällige Soft-Tastaturelemente klickt:

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

Deaktivieren Sie die Softtastatur

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "DISABLE_KEYBOARD" --

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die die Softtastatur deaktiviert:

{
  "eventType": "DISABLE_KEYBOARD"
}

Führen Sie den ADB-Shell-Befehl aus

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "ADB_SHELL_COMMAND" --
command Der auszuführende Android Debug Bridge (adb)-Shell-Befehl.

Das folgende Attribut ist optional:

  • expectedOutputRegex – die erwartete Ausgabe des Befehls als regulärer Java-Ausdruck. Wenn die Ausgabe nicht übereinstimmt, schlägt die Aktion des Robo-Skripts fehl. Standardmäßig handelt es sich um eine leere Zeichenfolge, was bedeutet, dass die Ausgabe nicht überprüft wird.

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die die Benutzerdaten der zu testenden App löscht:

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

Berechtigungen erteilen

Diese Aktion wird vom Robo-Skript-Recorder in Android Studio aufgezeichnet, um die Abwärtskompatibilität mit Espresso Test Recorder zu gewährleisten. Der Robo-Test gewährt der zu testenden App zu Beginn jedes Crawls alle Berechtigungen, daher ist diese Aktion ein No-Op. Verwenden Sie diese Aktion NICHT in Ihren Robo-Skripten.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "PERMISSIONS_REQUEST" --

Alle Elemente auf einem Bildschirm ignorieren

Durch diese Aktion ignoriert Robo alle Elemente auf jedem Bildschirm, der das enthaltende Robo-Skript auslöst.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "ALL_ELEMENTS_IGNORED" --

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die Robo dazu bringt, alle Elemente auf einem Bildschirm zu ignorieren:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Ein Element ignorieren

Diese Aktion veranlasst Robo, ein Element (oder Elemente) zu ignorieren, die mit den angegebenen elementDescriptors übereinstimmen.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Identifiziert die ignorierten UI-Widget(s) mithilfe der Android-UI-Hierarchie.

Das folgende Attribut ist optional:

  • ignoreChildren – wenn auf true gesetzt, ignoriert Robo auch alle Nachkommen der ignorierten UI-Widget(s). Standardmäßig ist es false .

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die Robo dazu bringt, alle Elemente zu ignorieren, deren Inhaltsbeschreibungen mit "Avatar" beginnen:

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

Eingabetext

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
eventType Gibt den Typ der Robo-Skript-Aktion an.
"eventType": "VIEW_TEXT_CHANGED" Gibt den angegebenen Text in das Ziel-UI-Widget ein.
"eventType": "ENTER_TEXT" gibt den angegebenen Text in das Ziel-UI-Widget ein und sendet dann ein KEYCODE_ENTER Ereignis an dieses UI-Widget.
elementDescriptors Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.
replacementText Der Text, der in das Ziel-UI-Widget eingegeben werden soll.

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die "John" in ein UI-Widget mit der Ressourcen-ID "com.google.samples.apps.topeka:id/first_name" eingibt:

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

Langer Klick

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie. Gegenseitig ausschließend mit visionText .
visionText Identifiziert das lange angeklickte Element mithilfe von OCR. Sich gegenseitig ausschließend mit elementDescriptors .

Das folgende Attribut ist optional:

  • delayTime – gibt an, wie lange das Drücken eines langen Klicks dauert (in Millisekunden).

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die einen fünf Sekunden langen Klick auf ein UI-Widget mit der Inhaltsbeschreibung "Avatar 8" ausführt:

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

Führen Sie eine Ein-Punkt-Geste aus

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "ONE_POINT_GESTURE" --
coordinates Zwei Koordinaten für eine Ein-Punkt-Geste, formatiert als „(x1,y1)->(x2,y2)“ als Prozentsätze oder Pixel.

Das folgende Attribut ist optional:

  • dragAndDrop – wenn auf true gesetzt, führt die Ein-Punkt-Geste eine Drag-and-Drop-Aktion aus. Standardmäßig ist es false .

Das Folgende ist ein Beispiel einer Robo-Skript-Einpunkt-Gestenaktion, die ein Wischen nach unten ausführt:

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

Führen Sie eine Zwei-Punkt-Geste aus

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "TWO_POINT_GESTURE" --
coordinates Vier Koordinaten für eine Zwei-Punkt-Geste, formatiert als „(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)“ als Prozentsätze oder Pixel.

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die eine Pinch-Out-Geste ausführt:

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

Führen Sie eine IME-Aktion aus

Diese Aktion drückt die aktuelle Aktionsschaltfläche, zum Beispiel „Weiter“, „Fertig“ und „Suchen“, im Eingabemethoden-Editor (IME) für das angegebene Ziel-UI-Widget.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die eine IME-Aktion für ein UI-Widget mit der Ressourcen-ID "com.google.samples.apps.topeka:id/first_name" ausführt:

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

Zurück drücken

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
eventType Gibt den Typ der Robo-Skript-Aktion an.
"eventType": "PRESSED_BACK" Sendet ein KEYCODE_BACK Ereignis an das Gerät.
"eventType": "PRESSED_BACK_EMULATOR_28" Wird vom Robo-Skript-Recorder in Android Studio zum Zurückdrücken auf die Emulator-API 28 verwendet.

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die „Zurück“ drückt:

{
  "eventType": "PRESSED_BACK"
}

Drücken Sie Home

Diese Aktion sendet ein KEYCODE_HOME Ereignis an das Gerät.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "GO_HOME" --

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die nach Hause drückt:

{
  "eventType": "GO_HOME"
}

Scrollen Sie durch ein Element, um es anzuzeigen

Diese Aktion bewirkt, dass der Robo-Test das UI-Widget vorwärts scrollt, das den angegebenen elementDescriptors entspricht, bis das UI-Widget, das den angegebenen childElementDescriptors entspricht, auf dem Bildschirm vorhanden ist oder das gescrollte Widget nicht mehr gescrollt werden kann oder die maximale Anzahl von 50 Scrolls erreicht ist.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identifiziert das gescrollte UI-Widget mithilfe der Android-UI-Hierarchie.
childElementDescriptors Identifiziert das UI-Widget, zu dem mithilfe der Android-UI-Hierarchie gescrollt werden soll.

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die das UI-Widget mit der Ressourcen-ID "my.app.package:id/scrollable_card_container" scrollt, bis das UI-Widget mit dem Text "Orange" auf dem Bildschirm angezeigt wird (oder kein Scrollen mehr möglich ist). ausgeführt werden oder die maximale Anzahl von 50 Schriftrollen erreicht ist):

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

Wischen

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "VIEW_SWIPED" --
swipeDirection Gibt die Richtung des Wischens an:
  • Left
  • Right
  • Up
  • Down
  • Forward – entweder Down oder Right , abhängig von der vertikalen oder horizontalen Scrollbarkeit des Ziel-UI-Widgets.
  • Backward – entweder Up oder Left , abhängig von der vertikalen oder horizontalen Scrollbarkeit des Ziel-UI-Widgets.
elementDescriptors Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die ein UI-Widget mit der Ressourcen-ID "my.app.package:id/custom_content" nach oben wischt:

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

Einen Screenshot machen

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "TAKE_SCREENSHOT" --
screenshotName Gibt den Namen der Screenshot-Datei an.

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die einen Screenshot erstellt:

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

Tippen Sie auf einen Punkt auf dem Bildschirm

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "POINT_TAP" --
pointTapXCoordinate Die Pixel-X-Koordinate des angetippten Punkts. Schließt sich gegenseitig mit pointTapXPercent und pointTapYPercent aus.
pointTapYCoordinate Die Pixel-Y-Koordinate des angetippten Punkts. Schließt sich gegenseitig mit pointTapXPercent und pointTapYPercent aus.
pointTapXPercent Die prozentuale X-Koordinate des angetippten Punkts. Schließt sich gegenseitig mit pointTapXCoordinate und pointTapYCoordinate aus.
pointTapYPercent Die prozentuale Y-Koordinate des angetippten Punkts. Schließt sich gegenseitig mit pointTapXCoordinate und pointTapYCoordinate aus.

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die in die Mitte eines Bildschirms tippt:

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

Tippen Sie auf einen Punkt innerhalb eines Elements

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent Die prozentuale X-Koordinate innerhalb des Zielelements.
pointTapYPercent Der Prozentsatz der Y-Koordinate innerhalb des Zielelements.
elementDescriptors Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die den Schieberegler einer Suchleiste nach rechts verschiebt:

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

Crawl beenden

Diese Aktion stoppt den Robo-Test.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "TERMINATE_CRAWL" --

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die einen Robo-Test stoppt:

{
  "eventType": "TERMINATE_CRAWL"
}

Warten

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime Gibt an, wie lange in Millisekunden gewartet werden soll.

Das Folgende ist ein Beispiel für eine Robo-Skript-Aktion, die drei Sekunden wartet:

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

Warten Sie auf ein Element

Durch diese Aktion wartet der Robo-Test bis zum angegebenen Timeout darauf, dass ein Element auf dem Bildschirm erscheint.

In der folgenden Tabelle sind die erforderlichen Attribute aufgeführt:

Attribut Beschreibung
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Gibt das Wartezeitlimit in Millisekunden an.
elementDescriptors Identifiziert das erwartete UI-Widget mithilfe der Android-UI-Hierarchie.

Das Folgende ist ein Beispiel für eine Robo-Skriptaktion, die bis zu 30 Sekunden darauf wartet, dass ein UI-Widget mit der Ressourcen-ID "my.app.package:id/confirmation_button" auf dem Bildschirm angezeigt wird:

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

Nächste Schritte