Robo-Script-Referenzhandbuch

Dieses Dokument enthält Referenzinformationen zu Robo-Skripts, einschließlich Struktur, Funktionen, Verwendung, Aufzeichnung und Aktionen. Robo-Scripts sind Tests, mit denen manuelle Qualitätssicherungsaufgaben für mobile Apps automatisiert werden. Sie ermöglichen Continuous Integration (CI) und Pre-Launch-Teststrategien. Ein Robo-Script ist eine JSON-Datei, die eine Abfolge von Benutzeroberflächen- und anderen Aktionen beschreibt.

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

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

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

  • Zeichnen 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

Das Robo-Script wird dem Robo-Test zusammen mit anderen Eingaben wie dem Android Application Package (APK) der zu testenden App zur Verfügung gestellt.

Das folgende Beispiel zeigt ein Robo-Script, 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 eine Datei ein einzelnes Robo-Script mit der Standard-Auslösebedingung app_under_test_shown enthält, wie im obigen Beispiel, können Sie das Robo-Script in einer Datei mit einem einfacheren Format angeben – einfach als Abfolge 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-Scripts

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

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 Ancestor-Klasse
  • Inhaltsbeschreibung (und Regex)
  • Text (und Regex)

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

  • 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-Script in Crawling-Ausgaben verfolgt werden kann. Robo hat integrierte Robo-Scripts mit eigenen ids. Obwohl dieselbe id in verschiedenen Robo-Scripts ihr Verhalten nicht beeinflusst, kann es schwierig sein, Aktionen aus diesen Robo-Scripts in Crawling-Ausgaben zu unterscheiden. Wir empfehlen, für Ihre Robo-Scripts eine eindeutige id von 1000 oder höher zuzuweisen, um Konflikte zu vermeiden.
description Ähnlich wie id, aber beschreibender.
crawlStage Die Phase eines Crawls, in der Robo dieses Robo-Script anwendet. Standardmäßig ist dies die Haupt-Crawling-Phase.
priority Die Priorität dieses Robo-Scripts im Vergleich zu anderen Robo-Scripts. Standardmäßig haben alle Robo-Scripts 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-Script auslöst. Wenn Sie diese Angabe weglassen, wird davon ausgegangen, dass die Auslösebedingung dieses Robo-Scripts immer erfüllt ist. 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.

Das folgende Beispiel zeigt 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, anhand eines oder einer Kombination mehrerer Attribute:

Attribut Beschreibung
"condition": "always" Löst immer ein Robo-Script aus.
"condition": "element_present" Prüft, ob ein UI-Widget, das mit elementDescriptors oder dem durch visionText angegebenen Text übereinstimmt, auf dem Bildschirm vorhanden ist.
"condition": "element_disabled" Prüft, ob ein UI-Widget, das mit elementDescriptors übereinstimmt, auf dem Bildschirm vorhanden ist und nicht mit ihm interagiert werden kann.
"condition": "element_checked" Prüft, ob ein UI-Widget, das mit elementDescriptors übereinstimmt, auf dem Bildschirm vorhanden und ausgewählt 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, d. h., 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 auf true gesetzt, wird condition negiert. Mit diesem Attribut können Sie beispielsweise prüfen, ob ein UI-Widget NICHT auf dem Bildschirm angezeigt wird 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 gegenseitig mit elementDescriptors aus.
nonRoboscriptActionCount Die Anzahl der aufeinanderfolgenden Aktionen, die zuvor nicht vom Robo-Script ausgeführt wurden. Sie wird in Kombination mit der Bedingung non_roboscript_action_performed verwendet, um nach jeweils nonRoboscriptActionCount Robo-Aktionen ein Robo-Script auszulösen. Der Standardwert ist 1.

Das folgende Beispiel zeigt ein Robo-Script, 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-Script, das durch "Privacy Policy" ausgelöst wird, das per optischer 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 im Script enthalten 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 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. Klick, Textbearbeitung usw. 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 einen bestimmten Button.
optional Wenn der Wert auf true gesetzt ist, 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 wird, 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 der Wischbewegung 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 Tippaktionen auf Punkte.
pointTapXPercent und pointTapYPercent Die X- und Y-Koordinaten des angetippten Punkts in Prozent. Schließt sich mit pointTapXCoordinate und pointTapYCoordinate gegenseitig aus. Erforderlich für Tippaktionen auf Punkte.

Das folgende Beispiel zeigt 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 Identifikationsattribute:

Attribut Beschreibung
className –
ancestorClassName Klassenname des übergeordneten Elements in der UI-Hierarchie. Ein Ancestor ist ein beliebiger übergeordneter 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 für den Abgleich mit contentDescription.
text (wird auf dem Display angezeigt) –
textRegex Regulärer Java-Ausdruck für den Abgleich mit text.
groupViewChildPosition, recyclerViewChildPosition oder adapterViewChildPosition Stellt die Position eines untergeordneten UI-Widgets dar, abhängig von der Art des übergeordneten Widgets.

Häufig sind diese Attribute nicht definiert. Beispielsweise kann es sein, dass eine Schaltfläche keinen Text und keine Inhaltsbeschreibung hat. Selbst 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 ein einzelner Elementdeskriptor in der Regel nicht ausreicht, um ein UI-Widget zu identifizieren. Daher enthält das Attribut elementDescriptors einer Aktion eine Sequenz von Elementdeskriptoren, die so sortiert 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 Elementdeskriptoren mit der entsprechenden Unterhierarchie des UI-Widgets übereinstimmen.

Das folgende Beispiel zeigt ein Robo-Script mit einer Textänderung und Klickaktionen, bei denen Sie das Ziel-UI-Widget mithilfe der bereitgestellten Elementdeskriptoren identifizieren müssen:

[
  {
    "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 der Liste der Aktionen in einem Robo-Script optional ein JSON-Objekt voranstellen, das die Ausführungsoptionen für dieses Robo-Script angibt. Dieser Konfigurationsheader beginnt mit dem Schlüsselwort roboscript, gefolgt von einer JSON-Darstellung der gewünschten Ausführungsoptionen.

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

  • executionMode: Ausführungsoptionen, die beim Ausführen eines Robo-Scripts angewendet werden:
    • strict: Wenn dieser Wert auf true gesetzt ist, werden im Robo-Script keine teilweisen Übereinstimmungen, Überspringen der aktuellen Aktion und Aussetzung verwendet. Das bedeutet, dass das Robo-Script als regulärer Instrumentierungstest ausgeführt wird und fehlschlägt, sobald eine seiner Aktionen nicht ausgeführt werden kann. Der Standardwert ist false.
    • dismiss_popups: Wenn dieser Wert auf true gesetzt 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 der Modus strict nicht aktiv ist. Der Standardwert ist false.
    • notify: Wenn dieser Wert auf false festgelegt ist, werden am Anfang und am Ende der Ausführung des Robo-Scripts keine Benachrichtigungen auf dem Bildschirm angezeigt. Standardmäßig ist dies true.
  • postscript – Ausführungsoptionen, die nach Abschluss eines Robo-Scripts angewendet werden:
    • terminate: Wenn dieser Wert auf true gesetzt ist, beendet der Robo-Test das Crawling, nachdem das Robo-Script abgeschlossen ist. Der Standardwert ist false.

Das folgende Beispiel zeigt ein Robo-Script, das im strict-Modus ohne Benachrichtigungen auf dem Bildschirm ausgeführt wird. Es wartet drei Sekunden, bevor das Crawling 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 dieses Robo-Script zur Ausführung lädt. Vorlagenparameter haben das Präfix „__%“ und das Suffix „%__“.

Robo-Scripts unterstützen den folgenden Vorlagenparameter:

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

Hier ist ein Beispiel für ein Robo-Script, das den Prozess der zu testenden App beendet:

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

Kommentare

Ein Robo-Script kann Kommentarzeilen enthalten, die mit # oder // beginnen.

Hier ist 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 das Robo-Script aktiv, bis alle Aktionen eines Robo-Scripts abgeschlossen sind (oder zumindest versucht wurden). Der Robo-Test versucht immer, eine Robo-Script-Aktion abzugleichen, wenn er eine Aktion auswählt, die ausgeführt werden soll. Robo-Skripts verwenden die folgenden Techniken, um die Robustheit zu erhöhen:

Verfahren Beschreibung
Teilweise Übereinstimmung Wenn die aktuelle Robo-Skript-Aktion 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-Script-Aktion abgeglichen wird.

Wenn der Teilabgleich 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 ganz oder teilweise übereinstimmt, überspringt der Robo-Test die aktuelle Robo-Script-Aktion und führt die nachfolgende Aktion aus. Er kehrt nicht zur übersprungenen Aktion zurück.

Diese Technik unterstützt Szenarien, in denen sich das App-Verhalten zwischen Versionen ändert oder unzuverlässig ist, z. B. wenn ein Dialogfeld während der Aufzeichnung im Vergleich zur Wiedergabe eines Robo-Scripts 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 ausgesetzt und der Robo-Test wählt eine Aktion aus, die mit seinen anderen Strategien ausgeführt werden soll. Nach Abschluss dieser Aktion setzt der Robo-Test die Ausführung des Robo-Scripts fort.

Solange aktuelle oder nachfolgende Robo-Script-Aktionen nicht abgeglichen werden können, bleibt das Robo-Script für eine beliebige Anzahl von Aktionen gesperrt. Robo-Scripts müssen also nicht unbedingt ein Prolog für einen Robo-Test sein. Sie können Robo-Script-Aktionen mit Standard-Robo-Testaktionen kombinieren. Diese Technik unterstützt Szenarien, in denen das App-Verhalten unzuverlässig ist oder die Änderungen zwischen App-Versionen so groß sind, dass der Robo-Test die „Lücken“ mit seinen Standardaktionen füllen muss.

Prioritäten

Wenn ein Robo-Script sein maxNumberOfRuns erreicht, kann es in einem bestimmten Crawl nicht mehr ausgelöst werden. Wenn im aktuellen Kontext mehr als ein Robo-Script ausgelöst werden kann, wird die Priorität durch die Auswahl des Robo-Scripts in der folgenden Reihenfolge festgelegt:

  1. Hat ein contextDescriptor-Attribut.
  2. Hat die höchste priority (standardmäßig haben alle Robo-Scripts dieselbe Ausführungs-priority von 1).
  3. Wird in der Liste der Robo-Skripts am frühesten 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 Folgendes in der angegebenen Reihenfolge aus:

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

Wiederholte Ausführungen

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

Das folgende Beispiel zeigt ein Robo-Script, das die zu testende App bis zu zehnmal in den Hintergrund verschiebt:

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

Crawling-Phase

Robo-Scripts 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 das Crawling der zu testenden App abgeschlossen hat. Ein post_crawl-Robo-Script darf nicht länger als 15 Sekunden dauern, da sonst das Crawling mit einer Zeitüberschreitung beendet werden kann.
crawl Die Hauptphase des Crawlings, in der Robo die zu testende App crawlt.
close_screen Wenn Robo versucht, von einem bestimmten Bildschirm zurückzukehren (Backtracking), nachdem alle möglichen Aktionen auf diesem Bildschirm untersucht wurden. Standardmäßig drückt Robo auf „Zurück“, was in einigen Szenarien unerwünscht ist.

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

Im Folgenden finden Sie ein Beispiel für ein Robo-Script, mit dem die Nutzerdaten der zu testenden App gelöscht werden, bevor Robo mit dem Crawling beginnt:

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

Im folgenden Beispiel für ein Robo-Script wird Robo angewiesen, auf "Cancel" zu klicken, wenn versucht wird, von einem Bestätigungsdialogfeld zurückzukehren (Backtracking):

{
  "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-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 enthaltenen Robo-Script. Standardmäßig haben alle bedingten Aktionen die Priorität 1.
maxNumberOfRuns 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 höchstens einmal in einer einzelnen Ausführung des Robo-Scripts, in dem sie enthalten sind, ausgeführt werden.
contextDescriptor Der Kontext/die Bedingung, der/die diese bedingte Aktion auslöst. Er hat dieselbe Struktur und bietet ähnliche Funktionen wie der contextDescriptor des Robo-Scripts.

Wenn ein Robo-Script ausgelöst wird, führt es seine nicht bedingten Aktionen nacheinander in der Reihenfolge ihres Auftretens aus. 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. Ein gültiges Robo-Script muss mindestens eine nicht bedingte Aktion enthalten.

Das folgende Beispiel zeigt ein bedingungsloses Robo-Script mit einer bedingten Aktion, die Pop-up-Dialogfelder schließt, 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 für Robo enthalten, bestimmte UI-Widgets oder alle UI-Widgets auf einem bestimmten Bildschirm zu ignorieren. Diese Anweisungen werden als Ignorieren von „Aktionen“ mit eventType, ELEMENT_IGNORED und ALL_ELEMENTS_IGNORED dargestellt.

Wenn das contextDescriptor-Attribut eines Robo-Scripts, das Ignorieraktionen enthält, mit einem bestimmten Bildschirm übereinstimmt, interagiert Robo nicht mit UI-Widgets, die von den Ignorieraktionen 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-Script kann eine Mischung aus Ignorieraktionen, bedingten und nicht bedingten Aktionen enthalten. Im Gegensatz zu anderen Robo-Script-Aktionen werden Ignorieraktionen angewendet, solange der contextDescriptor des enthaltenden Robo-Scripts während eines Robo-Crawls mit einem Bildschirm übereinstimmt, unabhängig von den Werten der Attribute priority und maxNumberOfRuns.

Das folgende Beispiel zeigt eine Datei mit zwei Robo-Scripts. Das erste Robo-Script sorgt dafür, dass Robo alle UI-Widgets auf einem Bildschirm ignoriert, der ein UI-Widget mit der Ressourcen-ID "my.app.package:id/ignored_screen" enthält. Mit dem zweiten Robo-Script wird Robo angewiesen, 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"
          }
        ]
      }
    ]
  }
]

Unterstützung für RecyclerView und AdapterView

Untergeordnete Elemente von RecyclerView- und AdapterView-Widgets werden dynamisch geladen und sind möglicherweise erst nach mehrmaligem Wischen auf dem aktuellen Bildschirm zu sehen. Da die Größe eines Bildschirms und die Anzahl der Wischbewegungen, die erforderlich sind, um zu diesem untergeordneten Element zu gelangen, je nach Formfaktor des Geräts unterschiedlich sind, ist es viel robuster, sich auf die Datenposition des untergeordneten Elements zu verlassen, die absolut ist. Es ist ein weniger robuster Ansatz, sich auf die Anzahl der Wischbewegungen zu verlassen, die erforderlich sind, um dieses untergeordnete Element auf den Bildschirm zu bringen, und dann seine Bildschirmposition zu verwenden.

Daher erfasst das Robo-Script die absoluten Datenpositionen von RecyclerView-Unterelementen, die Ziele von Robo-Script-Aktionen sind, als recyclerViewChildPosition. Das Robo-Script erfasst auch die absoluten Datenpositionen von AdapterView-Unterelementen, die Ziele von Robo-Script-Aktionen sind, als adapterViewChildPosition.

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

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

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

Im Folgenden finden Sie ein Beispiel für eine Klickaktion auf 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
    }
  ]
}

Hier sehen Sie ein Beispiel für 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-Script in Android Studio aufzeichnen und in Test Lab ausführen

Sie können in Android Studio ein Robo-Script erstellen, das als JSON-Datei gespeichert wird. 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 JSON-Datei für ein Robo-Skript 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 bei der Verfolgung der Ausführung dieser Robo-Script-Aktion in Robo-Testausgaben.

Assertion

Wenn die Assertion-Bedingung erfüllt ist, fährt das Robo-Script mit der nächsten Aktion fort, 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-Skript-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-Script-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 Beispiel zeigt eine Robo-Skript-Assertion, mit der geprüft wird, 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 Bildschirmtastatur.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Klickt bis zu maxNumberOfRuns-mal auf zufällige Elemente der Bildschirmtastatur.
"eventType": "LIST_ITEM_CLICKED" Wird vom Robo-Skript-Recorder in Android Studio verwendet, um auf Listenelemente zu klicken.
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 gegenseitig mit elementDescriptors aus.
matchIndex Gibt den Index des Vorkommens des übereinstimmenden Zielelements an, wenn das Zielelement mit visionText identifiziert wird. Wenn der Wert 0 ist, wählt die Robo-Script-Aktion das erste übereinstimmende Element aus. Wenn der Wert 1 ist, wählt die Robo-Script-Aktion das zweite übereinstimmende Element aus 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 den Wert SOFT_KEYBOARD_RANDOM_CLICK hat. Der Standardwert ist 1.

Im folgenden Beispiel wird eine Robo-Script-Aktion gezeigt, bei 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, bei 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, bei der auf ein Bildschirmtastaturelement mit der Inhaltsbeschreibung "Emoji button" geklickt wird:

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

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

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

Bildschirmtastatur deaktivieren

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

Attribut Beschreibung
"eventType": "DISABLE_KEYBOARD" --

Hier ist ein Beispiel für 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 Shell-Befehl der Android Debug Bridge (adb).

Das folgende Attribut ist optional:

  • expectedOutputRegex – Die erwartete Ausgabe des Befehls als regulärer Java-Ausdruck. Stimmt sie nicht überein, schlägt die Robo-Script-Aktion fehl. Standardmäßig ist dies ein leerer String, d. h., die Ausgabe wird nicht geprüft.

Im Folgenden finden Sie ein Beispiel für eine Robo-Script-Aktion, 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-Script-Recorder in Android Studio aufgezeichnet, um die Abwärtskompatibilität mit dem Espresso Test Recorder zu gewährleisten. Der Robo-Test gewährt der zu testenden App zu Beginn jedes Crawls alle Berechtigungen. Diese Aktion ist also ein No-Op. Verwenden Sie diese Aktion NICHT in Ihren Robo-Skripts.

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

Attribut Beschreibung
"eventType": "PERMISSIONS_REQUEST" --

Alle Elemente auf einem Bildschirm ignorieren

Durch diese Aktion werden alle Elemente auf allen Bildschirmen ignoriert, die das Robo-Skript auslösen.

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

Attribut Beschreibung
"eventType": "ALL_ELEMENTS_IGNORED" --

Das folgende Beispiel zeigt eine Robo-Script-Aktion, die Robo anweist, alle Elemente auf einem Bildschirm zu ignorieren:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Element ignorieren

Durch diese Aktion ignoriert Robo ein oder mehrere Elemente, die mit dem angegebenen elementDescriptors übereinstimmen.

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

Attribut Beschreibung
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Identifiziert die ignorierten UI-Widgets mithilfe der Android-UI-Hierarchie.

Das folgende Attribut ist optional:

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

Das folgende Beispiel zeigt eine Robo-Script-Aktion, die Robo dazu veranlasst, 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-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 Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.
replacementText Der Text, der in das Ziel-UI-Widget eingegeben werden soll.

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

Langes Klicken

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. Schließt sich gegenseitig mit visionText aus.
visionText Identifiziert das lange angeklickte Element mithilfe von OCR. Schließt sich gegenseitig mit elementDescriptors aus.
matchIndex Gibt den Index des Vorkommens des übereinstimmenden Zielelements an, wenn das Zielelement mit visionText identifiziert wird. Wenn der Wert 0 ist, wählt die Robo-Script-Aktion das erste übereinstimmende Element aus. Wenn der Wert 1 ist, wählt die Robo-Script-Aktion das zweite übereinstimmende Element aus 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 in Millisekunden an, wie lange ein langes Drücken dauert.

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

Geste mit einem Berührungspunkt 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-Punkt-Geste, formatiert als „(x1,y1)->(x2,y2)“ in Prozent oder Pixeln.

Das folgende Attribut ist optional:

  • dragAndDrop: Wenn dieser Wert auf true festgelegt ist, wird mit der Ein-Punkt-Geste eine Drag-and-Drop-Aktion ausgeführt. Der Standardwert ist false.

Das folgende Beispiel zeigt eine Ein-Punkt-Gestenaktion in einem Robo-Script, mit der ein Wischen nach unten ausgeführt wird:

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

Zwei-Punkt-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 Geste mit zwei Punkten, formatiert als „(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)“ in Prozent oder Pixeln.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, die eine Geste zum Herauszoomen ausführt:

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

IME-Aktion ausführen

Mit dieser Aktion wird der aktuelle Aktionsbutton, z. B. „Weiter“, „Fertig“ und „Suchen“, im Eingabemethoden-Editor (IME) 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 Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.

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.

Hier ist ein Beispiel für eine Robo-Skriptaktion, bei der die Zurück-Taste gedrückt wird:

{
  "eventType": "PRESSED_BACK"
}

Drücke die Startbildschirmtaste.

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

Hier ist ein Beispiel für eine Robo-Skriptaktion, bei der die Startbildschirmtaste gedrückt wird:

{
  "eventType": "GO_HOME"
}

Element in die Ansicht scrollen

Mit dieser Aktion scrollt der Robo-Test das UI-Widget, das mit dem angegebenen elementDescriptors übereinstimmt, so lange vorwärts, bis das UI-Widget, das mit dem angegebenen childElementDescriptors übereinstimmt, auf dem Bildschirm angezeigt wird, das gescrollte Widget nicht mehr gescrollt werden kann oder die maximale Anzahl von 50 Scrollvorgängen 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 Gibt das UI-Widget an, zu dem mithilfe der Android-UI-Hierarchie gescrollt werden soll.

Im Folgenden finden Sie 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 bis kein Scrollen mehr möglich ist oder die maximale Anzahl von 50 Scrollvorgängen 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 der Wischbewegung an:
  • Left
  • Right
  • Up
  • Down
  • Forward: entweder Down oder Right, je nachdem, ob das Ziel-UI-Widget vertikal oder horizontal scrollbar ist.
  • Backward: entweder Up oder Left, je nachdem, ob das Ziel-UI-Widget vertikal oder horizontal scrollbar ist.
elementDescriptors Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.

Das folgende Beispiel zeigt eine Robo-Script-Aktion, bei 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-Script-Aktion, mit der ein Screenshot erstellt wird:

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

Tippen Sie auf einen Punkt auf dem Display.

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

Attribut Beschreibung
"eventType": "POINT_TAP" --
pointTapXCoordinate Die X-Koordinate des angetippten Punkts in Pixeln. 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 in Prozent. Schließt sich gegenseitig mit pointTapXCoordinate und pointTapYCoordinate aus.
pointTapYPercent Die Y-Koordinate des angetippten Punkts in Prozent. Schließt sich gegenseitig mit pointTapXCoordinate und pointTapYCoordinate aus.

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

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

Auf einen Punkt innerhalb eines Elements 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 Y-Koordinate in Prozent innerhalb des Zielelements.
elementDescriptors Identifiziert das Ziel-UI-Widget mithilfe der Android-UI-Hierarchie.

Hier ist ein Beispiel für eine Robo-Script-Aktion, mit der der Schieberegler einer Suchleiste nach rechts bewegt wird:

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

Crawling beenden

Dadurch 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, die einen Robo-Test beendet:

{
  "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 wartet:

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

Auf ein Element warten

Mit dieser Aktion wird der Robo-Test angewiesen, bis zum angegebenen Zeitlimit zu warten, bis 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 Zeitlimit für das Warten in Millisekunden an.
elementDescriptors Identifiziert das erwartete UI-Widget mithilfe der Android-UI-Hierarchie.

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