Przewodnik po skryptach Robo

Ten dokument zawiera informacje referencyjne o skryptach Robo, w tym o ich strukturze, możliwościach, zastosowaniu, nagrywaniu i działaniach. Skrypty Robo to testy, które automatyzują ręczne zadania związane z kontrolą jakości aplikacji mobilnych i umożliwiają stosowanie strategii ciągłej integracji oraz testowania przed publikacją. Skrypt Robo to plik JSON, który opisuje sekwencję działań w interfejsie użytkownika i innych działań.

Skrypt Robo możesz utworzyć na te sposoby:

  • Użyj funkcji nagrywania skryptu Robo. (tylko w Androidzie)

  • Ręcznie utwórz skrypt Robo. (Android i iOS+)

  • Nagrywaj skrypt Robo, a potem edytuj go ręcznie. (tylko w Androidzie)

Więcej informacji o korzystaniu ze skryptów Robo znajdziesz w artykule Uruchamianie skryptu Robo.

Wprowadzenie

Skrypt Robo jest przekazywany do testu Robo wraz z innymi danymi wejściowymi, takimi jak testowany pakiet aplikacji na Androida (APK).

Poniżej znajdziesz przykład skryptu Robo, który loguje użytkownika w aplikacji. Skrypt jest uruchamiany, gdy aplikacja poddawana testom zostaje uruchomiona:

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

Jeśli w pliku znajduje się 1 skrypt Robo i ma on domyślny warunek wyzwalający app_under_test_shown, jak w przykładzie powyżej, możesz określić skrypt Robo w pliku w prostszym formacie – po prostu jako sekwencję działań:

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

Obsługa skryptów Robo w przypadku urządzeń z iOS

Robo na iOS+ (beta) ma ograniczoną obsługę skryptów Robo. Składnia skryptu Robo dla iOS+ jest identyczna ze składnią Androida, a obsługiwane funkcje iOS+ działają podobnie jak ich odpowiedniki na Androidzie.

W systemie iOS+ obsługiwane są te działania:

  • Asercja
  • Kliknij
  • Kliknięcie i przytrzymanie
  • Przesuwanie palcem
  • Ignoruj wszystkie elementy
  • Czekaj
  • Zrób zrzut ekranu
  • Zakończ skanowanie

W deskryptorach elementów w iOS+ obsługiwane są te atrybuty identyfikujące:

  • Nazwa zajęć
  • Nazwa klasy przodka
  • Opis treści (i wyrażenie regularne)
  • Tekst (i wyrażenie regularne)

W przypadku iOS+ obsługiwane są te warunki wyzwalające w deskryptorach kontekstu:

  • Wyświetlanie testowanej aplikacji
  • Element present
  • Wykonano działanie skryptu innego niż Robo

Struktura

Skrypt Robo ma kilka atrybutów, które opisują sposób jego wykonywania. Większość tych atrybutów jest opcjonalna i ma wstępnie zdefiniowane wartości domyślne:

Atrybut Opis
id Liczba całkowita, która pomaga śledzić ten skrypt Robo w wynikach indeksowania. Robo ma wbudowane skrypty Robo z własnymi id. Chociaż ten sam znak id w różnych skryptach Robo nie wpływa na ich działanie, odróżnienie działań z tych skryptów w danych wyjściowych indeksowania może być trudne. Aby uniknąć konfliktów, zalecamy przypisanie skryptom Robo unikalnego poziomu id o wartości 1000 lub wyższej.
description Podobne do id, ale bardziej szczegółowe.
crawlStage Etap indeksowania, na którym Robo stosuje ten skrypt Robo. Domyślnie jest to główny etap indeksowania.
priority Priorytet tego skryptu Robo w porównaniu z innymi skryptami Robo. Domyślnie wszystkie skrypty Robo mają priorytet 1.
maxNumberOfRuns Określa, ile razy podczas indeksowania robot może wykonać ten skrypt Robo. Domyślnie Robo może wykonać skrypt Robo tylko raz.
contextDescriptor Opisuje kontekst lub warunek, który wywołuje ten skrypt Robo. Jeśli ten element zostanie pominięty, warunek wywołania skryptu Robo jest zawsze spełniony, czyli skrypt Robo jest bezwarunkowy.
actions Wszystkie działania tego skryptu Robo.

Jeden plik zawiera kolekcję co najmniej 1 skryptu Robo.

Poniżej znajduje się przykład pliku z 2 bezwarunkowymi skryptami Robo, z których każdy zawiera 1 działanie wykonywane raz na początku indeksowania:

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

Deskryptor kontekstu

Deskryptor kontekstu definiuje kontekst lub warunek, który wywołuje skrypt Robo, za pomocą jednego lub kombinacji kilku atrybutów:

Atrybut Opis
"condition": "always" Zawsze uruchamia skrypt Robo.
"condition": "element_present" Sprawdza, czy na ekranie znajduje się widżet interfejsu, który pasuje do tekstu określonego przez elementDescriptors lub visionText.
"condition": "element_disabled" Sprawdza, czy na ekranie znajduje się widżet interfejsu, który pasuje do elementDescriptors, i czy nie można z nim wejść w interakcję.
"condition": "element_checked" Sprawdza, czy na ekranie znajduje się widżet interfejsu pasujący do elementDescriptors i czy jest zaznaczony.
"condition": "app_under_test_shown" Sprawdza, czy testowana aplikacja jest uruchomiona na pierwszym planie.
"condition": "default_launcher_shown" Sprawdza, czy wyświetlany jest ekran główny urządzenia, co oznacza, że żadne aplikacje nie działają na pierwszym planie.
"condition": "non_roboscript_action_performed" Sprawdza, czy ostatnie nonRoboscriptActionCount kolejne działania wykonane przez test Robo nie są działaniami skryptu Robo.
negateCondition Jeśli ma wartość true, neguje condition. Możesz na przykład użyć tego atrybutu, aby sprawdzić, czy widżet interfejsu NIE jest widoczny na ekranie lub czy testowana aplikacja NIE działa na pierwszym planie.
elementDescriptors Co najmniej jeden deskryptor elementu, który identyfikuje widżet interfejsu na ekranie. Jest używany w połączeniu z warunkami element_present, element_disabledelement_checked. Wzajemnie wykluczające się z atrybutem visionText. Więcej informacji znajdziesz w sekcji Deskryptory elementów.
visionText Tekst na ekranie jest wykrywany za pomocą interfejsu Optical Character Recognition (OCR). Właściwość visionText jest używana w połączeniu z warunkiem element_present. Wzajemnie wykluczające się z atrybutem elementDescriptors.
nonRoboscriptActionCount Liczba kolejnych działań skryptu innych niż Robo wykonanych wcześniej. Jest on używany w połączeniu z warunkiem non_roboscript_action_performed, aby uruchamiać skrypt Robo po każdym działaniu nonRoboscriptActionCount Robo. Domyślnie jest to 1.

Poniżej znajdziesz przykład skryptu Robo, który jest wywoływany przez widżet interfejsu z identyfikatorem zasobu "my.app.package:id/page_header", który znajduje się na ekranie:

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

Poniżej znajdziesz przykład skryptu Robo, który jest wywoływany przez "Privacy Policy" wykryte przez optyczne rozpoznawanie znaków (OCR):

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

Oto przykład skryptu Robo, który po każdej czynności Robo innej niż skrypt czeka 5 sekund:

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

Działania

Każda czynność w skrypcie Robo jest reprezentowana jako pakiet co najmniej 1 pary atrybut-wartość. Opis tych par znajdziesz w tabeli poniżej:

Atrybut Opis
eventType Określa typ działania, np. kliknięcie, edycja tekstu itp. Wymagane w przypadku każdego działania.
elementDescriptors Deskryptory identyfikujące widżet interfejsu. Wymagane w przypadku wszystkich działań, które mają docelowy widżet interfejsu, np. kliknięcie konkretnego przycisku.
optional Jeśli ta opcja ma wartość true, działanie jest pomijane, gdy nie można go wykonać. Na przykład to działanie jest pomijane, gdy na ekranie nie można znaleźć docelowego widżetu interfejsu użytkownika, ale nie powoduje to niepowodzenia skryptu Robo. Domyślna wartość to false.
replacementText Tekst do wpisania w widżecie interfejsu docelowego. Wymagane w przypadku działań związanych z edytowaniem tekstu.
swipeDirection Określa kierunek przesunięcia. Wymagane w przypadku działań przesuwania.
delayTime Określa czas oczekiwania w milisekundach. Wymagany w przypadku działań oczekiwania.
pointTapXCoordinate i pointTapYCoordinate Współrzędne X i Y w pikselach punktu dotknięcia. Wyklucza się z pointTapXPercentpointTapYPercent. Wymagane w przypadku działań związanych z kliknięciem punktu.
pointTapXPercent i pointTapYPercent Procentowe współrzędne X i Y punktu dotknięcia. Wzajemnie wykluczające się z pointTapXCoordinatepointTapYCoordinate. Wymagane w przypadku działań związanych z kliknięciem punktu.

Poniżej znajdziesz przykład skryptu Robo z 2 działaniami bez docelowych widżetów interfejsu, co oznacza, że te działania nie są wykonywane na konkretnym widżecie interfejsu:

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

Deskryptory elementów

Deskryptor elementu identyfikuje widżet interfejsu za pomocą co najmniej jednego z tych atrybutów identyfikujących:

Atrybut Opis
className
ancestorClassName Nazwa klasy elementu nadrzędnego w hierarchii interfejsu. Element nadrzędny to dowolny węzeł nadrzędny w hierarchii interfejsu elementu, w tym sam element.
resourceId
resourceIdRegex Wyrażenie regularne w języku Java pasujące do znaku resourceId.
contentDescription
contentDescriptionRegex Wyrażenie regularne w języku Java pasujące do znaku contentDescription.
text (który pojawia się na ekranie)
textRegex Wyrażenie regularne w języku Java pasujące do znaku text.
groupViewChildPosition, recyclerViewChildPosition lub adapterViewChildPosition Określa pozycję elementu podrzędnego widżetu interfejsu w zależności od rodzaju widżetu nadrzędnego.

Często te atrybuty są niezdefiniowane, np. przycisk może nie mieć tekstu ani opisu treści. Nawet jeśli niektóre wartości atrybutów są obecne, mogą nie być unikalne na danym ekranie aplikacji (w tym resourceId).

Na przykład rozróżnienie elementów listy jest zwykle możliwe tylko dzięki ich różnym pozycjom podrzędnym w widżecie nadrzędnym. Oznacza to, że użycie tylko jednego deskryptora elementu do identyfikacji widżetu interfejsu jest zwykle niewystarczające. Dlatego atrybut elementDescriptors działania zawiera sekwencję deskryptorów elementów, które są uporządkowane w taki sposób, że pierwszy z nich odpowiada docelowemu widżetowi interfejsu, drugi – widżetowi nadrzędnemu docelowego widżetu interfejsu, i tak dalej. Docelowy widżet interfejsu działania jest dopasowywany, gdy wszystkie jego deskryptory elementów pasują do odpowiedniej podhierarchii widżetu interfejsu.

Oto przykład skryptu Robo ze zmianą tekstu i działaniami związanymi z kliknięciem. W obu przypadkach musisz zidentyfikować docelowy widżet interfejsu za pomocą podanych deskryptorów elementów:

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

Opcje wykonania

Opcjonalnie możesz dodać do listy działań w skrypcie Robo prefiks w postaci obiektu JSON, który określa opcje wykonania tego skryptu. Ten nagłówek konfiguracji zaczyna się od słowa kluczowego roboscript, po którym następuje reprezentacja JSON żądanych opcji wykonania.

Skrypty Robo obsługują te opcje wykonywania:

  • executionMode – opcje wykonywania stosowane podczas działania skryptu Robo:
    • strict – jeśli ustawiona jest wartość true, skrypt Robo nie stosuje częściowego dopasowywania, pomija bieżące działanie i zawiesza działanie. Oznacza to, że skrypt Robo jest wykonywany jako zwykły test instrumentacji i kończy się niepowodzeniem, gdy tylko nie można wykonać żadnego z jego działań. Domyślnie jest to false.
    • dismiss_popups – jeśli ma wartość true, test Robo odrzuca wszystkie nieoczekiwane okna dialogowe podczas wykonywania skryptu Robo, nawet w trybie strict. Ta opcja nie działa, gdy nie jest włączony tryb strict. Domyślnie jest to false.
    • notify – jeśli ustawisz wartość false, skrypt Robo nie będzie wyświetlać powiadomień na ekranie na początku i na końcu działania. Domyślnie jest to true.
  • postscript – opcje wykonania zastosowane po zakończeniu skryptu Robo:
    • terminate – jeśli ustawisz wartość true, test Robo przestanie indeksować po zakończeniu skryptu Robo. Domyślnie jest to false.

Oto przykład skryptu Robo uruchomionego w trybie strict bez powiadomień na ekranie, który czeka 3 sekundy, a potem zatrzymuje indeksowanie:

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

Parametry szablonu

Parametr szablonu to symbol zastępczy w skrypcie Robo, który jest zastępowany rzeczywistą wartością, gdy test Robo wczytuje ten skrypt do wykonania. Parametry szablonu mają przedrostek w postaci dwóch podkreśleń i znaku procenta oraz przyrostek w postaci znaku procenta i dwóch podkreśleń.

Skrypty Robo obsługują ten parametr szablonu:

  • __%APP_PACKAGE_NAME%__ – nazwa pakietu testowanej aplikacji.

Oto przykład skryptu Robo, który zatrzymuje proces testowanej aplikacji:

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

Komentarze

Skrypt Robo może zawierać wiersze komentarzy, czyli wiersze rozpoczynające się od znaku # lub //.

Oto przykład skryptu Robo z kilkoma komentarzami:

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

Uprawnienia

Domyślnie skrypt Robo pozostaje aktywny, dopóki wszystkie działania w nim nie zostaną ukończone (lub przynajmniej podjęte). Test Robo próbuje dopasować działanie skryptu Robo za każdym razem, gdy wybiera działanie do wykonania. Aby zwiększyć niezawodność, skrypt Robo wykorzystuje te techniki:

Technika Opis
Dopasowanie częściowe Jeśli bieżące działanie skryptu Robo nie może zostać w pełni dopasowane, kryteria dopasowania są łagodzone i ponawiana jest próba dopasowania. Dopasowanie częściowe nie uwzględnia zewnętrznego deskryptora elementu podczas dopasowywania docelowego widżetu interfejsu użytkownika działania skryptu Robo.

Jeśli dopasowanie częściowe się powiedzie, odpowiednie działanie skryptu Robo zostanie wykonane jak zwykle. Ta technika obsługuje sytuacje, w których zmienia się struktura aplikacji, np. między wersjami aplikacji, gdy elementy ekranu są przestawiane.

Pomiń bieżące działanie Jeśli bieżąca czynność skryptu Robo nie może zostać w całości lub częściowo dopasowana, Robo próbuje dopasować kolejną czynność skryptu Robo. Jeśli kolejne działanie w pełni lub częściowo pasuje, test Robo pomija bieżące działanie skryptu Robo (i nigdy do niego nie wraca) i wykonuje kolejne.

Ta technika obsługuje sytuacje, w których działanie aplikacji zmienia się między wersjami lub jest niestabilne, np. gdy podczas nagrywania i odtwarzania skryptu Robo na różnych ekranach może pojawiać się przerywany komunikat.

Zawieś Jeśli bieżące ani kolejne działania skryptu Robo nie mogą zostać w pełni ani częściowo dopasowane, skrypt Robo jest tymczasowo zawieszany, a test Robo wybiera działanie do wykonania przy użyciu innych strategii. Po zakończeniu tej czynności test Robo wznawia wykonywanie skryptu Robo.

Dopóki bieżące lub kolejne działania skryptu Robo nie będą mogły zostać dopasowane, skrypt Robo pozostanie zawieszony dla dowolnej liczby działań. Dlatego skrypty Robo nie muszą być prologiem testu Robo. Możesz przeplatać działania skryptu Robo ze standardowymi działaniami testu Robo. Ta technika jest przydatna w sytuacjach, gdy aplikacja działa niestabilnie lub gdy zmiany między wersjami aplikacji są na tyle duże, że test Robo musi „wypełnić luki” standardowymi działaniami.

Priorytety

Jeśli skrypt Robo osiągnie limit maxNumberOfRuns, nie będzie można go już wywołać podczas danego skanowania. Jeśli w bieżącym kontekście można uruchomić więcej niż 1 skrypt Robo, priorytet jest przyznawany w tej kolejności:

  1. ma atrybut contextDescriptor;
  2. Ma najwyższą wartość priority (domyślnie wszystkie skrypty Robo mają taką samą wartość priority wykonania równą 1).
  3. Pojawia się na początku listy skryptów Robo, jeśli mają one ten sam priorytet.

Poniżej znajdziesz przykład pliku z 3 skryptami Robo, które wykonują to samo działanie i są wywoływane przez ten sam warunek – aplikacja poddawana testom jest na pierwszym planie:

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

Gdy testowana aplikacja jest na pierwszym planie, Robo wywołuje w kolejności:

  1. "Robo script 2", ponieważ ma najwyższy priorytet.
  2. "Robo script 1", ponieważ pojawia się wcześniej wśród pozostałych skryptów Robo o tym samym priorytecie.
  3. "Robo script 3" jako ostatni odpowiedni skrypt Robo.

Powtórzone przebiegi

Domyślnie Robo uruchamia skrypt Robo co najwyżej raz podczas indeksowania. Można to dostosować za pomocą atrybutu maxNumberOfRuns.

Poniżej znajdziesz przykładowy skrypt Robo, który przenosi testowaną aplikację w tle maksymalnie 10 razy:

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

Etap indeksowania

Skrypty Robo można stosować na różnych etapach indeksowania Robo:

Etap indeksowania Opis
pre_crawl Zanim narzędzie Robo uruchomi się i zacznie indeksować testowaną aplikację.
post_crawl Po zakończeniu przez Robo indeksowania testowanej aplikacji. post_crawl Skrypt Robo nie może trwać dłużej niż 15 sekund, w przeciwnym razie indeksowanie może zostać przerwane z powodu przekroczenia limitu czasu.
crawl Główny etap indeksowania, podczas którego Robo indeksuje testowaną aplikację.
close_screen Gdy Robo próbuje wrócić (śledzenie wsteczne) z danego ekranu, gdy wszystkie możliwe działania na tym ekranie zostały już wypróbowane. Domyślnie Robo naciska przycisk Wstecz, co w niektórych przypadkach jest niepożądane.

Jeśli atrybut crawlStage skryptu Robo nie jest określony, przyjmuje się, że ma wartość crawl.

Poniżej znajdziesz przykład skryptu Robo, który czyści dane użytkownika testowanej aplikacji, zanim Robo zacznie ją indeksować:

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

Poniżej znajdziesz przykład skryptu Robo, który nakazuje robotowi Robo kliknięcie "Cancel", gdy próbuje wrócić z okna dialogowego potwierdzenia:

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

Działania warunkowe

Skrypt Robo może zawierać działania warunkowe. Działania warunkowe mają 3 dodatkowe atrybuty, które opisują sposób ich wykonywania przez Robo:

Atrybut Opis
priority Priorytet tego działania warunkowego w porównaniu z innymi działaniami warunkowymi w skrypcie Robo, w którym się znajduje. Domyślnie wszystkie działania warunkowe mają priorytet 1.
maxNumberOfRuns Ile razy to działanie warunkowe może zostać wykonane podczas jednego wykonania skryptu Robo, w którym się znajduje. Domyślnie wszystkie działania warunkowe można wykonać co najwyżej raz podczas jednego wykonania skryptu Robo, który je zawiera.
contextDescriptor Kontekst lub warunek, który wywołuje to działanie warunkowe. Ma taką samą strukturę i oferuje podobne możliwości jak contextDescriptor skryptu Robo.

Po wywołaniu skrypt Robo wykonuje swoje działania bezwarunkowe kolejno w kolejności ich występowania. Jeśli skrypt Robo zawiera działania warunkowe, są one sprawdzane za każdym razem przed wybraniem działania bezwarunkowego do wykonania. Jeśli jakiekolwiek działanie warunkowe zostanie wywołane i wybrane na podstawie jego priorytetu oraz pozostałej liczby uruchomień, skrypt Robo wykona to działanie warunkowe. W przeciwnym razie skrypt Robo wykona to działanie bezwarunkowe. Aby skrypt Robo był prawidłowy, musi zawierać co najmniej jedno działanie bezwarunkowe.

Poniżej znajdziesz przykład bezwarunkowego skryptu Robo z warunkową czynnością, która zamyka okna wyskakujące, jeśli pojawią się w dowolnym momencie podczas wykonywania skryptu Robo:

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

Ignorowanie działań

Skrypt Robo może zawierać instrukcje, aby Robo ignorował określone widżety interfejsu lub wszystkie widżety interfejsu na danym ekranie. W tych instrukcjach pomijanie „działań” jest przedstawione odpowiednio za pomocą symboli eventType ELEMENT_IGNOREDALL_ELEMENTS_IGNORED.

Gdy atrybut contextDescriptor skryptu Robo zawierającego działania ignorowania pasuje do danego ekranu, Robo nie wchodzi w interakcję z żadnymi widżetami interfejsu, na które są ukierunkowane działania ignorowania (chyba że inne działanie skryptu Robo spowoduje, że Robo wykona działanie na jednym z ignorowanych widżetów interfejsu).

Skrypt Robo może zawierać kombinację działań ignorujących, warunkowych i bezwarunkowych. W przeciwieństwie do innych działań skryptu Robo działania ignorowania są stosowane tak długo, jak długo contextDescriptor skryptu Robo, który je zawiera, pasuje do ekranu podczas indeksowania przez Robo, niezależnie od wartości atrybutów prioritymaxNumberOfRuns.

Poniżej znajdziesz przykład pliku z 2 skryptami Robo. Pierwszy skrypt Robo powoduje, że Robo ignoruje wszystkie widżety interfejsu na ekranie zawierającym widżet interfejsu z identyfikatorem zasobu "my.app.package:id/ignored_screen". Drugi skrypt Robo sprawia, że Robo ignoruje widżety interfejsu, których identyfikatory zasobów pasują do wyrażenia regularnego Java ".*:id/done" na ekranie zawierającym widżet interfejsu o identyfikatorze zasobu "my.app.package:id/main_screen":

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

Obsługa widoków RecyclerView i AdapterView

Elementy podrzędne widżetów RecyclerView i AdapterView są ładowane dynamicznie i mogą być wyświetlane wiele przesunięć od bieżącego ekranu. Rozmiar ekranu i liczba przesunięć wymaganych do dotarcia do tego dziecka różnią się w zależności od formatu urządzenia, dlatego bardziej niezawodne jest poleganie na pozycji danych dziecka, która jest bezwzględna. Opieranie się na liczbie przesunięć wymaganych do wyświetlenia tego elementu na ekranie, a następnie korzystanie z jego pozycji na ekranie jest mniej niezawodne.

Dlatego skrypt Robo rejestruje bezwzględne pozycje danych elementów podrzędnych RecyclerView, które są celami działań skryptu Robo, jako recyclerViewChildPosition. Skrypt Robo rejestruje też bezwzględne pozycje danych elementów podrzędnych AdapterView, które są celami działań skryptu Robo, jako adapterViewChildPosition.

Działania na elementach podrzędnych widoków RecyclerView i AdapterView są wykonywane w następujących krokach:

  1. Test Robo zapewnia, że odpowiednie dziecko jest wyświetlane na ekranie dzięki działaniu pozycjonującemu w zawierającym je widoku RecyclerView lub AdapterView.

  2. Test Robo wykonuje zarejestrowane działanie bezpośrednio na elemencie podrzędnym, ponieważ jest on już wyświetlany na ekranie.

Poniżej znajdziesz przykład działania kliknięcia elementu podrzędnego 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
    }
  ]
}

Oto przykład działania kliknięcia elementu podrzędnego 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
    }
  ]
}

Zarejestruj skrypt Robo w Android Studio i uruchom go w Test Lab

Skrypt Robo możesz utworzyć w Android Studio. Zostanie on zapisany jako plik JSON. Następnie możesz przesłać plik JSON do Firebase Test Lab za pomocą aplikacji i odpowiednio przeprowadzić test.

Gdy przeprowadzasz test Robo z dołączonym skryptem, test Robo najpierw wykonuje czynności oskryptowane przez Ciebie, a potem analizuje aplikację według normalnego schematu.

Aby utworzyć plik JSON skryptu Robo w Android Studio, wykonaj czynności opisane w artykule Nagrywanie skryptu Robo za pomocą Test Lab w Android Studio.

Działania skryptu Robo

Ten wspólny atrybut opcjonalny ma zastosowanie do wszystkich działań:

  • description – pomaga śledzić wykonanie tego działania skryptu Robo w wynikach testu Robo.

Asercja

Jeśli potwierdzony warunek jest spełniony, skrypt Robo przechodzi do następnego działania, które może być kolejnym potwierdzeniem. W przeciwnym razie wykonanie skryptu Robo zostanie zatrzymane z powodu nieudanej asercji.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "ASSERTION" --
contextDescriptor Opisuje potwierdzony kontekst lub warunek. Ma taką samą strukturę i oferuje podobne możliwości jak element contextDescriptor w skrypcie Robo.

Oto przykład asercji skryptu Robo, która sprawdza, czy testowana aplikacja jest na pierwszym planie:

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

Poniżej znajdziesz przykład asercji skryptu Robo, która sprawdza, czy na ekranie znajduje się widżet interfejsu z identyfikatorem zasobu "com.google.samples.apps.topeka:id/done":

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

Poniżej znajdziesz przykład asercji skryptu Robo, która sprawdza, czy na ekranie NIE wykryto elementu "Settings" za pomocą OCR:

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

Kliknij

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
eventType Określa typ działania skryptu Robo.
"eventType": "VIEW_CLICKED" Kliknięcie elementu docelowego w testowanej aplikacji.
"eventType": "SOFT_KEYBOARD_CLICK" Kliknięcie elementu docelowego klawiatury ekranowej.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Kliknięcia losowych elementów klawiatury ekranowej do maxNumberOfRuns razy.
"eventType": "LIST_ITEM_CLICKED" Używany przez rejestrator skryptów Robo w Androidzie Studio do klikania elementów listy.
elementDescriptors Określa kliknięty widżet interfejsu za pomocą hierarchii interfejsu Androida. Wzajemnie wykluczające się z atrybutem visionText.
visionText Rozpoznaje kliknięty element za pomocą OCR. Wzajemnie wykluczające się z atrybutem elementDescriptors.
matchIndex Określa indeks wystąpienia pasującego elementu docelowego, gdy element docelowy jest identyfikowany za pomocą visionText. Jeśli jest to 0, skrypt Robo wybiera pierwszy pasujący element. Jeśli jest to 1, skrypt Robo wybiera drugi pasujący element itd. Kolejność jest określana od lewej do prawej i od góry do dołu. Wartością domyślną jest 0 (wybierane jest pierwsze dopasowanie).
maxNumberOfRuns Określa, ile razy należy kliknąć losowy element klawiatury ekranowej, gdy eventType ma wartość SOFT_KEYBOARD_RANDOM_CLICK. Wartością domyślną jest 1.

Oto przykład działania skryptu Robo, które klika przycisk z identyfikatorem zasobu "com.google.samples.apps.topeka:id/done":

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

Oto przykład działania skryptu Robo, które klika drugie wystąpienie słowa "Search" wykrytego na ekranie za pomocą OCR:

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

Oto przykład działania skryptu Robo, które klika element klawiatury ekranowej z opisem treści "Emoji button":

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

Oto przykład działania skryptu Robo, który klika losowe elementy klawiatury ekranowej maksymalnie 5 razy:

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

Wyłącz klawiaturę ekranową

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "DISABLE_KEYBOARD" --

Oto przykład działania skryptu Robo, który wyłącza klawiaturę ekranową:

{
  "eventType": "DISABLE_KEYBOARD"
}

Wykonywanie polecenia powłoki adb

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "ADB_SHELL_COMMAND" --
command Polecenie powłoki Android Debug Bridge (adb) do wykonania.

Ten atrybut jest opcjonalny:

  • expectedOutputRegex – oczekiwane dane wyjściowe polecenia jako wyrażenie regularne w Javie. Jeśli dane wyjściowe nie będą się zgadzać, działanie skryptu Robo zakończy się niepowodzeniem. Domyślnie jest to pusty ciąg znaków, co oznacza, że dane wyjściowe nie są sprawdzane.

Oto przykład działania skryptu Robo, które usuwa dane użytkownika testowanej aplikacji:

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

Przyznaj uprawnienia

Ta czynność jest rejestrowana przez rejestrator skryptów Robo w Android Studio w celu zapewnienia zgodności wstecznej z rejestratorem testów Espresso. Test Robo przyznaje wszystkie uprawnienia testowanej aplikacji na początku każdego indeksowania, więc to działanie nie ma żadnego efektu. NIE używaj tego działania w skryptach Robo.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "PERMISSIONS_REQUEST" --

Ignorowanie wszystkich elementów na ekranie

To działanie powoduje, że Robo ignoruje wszystkie elementy na dowolnym ekranie, który wywołuje zawierający skrypt Robo.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "ALL_ELEMENTS_IGNORED" --

Oto przykład działania skryptu Robo, które powoduje, że Robo ignoruje wszystkie elementy na ekranie:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Ignorowanie elementu

Ta czynność powoduje, że Robo ignoruje element (lub elementy) pasujący do określonego elementDescriptors.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Identyfikuje zignorowane widżety interfejsu za pomocą hierarchii interfejsu Androida.

Ten atrybut jest opcjonalny:

  • ignoreChildren – jeśli ustawisz wartość true, Robo zignoruje też wszystkie elementy podrzędne zignorowanych widżetów interfejsu. Domyślnie jest to false.

Poniżej znajdziesz przykład działania skryptu Robo, które sprawia, że Robo ignoruje wszystkie elementy, których opisy zawartości zaczynają się od "Avatar":

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

Wprowadzany tekst

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
eventType Określa typ działania skryptu Robo.
"eventType": "VIEW_TEXT_CHANGED" Wpisuje podany tekst w widżecie interfejsu docelowego.
"eventType": "ENTER_TEXT" wpisuje podany tekst w widżecie interfejsu i wysyła do niego zdarzenie KEYCODE_ENTER.
elementDescriptors Określa docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida.
replacementText Tekst do wpisania w widżecie interfejsu docelowego.

Oto przykład działania skryptu Robo, które wprowadza wartość "John" do widżetu interfejsu z identyfikatorem zasobu "com.google.samples.apps.topeka:id/first_name":

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

Kliknięcie i przytrzymanie

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Określa docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida. Wzajemnie wykluczające się z visionText.
visionText Rozpoznaje element, który został kliknięty i przytrzymany, za pomocą OCR. Wzajemnie wykluczające się z atrybutem elementDescriptors.
matchIndex Określa indeks wystąpienia pasującego elementu docelowego, gdy element docelowy jest identyfikowany za pomocą visionText. Jeśli jest to 0, skrypt Robo wybiera pierwszy pasujący element. Jeśli jest to 1, skrypt Robo wybiera drugi pasujący element itd. Kolejność jest określana od lewej do prawej i od góry do dołu. Wartością domyślną jest 0 (wybierane jest pierwsze dopasowanie).

Ten atrybut jest opcjonalny:

  • delayTime – określa, jak długo trwa przytrzymanie w przypadku długiego kliknięcia (w milisekundach).

Oto przykład działania skryptu Robo, które przez 5 sekund klika widżet interfejsu z opisem treści "Avatar 8":

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

Wykonaj gest z użyciem 1 palca

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "ONE_POINT_GESTURE" --
coordinates Dwie współrzędne gestu jednopunktowego w formacie „(x1,y1)->(x2,y2)” w procentach lub pikselach.

Ten atrybut jest opcjonalny:

  • dragAndDrop – jeśli ustawiona jest wartość true, gest jednym palcem wykonuje działanie przeciągnij i upuść. Domyślnie jest to false.

Oto przykład działania gestu jednopunktowego w skrypcie Robo, który wykonuje przesunięcie w dół:

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

Wykonaj gest dwoma palcami

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "TWO_POINT_GESTURE" --
coordinates Cztery współrzędne gestu dwupunktowego w formacie „(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)” w procentach lub pikselach.

Oto przykład działania skryptu Robo, które wykonuje gest rozsuwania:

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

Wykonywanie działania IME

To działanie powoduje naciśnięcie bieżącego przycisku działania, np. Dalej, Gotowe lub Szukaj, w edytorze metody wprowadzania (IME) dla określonego docelowego widżetu interfejsu.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Określa docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida.

Poniżej znajdziesz przykład działania skryptu Robo, które wykonuje działanie IME na widżecie interfejsu z identyfikatorem zasobu "com.google.samples.apps.topeka:id/first_name":

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

Naciśnij Wstecz

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
eventType Określa typ działania skryptu Robo.
"eventType": "PRESSED_BACK" Wysyła na urządzenie zdarzenie KEYCODE_BACK.
"eventType": "PRESSED_BACK_EMULATOR_28" Używany przez rejestrator skryptów Robo w Androidzie Studio do naciskania przycisku Wstecz na emulatorach z interfejsem API 28.

Oto przykład działania skryptu Robo, które powoduje naciśnięcie przycisku Wstecz:

{
  "eventType": "PRESSED_BACK"
}

Naciśnij przycisk ekranu głównego

Spowoduje to wysłanie zdarzenia KEYCODE_HOME na urządzenie.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "GO_HOME" --

Oto przykład działania skryptu Robo, który naciska przycisk Home:

{
  "eventType": "GO_HOME"
}

Przewiń element, aby go wyświetlić

W wyniku tej czynności test Robo przewija do przodu element interfejsu, który pasuje do określonego elementDescriptors, aż na ekranie pojawi się element interfejsu pasujący do określonego childElementDescriptors, przewijany element nie będzie już mógł być przewijany lub zostanie osiągnięta maksymalna liczba 50 przewinięć.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Określa przewinięty widżet interfejsu za pomocą hierarchii interfejsu Androida.
childElementDescriptors Określa widżet interfejsu, do którego należy przewinąć, korzystając z hierarchii interfejsu Androida.

Poniżej znajdziesz przykład działania skryptu Robo, który przewija widżet interfejsu z identyfikatorem zasobu "my.app.package:id/scrollable_card_container", dopóki na ekranie nie pojawi się widżet interfejsu z tekstem "Orange" (lub dopóki nie będzie można już przewijać, albo dopóki nie zostanie osiągnięta maksymalna liczba przewinięć, czyli 50):

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

Przesuwanie palcem

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "VIEW_SWIPED" --
swipeDirection Określa kierunek przesunięcia:
  • Left
  • Right
  • Up
  • Down
  • Forward – Down lubRight w zależności od możliwości przewijania w pionie lub w poziomie docelowego widżetu interfejsu.
  • Backward – Up lub Left w zależności od możliwości przewijania w pionie lub w poziomie docelowego widżetu interfejsu.
elementDescriptors Określa docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida.

Oto przykład działania skryptu Robo, które przesuwa w górę widżet interfejsu z identyfikatorem zasobu "my.app.package:id/custom_content":

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

Zrób zrzut ekranu

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "TAKE_SCREENSHOT" --
screenshotName Określa nazwę pliku z zrzutem ekranu.

Oto przykład działania skryptu Robo, które robi zrzut ekranu:

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

Kliknij punkt na ekranie.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "POINT_TAP" --
pointTapXCoordinate Współrzędna X piksela dotkniętego punktu. Wyklucza się z pointTapXPercentpointTapYPercent.
pointTapYCoordinate Współrzędna Y piksela dotkniętego punktu. Wyklucza się z pointTapXPercentpointTapYPercent.
pointTapXPercent Współrzędna X punktu dotknięcia podana w procentach. Wyklucza się z pointTapXCoordinatepointTapYCoordinate.
pointTapYPercent Współrzędna Y punktu dotknięcia podana w procentach. Wyklucza się z pointTapXCoordinatepointTapYCoordinate.

Oto przykład działania skryptu Robo, które powoduje kliknięcie środka ekranu:

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

Kliknij punkt w elemencie.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent Współrzędna X w procentach w obrębie elementu docelowego.
pointTapYPercent Współrzędna Y w procentach w obrębie elementu docelowego.
elementDescriptors Określa docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida.

Oto przykład działania skryptu Robo, które przesuwa suwak paska przewijania w prawo:

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

Zakończ skanowanie

Ta czynność spowoduje zatrzymanie testu Robo.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "TERMINATE_CRAWL" --

Oto przykład działania skryptu Robo, które zatrzymuje test Robo:

{
  "eventType": "TERMINATE_CRAWL"
}

Czekaj

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "WAIT" (or "DELAYED_MESSAGE_POSTED") --
delayTime Określa czas oczekiwania w milisekundach.

Oto przykład działania skryptu Robo, które czeka 3 sekundy:

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

Czekanie na element

To działanie powoduje, że test Robo czeka na pojawienie się elementu na ekranie przez określony czas.

W tabeli poniżej znajdziesz listę wymaganych atrybutów:

Atrybut Opis
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Określa czas oczekiwania w milisekundach.
elementDescriptors Identyfikuje oczekiwany widżet interfejsu za pomocą hierarchii interfejsu Androida.

Oto przykład działania skryptu Robo, które czeka maksymalnie 30 sekund na pojawienie się na ekranie widżetu interfejsu z identyfikatorem zasobu "my.app.package:id/confirmation_button":

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

Dalsze kroki