Robo-Script-Referenzhandbuch

Dieses Dokument enthält Referenzinformationen zu Robo-Scripts, einschließlich Struktur, Funktionen, Verwendung, Aufzeichnung und Aktionen. Robo-Scripts sind Tests, mit denen manuelle Qualitätssicherungsaufgaben für mobile Apps automatisiert werden können. Sie ermöglichen Strategien für die kontinuierliche Integration (Continuous Integration, CI) und Tests vor der Markteinführung. Ein Robo-Script ist eine JSON-Datei, in der eine Reihe von Aktionen auf der Benutzeroberfläche (UI) und anderen Aktionen beschrieben wird.

Sie haben folgende Möglichkeiten, ein Robo-Script zu erstellen:

  • Verwenden Sie die Funktion zum Aufzeichnen von Robo-Skripts. (Nur Android)

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

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

Weitere Informationen zur Verwendung von Robo-Skripts finden Sie unter Robo-Skript ausführen.

Einführung

Robo-Skript wird dem Robo-Test zusammen mit anderen Eingaben wie dem Android-Anwendungspaket (APK) der zu testenden App bereitgestellt.

Das folgende Beispiel zeigt ein Robo-Skript, mit dem ein Nutzer in einer App angemeldet wird. Es wird ausgelöst, 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 sich in einer Datei ein einzelnes Robo-Skript mit der Standardauslösebedingung app_under_test_shown befindet, wie im obigen Beispiel, können Sie das Robo-Skript in einer Datei in einem einfacheren Format angeben – einfach als Abfolge der 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"
      }
    ]
  }
]

Unterstützung von iOS+ für Robo-Skripts

Robo für iOS+ (Beta) bietet eingeschränkte Unterstützung für Robo-Scripts. Die Robo-Skript-Syntax für iOS+ ist mit der Android-Syntax identisch und unterstützte iOS+-Funktionen verhalten sich ähnlich wie ihre Android-Pendants.

Die folgenden Aktionen werden in iOS+ unterstützt:

  • Assertion
  • Klick
  • Langes Klicken
  • Wischen
  • Alle Elemente ignorieren
  • Warten
  • Screenshot erstellen
  • Crawling beenden

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

  • Klassenname
  • Name der übergeordneten Klasse
  • Inhaltsbeschreibung (und regulärer Ausdruck)
  • Text (und reguläre Ausdrücke)

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

  • Die zu testende App wird angezeigt
  • Element vorhanden
  • Nicht-Robo-Script-Aktion ausgeführt

Struktur

Ein Robo-Script hat mehrere Attribute, die beschreiben, wie Robo es ausführt. Die meisten dieser Attribute sind optional und haben vordefinierte Standardwerte:

Attribut Beschreibung
id Eine Ganzzahl, mit der dieses Robo-Skript in den Crawl-Ausgaben nachverfolgt werden kann. Robo hat integrierte Robo-Scripts mit eigenen ids. Obwohl sich die Verwendung derselben id in verschiedenen Robo-Scripts nicht auf ihr Verhalten auswirkt, kann es schwierig sein, Aktionen aus diesen Robo-Scripts in den Crawl-Ausgaben zu unterscheiden. Wir empfehlen, Ihren Robo-Scripts eine eindeutige id von 1000 oder höher zuzuweisen, um Konflikte zu vermeiden.
description Ähnlich wie id, aber ausführlicher.
crawlStage Die Phase eines Crawls, in der Robo dieses Robo-Skript anwendet. Standardmäßig ist dies die Hauptphase des Crawlings.
priority Die Priorität dieses Robo-Skripts im Vergleich zu anderen Robo-Skripts. Standardmäßig haben alle Robo-Skripts die Priorität 1.
maxNumberOfRuns Gibt an, wie oft Robo dieses Robo-Script während eines Crawls ausführen kann. Standardmäßig kann Robo ein Robo-Script einmal ausführen.
contextDescriptor Beschreibt den Kontext oder die Bedingung, die dieses Robo-Skript auslöst. Wird sie weggelassen, gilt die Auslösebedingung dieses Robo-Scripts als immer erfüllt. Das Robo-Script ist also bedingungslos.
actions Alle Aktionen dieses Robo-Scripts.

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

Im Folgenden finden Sie ein Beispiel für eine Datei mit zwei bedingungslosen Robo-Scripts, die jeweils eine einzelne Aktion enthalten, 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-Script auslöst. Dazu wird ein Attribut oder eine Kombination aus mehreren Attributen verwendet:

Attribut Beschreibung
"condition": "always" Löst immer ein Robo-Script aus.
"condition": "element_present" Prüft, ob auf dem Bildschirm ein UI-Widget vorhanden ist, das mit elementDescriptors oder dem von visionText angegebenen Text übereinstimmt.
"condition": "element_disabled" Prüft, ob ein UI-Widget, das elementDescriptors entspricht, auf dem Bildschirm vorhanden ist und nicht damit interagiert werden kann.
"condition": "element_checked" Prüft, ob ein UI-Widget, das mit elementDescriptors übereinstimmt, auf dem Bildschirm vorhanden und aktiviert ist.
"condition": "app_under_test_shown" Prüft, ob die zu testende App im Vordergrund ausgeführt wird.
"condition": "default_launcher_shown" Prüft, ob der Startbildschirm eines Geräts angezeigt wird. Das bedeutet, dass keine Apps im Vordergrund ausgeführt werden.
"condition": "non_roboscript_action_performed" Prüft, ob die letzten nonRoboscriptActionCount aufeinanderfolgenden Aktionen, die vom Robo-Test ausgeführt wurden, keine Robo-Script-Aktionen sind.
negateCondition Wenn true festgelegt ist, wird condition negiert. Mit diesem Attribut können Sie beispielsweise prüfen, ob ein UI-Widget NICHT auf dem Bildschirm 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. Sie wird in Kombination mit den Bedingungen element_present, element_disabled und element_checked verwendet. Schließt sich mit visionText gegenseitig aus. 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. Schließt sich mit elementDescriptors gegenseitig aus.
nonRoboscriptActionCount Die Anzahl der aufeinanderfolgenden Aktionen, die nicht von Robo-Script ausgeführt wurden. Sie wird in Kombination mit der Bedingung non_roboscript_action_performed verwendet, um ein Robo-Script nach jeder nonRoboscriptActionCount-Robo-Aktion auszulösen. Der Standardwert ist 1.

Das folgende Beispiel zeigt 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 Beispiel zeigt ein Robo-Skript, das durch "Privacy Policy" ausgelöst wird, das durch die optische Zeichenerkennung (Optical Character Recognition, OCR) erkannt wurde:

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

Das folgende Beispiel zeigt ein Robo-Script, das nach jeder Robo-Aktion, die nicht Teil des Scripts ist, 5 Sekunden wartet:

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

Aktionen

Jede Aktion in einem Robo-Script wird als Bundle mit 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. „Klick“ oder „Text bearbeiten“. Erforderlich für jede Aktion.
elementDescriptors Deskriptoren, die ein UI-Widget identifizieren. Erforderlich für alle Aktionen, die ein Ziel-UI-Widget haben, z. B. das Klicken auf eine bestimmte Schaltfläche.
optional Wenn diese Option auf true gesetzt ist, wird diese Aktion übersprungen, wenn sie nicht ausgeführt werden kann. Diese Aktion wird beispielsweise übersprungen, wenn das zugehörige UI-Widget auf einem Bildschirm nicht gefunden werden kann, ohne dass das enthaltende Robo-Script fehlschlägt. Der Standardwert ist false.
replacementText Der Text, der in das Ziel-UI-Widget eingegeben werden soll. Erforderlich für Textbearbeitungsaktionen.
swipeDirection Gibt die Richtung des Wischvorgangs an. Erforderlich für Wischaktionen.
delayTime Gibt an, wie lange in Millisekunden gewartet werden soll. Erforderlich für Warteaktionen.
pointTapXCoordinate und pointTapYCoordinate Die X- und Y‑Pixelkoordinaten des angetippten Punkts. Schließt sich gegenseitig mit pointTapXPercent und pointTapYPercent aus. Erforderlich für Point-Tap-Aktionen.
pointTapXPercent und pointTapYPercent Die prozentualen X- und Y‑Koordinaten des angetippten Punkts. Schließt sich mit pointTapXCoordinate und pointTapYCoordinate gegenseitig aus. Erforderlich für Point-Tap-Aktionen.

Im Folgenden finden Sie ein Beispiel für ein Robo-Script mit zwei Aktionen ohne Ziel-UI-Widgets. Das bedeutet, dass diese Aktionen nicht für ein bestimmtes UI-Widget ausgeführt werden:

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

Elementdeskriptoren

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

Attribut Beschreibung
className
ancestorClassName Der Klassenname des übergeordneten Elements in der UI-Hierarchie des Elements. Ein Ancestor ist ein beliebiger übergeordneter Knoten in der UI-Hierarchie des Elements, einschließlich des Elements selbst.
resourceId
resourceIdRegex Java-kompatibler regulärer Ausdruck für den Abgleich mit resourceId.
contentDescription
contentDescriptionRegex Java-kompatibler regulärer Ausdruck für den Abgleich mit contentDescription.
text (auf dem Bildschirm angezeigt)
textRegex Java-kompatibler regulärer Ausdruck für den Abgleich mit text.
groupViewChildPosition, recyclerViewChildPosition oder adapterViewChildPosition Stellt die Position eines untergeordneten UI-Widgets in Abhängigkeit vom Typ des übergeordneten Widgets dar.

Häufig sind diese Attribute nicht definiert. So kann es beispielsweise sein, dass eine Schaltfläche keinen Text und keine Inhaltsbeschreibung hat. Auch wenn einige Attributwerte vorhanden sind, sind sie auf einem bestimmten App-Bildschirm (einschließlich resourceId) möglicherweise nicht eindeutig.

Beispielsweise ist es häufig nur möglich, zwischen Elementen einer Liste zu unterscheiden, indem ihre unterschiedlichen untergeordneten Positionen innerhalb des übergeordneten Widgets verwendet werden. Das bedeutet, dass es in der Regel nicht ausreicht, ein UI-Widget nur mit einem Elementdeskriptor zu identifizieren. Das elementDescriptors-Attribut einer Aktion enthält daher eine Sequenz von Elementdeskriptoren, die so angeordnet sind, dass der erste dem Ziel-UI-Widget, der zweite dem übergeordneten Widget des Ziel-UI-Widgets usw. entspricht. Das Ziel-UI-Widget einer Aktion wird abgeglichen, wenn alle zugehörigen Elementdeskriptoren mit der entsprechenden UI-Widget-Unterhierarchie übereinstimmen.

Das folgende Beispiel zeigt ein Robo-Script mit Textänderungs- und Klickaktionen. Für beide müssen Sie das Ziel-UI-Widget anhand 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ührungsoptionen

Sie können die Liste der Aktionen in einem Robo-Script optional mit einem JSON-Objekt versehen, in dem die Ausführungsoptionen für dieses Robo-Script angegeben werden. Dieser Konfigurationsheader beginnt mit dem Keyword roboscript, gefolgt von einer JSON-Darstellung der gewünschten Ausführungsoptionen.

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

  • executionMode: Ausführungsoptionen, die beim Ausführen eines Robo-Scripts angewendet werden:
    • strict: Wenn auf true festgelegt, werden im Robo-Script keine Teilübereinstimmungen verwendet, die aktuelle Aktion wird übersprungen und die Ausführung wird nicht unterbrochen. Das Robo-Script wird also als regulärer Instrumentierungstest ausgeführt und schlägt fehl, sobald eine der Aktionen nicht ausgeführt werden kann. Der Standardwert ist false.
    • dismiss_popups: Wenn dieser Wert auf true festgelegt ist, schließt der Robo-Test alle unerwarteten Dialogfelder, während das Robo-Script ausgeführt wird, auch im strict-Modus. Diese Option hat keine Auswirkungen, wenn sich das Gerät nicht im strict-Modus befindet. Der Standardwert ist false.
    • notify: Wenn auf false gesetzt, werden am Anfang und Ende der Ausführung des Robo-Scripts keine Benachrichtigungen auf dem Bildschirm angezeigt. Standardmäßig ist true festgelegt.
  • postscript – Ausführungsoptionen, die nach Abschluss eines Robo-Scripts angewendet werden:
    • terminate: Wenn diese Option auf true festgelegt ist, wird der Robo-Test beendet, sobald das Roboscript abgeschlossen ist. Der Standardwert ist false.

Im Folgenden sehen Sie ein Beispiel für ein Robo-Script, das im strict-Modus ohne Benachrichtigungen auf dem Bildschirm ausgeführt wird. Es wartet drei Sekunden, bevor der Crawl beendet wird:

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

Vorlagenparameter

Ein Vorlagenparameter ist ein Platzhalter in einem Robo-Script, der durch den tatsächlichen Wert ersetzt wird, wenn der Robo-Test das Robo-Script zur Ausführung lädt. Vorlagenparameter haben das Präfix „__%“ und das Suffix „%__“.

Robo-Skripts unterstützen den folgenden Vorlagenparameter:

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

Im Folgenden finden Sie ein Beispiel für ein Robo-Script, mit dem der Prozess der zu testenden App beendet wird:

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

Kommentare

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

Hier sehen Sie ein Beispiel für ein Robo-Script mit einigen Kommentaren:

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

Leistungsspektrum

Standardmäßig bleibt ein Robo-Script aktiv, bis alle Aktionen ausgeführt (oder zumindest versucht) wurden. Beim Auswählen einer auszuführenden Aktion versucht der Robo-Test immer, eine Aktion aus einem Robo-Script zu finden, die dazu passt. Im Robo-Skript werden die folgenden Techniken verwendet, um die Stabilität 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 wiederholt. Beim teilweisen Abgleich wird der äußerste Elementdeskriptor nicht berücksichtigt, wenn das Ziel-UI-Widget einer Robo-Skriptaktion abgeglichen wird.

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

Aktuelle Aktion überspringen Wenn die aktuelle Robo-Script-Aktion nicht vollständig oder teilweise abgeglichen werden kann, versucht Robo, die nachfolgende Robo-Script-Aktion abzugleichen. Wenn die nachfolgende Aktion vollständig oder teilweise übereinstimmt, wird die aktuelle Robo-Script-Aktion übersprungen (und es wird nie zu ihr zurückgekehrt) und die nachfolgende Aktion wird ausgeführt.

Diese Technik unterstützt Szenarien, in denen sich das App-Verhalten zwischen Versionen ändert oder unzuverlässig ist, z. B. wenn während der Aufzeichnung und Wiedergabe eines Robo-Scripts ein zeitweiliger Dialog auf verschiedenen Bildschirmen angezeigt wird.

Anhalten Wenn weder aktuelle noch nachfolgende Robo-Script-Aktionen vollständig oder teilweise abgeglichen werden können, wird das Robo-Script vorübergehend angehalten und der Robo-Test wählt eine Aktion aus, die mit seinen anderen Strategien ausgeführt werden soll. Nach Abschluss dieser Aktion wird das Robo-Script vom Robo-Test weiter ausgeführt.

Solange aktuelle oder nachfolgende Robo-Script-Aktionen nicht abgeglichen werden können, bleibt das Robo-Script für eine beliebige Anzahl von Aktionen angehalten. Robo-Skripts müssen also nicht unbedingt ein Prolog für einen Robo-Test sein. Sie können Robo-Skript-Aktionen auch mit Standard-Robo-Test-Aktionen mischen. Diese Technik unterstützt Szenarien, in denen das App-Verhalten unzuverlässig ist oder die Änderungen zwischen App-Versionen so groß sind, dass Robo-Tests die Lücken mit ihren Standardaktionen schließen müssen.

Prioritäten

Wenn ein Robo-Script das maxNumberOfRuns erreicht, kann es bei einem bestimmten Crawl nicht mehr ausgelöst werden. Wenn durch den aktuellen Kontext mehrere Robo-Scripts ausgelöst werden können, wird das Robo-Script mit der höchsten Priorität ausgewählt. Die Priorität wird in der folgenden Reihenfolge festgelegt:

  1. Hat ein contextDescriptor-Attribut.
  2. Hat die höchste priority (standardmäßig haben alle Robo-Skripts dieselbe Ausführungs-priority von 1).
  3. Wird in der Liste der Robo-Skripts am Anfang angezeigt, wenn die Prioritäten der Robo-Skripts gleich sind.

Im Folgenden finden Sie ein Beispiel für eine Datei mit drei Robo-Scripts, 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": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1001,
    "description": "Robo script 2",
    "priority": "2",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1002,
    "description": "Robo script 3",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  }
]

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

  1. "Robo script 2", da sie die höchste Priorität hat.
  2. "Robo script 1", da sie unter den verbleibenden anwendbaren Robo-Scripts mit derselben Priorität früher aufgeführt wird.
  3. "Robo script 3" als letztes anwendbares Robo-Script.

Wiederholte Ausführungen

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

Das folgende Beispiel zeigt ein Robo-Skript, mit dem die zu testende App bis zu zehnmal in den Hintergrund verschoben wird:

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

Crawling-Phase

Robo-Skripts können in verschiedenen Phasen eines Robo-Crawls angewendet werden:

Crawling-Phase Beschreibung
pre_crawl Bevor Robo gestartet wird und mit dem Crawlen der zu testenden App beginnt.
post_crawl Nachdem Robo die zu testende App gecrawlt hat. Ein post_crawl-Robo-Script darf nicht länger als 15 Sekunden dauern, da der Crawl sonst aufgrund eines Zeitlimits beendet werden kann.
crawl Die Haupt-Crawling-Phase, in der Robo die zu testende App crawlt.
close_screen Wenn Robo versucht, von einem bestimmten Bildschirm zurückzukehren (Backtracking), werden alle möglichen Aktionen auf diesem Bildschirm ausgeführt. Standardmäßig drückt Robo auf die Zurück-Taste, was in einigen Szenarien unerwünscht ist.

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

Im Folgenden sehen Sie ein Beispiel für ein Robo-Script, das die Nutzerdaten 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 Beispiel zeigt ein Robo-Script, das Robo anweist, auf "Cancel" zu klicken, wenn es versucht, von einem Bestätigungsdialogfeld zurückzukehren:

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

Mit Bedingungen verknüpfte Aktionen

Ein Robo-Script kann bedingte Aktionen enthalten. Bedingte Aktionen haben 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 im zugehörigen Robo-Script. Standardmäßig haben alle bedingten Aktionen die Priorität 1.
maxNumberOfRuns Gibt an, wie oft diese bedingte Aktion während einer Ausführung des zugehörigen Robo-Scripts ausgeführt werden kann. Standardmäßig können alle bedingten Aktionen in einer einzelnen Ausführung des zugehörigen Robo-Scripts höchstens einmal ausgeführt werden.
contextDescriptor Der Kontext/die Bedingung, die diese bedingte Aktion auslöst. Sie hat dieselbe Struktur und bietet ähnliche Funktionen wie der contextDescriptor des Robo-Scripts.

Wenn ein Robo-Script ausgelöst wird, werden die nicht bedingten Aktionen nacheinander in der Reihenfolge ihrer Darstellung ausgeführt. Wenn ein Robo-Script bedingte Aktionen enthält, werden diese jedes Mal berücksichtigt, bevor eine nicht bedingte Aktion ausgewählt wird. Wenn eine bedingte Aktion ausgelöst und basierend auf ihrer Priorität und der verbleibenden Anzahl von Ausführungen ausgewählt wird, führt das Robo-Script diese bedingte Aktion aus. Andernfalls führt das Robo-Script die folgende nicht bedingte Aktion aus. Damit ein Robo-Script gültig ist, muss es mindestens eine nicht bedingte Aktion enthalten.

Im Folgenden finden Sie ein Beispiel für ein bedingungsloses Robo-Script mit einer bedingten Aktion, mit der Pop-up-Dialogfelder geschlossen werden, wenn sie während der Ausführung des Robo-Scripts 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": "WAIT",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "delayTime": 10000
    }
}

Aktionen ignorieren

Ein Robo-Script kann Anweisungen enthalten, mit denen Robo angewiesen wird, bestimmte UI-Widgets oder alle UI-Widgets auf einem bestimmten Bildschirm zu ignorieren. In dieser Anleitung wird davon ausgegangen, dass „Aktionen“ mit eventType ELEMENT_IGNORED und ALL_ELEMENTS_IGNORED ignoriert werden.

Wenn das contextDescriptor-Attribut eines Robo-Scripts, das „ignore“-Aktionen enthält, mit einem bestimmten Bildschirm übereinstimmt, interagiert Robo nicht mit UI-Widgets, die von den „ignore“-Aktionen betroffen sind, es sei denn, eine andere Robo-Script-Aktion veranlasst Robo, eine Aktion für eines 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-Script-Aktionen werden „Ignore“-Aktionen angewendet, solange der contextDescriptor-Wert des zugehörigen Robo-Scripts mit einem Bildschirm während eines Robo-Crawls übereinstimmt, unabhängig von den Werten der Attribute priority und maxNumberOfRuns.

Im Folgenden finden Sie ein Beispiel für eine Datei mit zwei Robo-Scripts. Im ersten Roboscript werden alle UI-Widgets auf einem Bildschirm ignoriert, der ein UI-Widget mit der Ressourcen-ID "my.app.package:id/ignored_screen" enthält. Im zweiten Robo-Script werden UI-Widgets ignoriert, deren Ressourcen-IDs mit dem Java-regulären Ausdruck ".*: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"
          }
        ]
      }
    ]
  }
]

Unterstützung für RecyclerView und AdapterView

Untergeordnete Elemente von RecyclerView- und AdapterView-Widgets werden dynamisch geladen und sind möglicherweise erst nach vielen Wischvorgängen auf dem aktuellen Bildschirm zu sehen. Da die Größe eines Bildschirms und die Anzahl der Wischvorgänge, die erforderlich sind, um zu diesem untergeordneten Element zu gelangen, für verschiedene Geräteformfaktoren unterschiedlich sind, ist es viel zuverlässiger, sich auf die Datenposition des untergeordneten Elements zu verlassen, die absolut ist. Es ist weniger zuverlässig, sich auf die Anzahl der Wischvorgänge zu verlassen, die erforderlich sind, um das untergeordnete Element auf den Bildschirm zu bringen, und dann seine Bildschirmposition zu verwenden.

Daher werden im Robo-Script die absoluten Datenpositionen von RecyclerView-Untergeordneten Elementen, die Ziele von Robo-Script-Aktionen sind, als recyclerViewChildPosition erfasst. Im Robo-Script werden auch die absoluten Datenpositionen von AdapterView-Untergeordneten Elementen erfasst, die Ziele von Robo-Script-Aktionen sind, als adapterViewChildPosition.

Aktionen für RecyclerView- und AdapterView-Untergeordnete werden in den folgenden Schritten ausgeführt:

  1. Beim Robo-Test wird dafür gesorgt, dass das entsprechende untergeordnete Element auf dem Bildschirm angezeigt wird. Dazu wird eine Positionierungsaktion für die enthaltende RecyclerView oder AdapterView ausgeführt.

  2. Beim Robo-Test wird die aufgezeichnete Aktion direkt für das untergeordnete Element ausgeführt, da es bereits auf dem Bildschirm angezeigt wird.

Das folgende Beispiel zeigt eine Klickaktion für ein untergeordnetes Element von 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
    }
  ]
}

Das folgende Beispiel zeigt eine Klickaktion auf ein untergeordnetes Element von 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
    }
  ]
}

Robo-Skript in Android Studio aufzeichnen und in Test Lab ausführen

Sie können ein Robo-Script in Android Studio erstellen. Das Script wird dann als JSON-Datei gespeichert. 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 Script durchführen, folgt der Robo-Test zuerst den vordefinierten Aktionen und prüft dann die App wie gewohnt.

Wenn Sie eine Robo-Skript-JSON-Datei in Android Studio erstellen möchten, folgen Sie der Anleitung unter Robo-Skript mit Test Lab in Android Studio aufzeichnen.

Robo-Script-Aktionen

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

  • description: Hilft, die Ausführung dieser Robo-Script-Aktion in den Robo-Testergebnissen zu verfolgen.

Assertion

Wenn die bestätigte Bedingung zutrifft, wird das Robo-Script mit der nächsten Aktion fortgesetzt, die eine weitere Assertion sein kann. Andernfalls wird die Ausführung des Robo-Scripts aufgrund einer fehlgeschlagenen Assertion angehalten.

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

Attribut Beschreibung
"eventType": "ASSERTION" --
contextDescriptor Beschreibt den geltend gemachten Kontext oder die geltend gemachte Bedingung. Sie hat dieselbe Struktur und bietet ähnliche Funktionen wie der contextDescriptor des Robo-Scripts.

Das folgende Beispiel zeigt eine Robo-Script-Assertion, mit der geprüft wird, ob die zu testende App im Vordergrund ist:

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

Das folgende Beispiel zeigt eine Robo-Skript-Assertion, mit der geprüft wird, 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-Assertion, die prüft, ob "Settings" auf einem Bildschirm mithilfe von OCR NICHT erkannt wird:

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

Klick

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

Attribut Beschreibung
eventType Gibt den Typ der Robo-Script-Aktion an.
"eventType": "VIEW_CLICKED" Klickt auf das Zielelement der zu testenden App.
"eventType": "SOFT_KEYBOARD_CLICK" Klickt auf das Zielelement der Softwaretastatur.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Klickt bis zu maxNumberOfRuns-mal auf zufällige Elemente der Softwaretastatur.
"eventType": "LIST_ITEM_CLICKED" Wird vom Robo-Skript-Recorder in Android Studio zum Klicken auf Listenelemente verwendet.
elementDescriptors Identifiziert das angeklickte UI-Widget anhand der Android-UI-Hierarchie. Schließt sich mit visionText gegenseitig aus.
visionText Identifiziert das angeklickte Element mithilfe von OCR. Schließt sich mit elementDescriptors gegenseitig aus.
matchIndex Gibt den Index des Vorkommens des übereinstimmenden Zielelements an, wenn das Zielelement mit visionText identifiziert wird. Wenn es 0 ist, wird das erste übereinstimmende Element ausgewählt. Wenn es 1 ist, wird das zweite übereinstimmende Element ausgewählt usw. Die Reihenfolge wird von links nach rechts und von oben nach unten bestimmt. Der Standardwert ist 0 (die erste Übereinstimmung wird ausgewählt).
maxNumberOfRuns Gibt an, wie oft auf ein zufälliges Element der Bildschirmtastatur geklickt werden soll, wenn eventType gleich SOFT_KEYBOARD_RANDOM_CLICK ist. Der Standardwert ist 1.

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

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

Im Folgenden finden Sie ein Beispiel für eine Robo-Script-Aktion, mit der auf das zweite Vorkommen des Wortes "Search" geklickt wird, das auf einem Bildschirm mithilfe von OCR erkannt wurde:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Search",
  "matchIndex": 1
}

Das folgende Beispiel zeigt eine Robo-Skriptaktion, mit der auf ein Softkeyboard-Element mit der Inhaltsbeschreibung "Emoji button" geklickt wird:

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

Das folgende Beispiel zeigt eine Robo-Skriptaktion, bei der bis zu fünfmal auf zufällige Elemente der Bildschirmtastatur geklickt wird:

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

Softwaretastatur deaktivieren

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

Attribut Beschreibung
"eventType": "DISABLE_KEYBOARD" --

Das folgende Beispiel zeigt eine Robo-Skript-Aktion, mit der die Bildschirmtastatur deaktiviert wird:

{
  "eventType": "DISABLE_KEYBOARD"
}

adb-Shell-Befehl ausführen

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

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

Das folgende Attribut ist optional:

  • expectedOutputRegex: Die erwartete Ausgabe des Befehls als regulärer Java-Ausdruck. Wenn die Ausgabe nicht übereinstimmt, schlägt die Robo-Script-Aktion fehl. Standardmäßig ist es ein leerer String, was bedeutet, dass die Ausgabe nicht geprüft wird.

Das folgende Beispiel zeigt eine Robo-Skriptaktion, mit der die Nutzerdaten der zu testenden App gelöscht werden:

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

Berechtigungen erteilen

Diese Aktion wird vom Robo-Skript-Recorder in Android Studio zur Abwärtskompatibilität mit Espresso Test Recorder aufgezeichnet. Beim Robo-Test werden der zu testenden App zu Beginn jedes Crawls alle Berechtigungen erteilt. Diese Aktion ist also 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-Script auslöst.

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

Attribut Beschreibung
"eventType": "ALL_ELEMENTS_IGNORED" --

Das folgende Beispiel zeigt eine Robo-Script-Aktion, mit der Robo alle Elemente auf einem Bildschirm ignoriert:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Element ignorieren

Mit dieser Aktion wird Robo angewiesen, ein oder mehrere Elemente zu ignorieren, die mit dem angegebenen elementDescriptors übereinstimmen.

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

Attribut Beschreibung
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Gibt die ignorierten UI-Widgets anhand der Android-UI-Hierarchie an.

Das folgende Attribut ist optional:

  • ignoreChildren: Wenn auf true gesetzt, ignoriert Robo auch alle untergeordneten Elemente der ignorierten UI-Widgets. Der Standardwert ist false.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, mit der Robo alle Elemente ignoriert, deren Inhaltsbeschreibung mit "Avatar" beginnt:

{
  "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-Script-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 Gibt das Ziel-UI-Widget anhand der Android-UI-Hierarchie an.
replacementText Der Text, der in das Ziel-UI-Widget eingegeben werden soll.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, mit der "John" in ein UI-Widget mit der Ressourcen-ID "com.google.samples.apps.topeka:id/first_name" eingegeben wird:

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

Langes Klicken

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

Attribut Beschreibung
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Gibt das Ziel-UI-Widget anhand der Android-UI-Hierarchie an. Schließt sich mit visionText gegenseitig aus.
visionText Identifiziert das lange angeklickte Element mithilfe von OCR. Schließt sich mit elementDescriptors gegenseitig aus.
matchIndex Gibt den Index des Vorkommens des übereinstimmenden Zielelements an, wenn das Zielelement mit visionText identifiziert wird. Wenn es 0 ist, wird das erste übereinstimmende Element ausgewählt. Wenn es 1 ist, wird das zweite übereinstimmende Element ausgewählt usw. Die Reihenfolge wird von links nach rechts und von oben nach unten bestimmt. Der Standardwert ist 0 (die erste Übereinstimmung wird ausgewählt).

Das folgende Attribut ist optional:

  • delayTime: Gibt an, wie lange das Herunterdrücken bei einem langen Klick in Millisekunden dauert.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, mit der fünf Sekunden lang auf ein UI-Widget mit der Inhaltsbeschreibung "Avatar 8" geklickt wird:

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

Geste mit einem Finger ausführen

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

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

Das folgende Attribut ist optional:

  • dragAndDrop: Wenn diese Option auf true festgelegt ist, wird mit der Ein-Finger-Geste eine Drag-and-drop-Aktion ausgeführt. Der Standardwert ist false.

Das folgende Beispiel zeigt eine Robo-Script-Geste mit einem Berührungspunkt, mit der ein Wischen nach unten ausgeführt wird:

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

Zwei-Finger-Geste ausführen

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

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

Im Folgenden finden Sie ein Beispiel für eine Robo-Skriptaktion, mit der eine Pinch-out-Geste ausgeführt wird:

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

IME-Aktion ausführen

Mit dieser Aktion wird die aktuelle Aktionsschaltfläche, z. B. „Weiter“, „Fertig“ und „Suchen“, im IME (Input Method Editor) für das angegebene Ziel-UI-Widget gedrückt.

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

Attribut Beschreibung
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Gibt das Ziel-UI-Widget anhand der Android-UI-Hierarchie an.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, 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

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

Attribut Beschreibung
eventType Gibt den Typ der Robo-Script-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 verwendet, um auf Emulatoren mit API 28 die Zurück-Taste zu drücken.

Das folgende Beispiel zeigt eine Robo-Skriptaktion, mit der die Zurück-Taste gedrückt wird:

{
  "eventType": "PRESSED_BACK"
}

Drücke die Home-Taste.

Durch diese Aktion wird ein KEYCODE_HOME-Ereignis an das Gerät gesendet.

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

Attribut Beschreibung
"eventType": "GO_HOME" --

Das folgende Beispiel zeigt eine Robo-Skriptaktion, mit der die Home-Schaltfläche gedrückt wird:

{
  "eventType": "GO_HOME"
}

Ein Element in die Ansicht scrollen

Bei dieser Aktion wird das UI-Widget, das dem angegebenen elementDescriptors entspricht, so lange gescrollt, bis das UI-Widget, das dem angegebenen childElementDescriptors entspricht, auf dem Bildschirm angezeigt wird, 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 Gibt das gescrollte UI-Widget anhand der Android-UI-Hierarchie an.
childElementDescriptors Gibt das UI-Widget an, zu dem gescrollt werden soll, indem die Android-UI-Hierarchie verwendet wird.

Im Folgenden sehen Sie ein Beispiel für eine Robo-Script-Aktion, mit der das UI-Widget mit der Ressourcen-ID "my.app.package:id/scrollable_card_container" gescrollt wird, bis das UI-Widget mit dem Text "Orange" auf dem Bildschirm angezeigt wird (oder keine weiteren Scrolls mehr ausgeführt werden können oder die maximale Anzahl von 50 Scrolls 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 – je nach vertikaler oder horizontaler Scrollbarkeit des Ziel-UI-Widgets entweder Down oder Right.
  • Backward – entweder Up oder Left, je nachdem, ob das Ziel-UI-Widget vertikal oder horizontal gescrollt werden kann.
elementDescriptors Gibt das Ziel-UI-Widget anhand der Android-UI-Hierarchie an.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, mit der ein UI-Widget mit der Ressourcen-ID "my.app.package:id/custom_content" nach oben gewischt wird:

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

Screenshot erstellen

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

Attribut Beschreibung
"eventType": "TAKE_SCREENSHOT" --
screenshotName Gibt den Dateinamen des Screenshots an.

Das folgende Beispiel zeigt eine Robo-Skriptaktion, mit der ein Screenshot aufgenommen wird:

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

Auf einen Punkt auf dem Display tippen

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 Y-Koordinate des angetippten Punkts in Pixeln. Schließt sich gegenseitig mit pointTapXPercent und pointTapYPercent aus.
pointTapXPercent Die X-Koordinate des angetippten Punkts als Prozentsatz. Schließt sich gegenseitig mit pointTapXCoordinate und pointTapYCoordinate aus.
pointTapYPercent Die Y-Koordinate des angetippten Punkts als Prozentsatz. Schließt sich gegenseitig mit pointTapXCoordinate und pointTapYCoordinate aus.

Das folgende Beispiel zeigt eine Robo-Skriptaktion, mit der in die Mitte eines Bildschirms getippt wird:

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

Auf einen Punkt in einem Element tippen

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 Die prozentuale Y-Koordinate innerhalb des Zielelements.
elementDescriptors Gibt das Ziel-UI-Widget anhand der Android-UI-Hierarchie an.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, mit der der Schieberegler einer Seekbar nach rechts verschoben wird:

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

Crawling beenden

Durch diese Aktion wird der Robo-Test beendet.

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

Attribut Beschreibung
"eventType": "TERMINATE_CRAWL" --

Das folgende Beispiel zeigt eine Robo-Script-Aktion, mit der ein Robo-Test beendet wird:

{
  "eventType": "TERMINATE_CRAWL"
}

Warten

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

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

Das folgende Beispiel zeigt eine Robo-Skriptaktion, die drei Sekunden lang wartet:

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

Auf ein Element warten

Bei dieser Aktion wartet der Robo-Test bis zum angegebenen Zeitlimit darauf, dass ein Element auf dem Bildschirm angezeigt wird.

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

Attribut Beschreibung
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Gibt das Wartezeitlimit in Millisekunden an.
elementDescriptors Gibt das UI-Widget an, auf das gewartet wird, indem die Android-UI-Hierarchie verwendet wird.

Das folgende Beispiel zeigt eine Robo-Skriptaktion, die bis zu 30 Sekunden lang 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