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 zapewnianiem jakości aplikacji mobilnych oraz umożliwiają stosowanie strategii ciągłej integracji i testowania przed opublikowaniem. Skrypt Robo to plik JSON, który opisuje sekwencję działań w interfejsie i innych działań.

Skrypt Robo możesz utworzyć na te sposoby:

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

  • Utwórz skrypt Robo ręcznie. (Android i iOS+)

  • Nagraj skrypt Robo, a następnie zmodyfikuj 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 dostarczany do testu Robo wraz z innymi danymi wejściowymi, takimi jak Android Application Package (APK) testowanej aplikacji.

Poniżej znajduje się przykładowy skrypt Robo, który loguje użytkownika w aplikacji i jest uruchamiany po uruchomieniu testowanej aplikacji:

[
  {
    "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ę pojedynczy skrypt Robo i ma on domyślny warunek aktywacji app_under_test_shown, jak w przykładzie powyżej, możesz określić skrypt Robo w pliku, używając prostszego formatu – jako sekwencji 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 na iOS+

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

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

  • Asercja
  • Kliknij
  • Kliknięcie i przytrzymanie
  • Przesuń
  • Ignoruj wszystkie elementy
  • Czekaj
  • Zapisz zrzut ekranu
  • Zakończ indeksowanie

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

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

W iOS+ obsługiwane są te warunki aktywacji w deskryptorach kontekstu:

  • Wyświetlana jest testowana aplikacja
  • Element występuje
  • Wykonano działanie skryptu innego niż Robo

Struktura

Skrypt Robo ma kilka atrybutów, które opisują sposób jego wykonywania przez Robo. Większość z 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 id w różnych skryptach Robo nie wpływa na ich działanie, odróżnienie działań z tych skryptów Robo w wynikach indeksowania może być trudne. Aby uniknąć konfliktów, zalecamy przypisanie unikalnego elementu id o wartości 1000 lub wyższej do skryptów Robo.
description Podobne do id, ale bardziej opisowe.
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 Robo może wykonać ten skrypt Robo. Domyślnie Robo może wykonać skrypt Robo raz.
contextDescriptor Opisuje kontekst lub warunek, który aktywuje ten skrypt Robo. Jeśli go nie podasz, warunek aktywacji skryptu Robo będzie zawsze uznawany za spełniony. Innymi słowy, skrypt Robo będzie bezwarunkowy.
actions Wszystkie działania tego skryptu Robo.

Pojedynczy 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 pojedyncze 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 aktywuje skrypt Robo, używając co najmniej jednego z tych atrybutów:

Atrybut Opis
"condition": "always" Zawsze uruchamia skrypt Robo.
"condition": "element_present" Sprawdza, czy na ekranie jest widżet interfejsu pasujący do elementDescriptors lub tekstu określonego przez visionText.
"condition": "element_disabled" Sprawdza, czy widżet interfejsu pasujący do elementDescriptors jest obecny na ekranie i nie można z nim wejść w interakcję.
"condition": "element_checked" Sprawdza, czy widżet interfejsu pasujący do elementDescriptors jest widoczny na ekranie i czy jest zaznaczony.
"condition": "app_under_test_shown" Sprawdza, czy testowana aplikacja działa 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 ustawiono 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 1 deskryptor elementu, który identyfikuje widżet interfejsu na ekranie. Jest używany w połączeniu z warunkami element_present, element_disabled i element_checked. Tej opcji nie można używać razem z opcją visionText. Więcej informacji znajdziesz w sekcji Deskryptory elementów.
visionText Tekst na ekranie jest wykrywany za pomocą interfejsu API optycznego rozpoznawania znaków (OCR). visionText jest używany w połączeniu z warunkiem element_present. Tej opcji nie można używać razem z opcją elementDescriptors.
nonRoboscriptActionCount Liczba kolejnych działań skryptu innego niż Robo wykonanych wcześniej. Jest używany w połączeniu z warunkiem non_roboscript_action_performed, aby uruchamiać skrypt Robo po każdych nonRoboscriptActionCount działaniach Robo. Domyślnie jest to 1.

Poniżej znajdziesz przykład skryptu Robo, który jest uruchamiany, gdy na ekranie pojawia się widżet interfejsu o identyfikatorze zasobu "my.app.package:id/page_header":

{
  "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 aktywowany przez element "Privacy Policy" wykryty 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"
    }
  ]
}

Poniżej znajdziesz przykład skryptu Robo, który czeka 5 sekund po każdym działaniu Robo, które nie jest skryptem:

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

Działania

Każde działanie w skrypcie Robo jest reprezentowane jako pakiet składający się z co najmniej 1 pary atrybut–wartość, które opisano 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. Wymagany w przypadku wszystkich działań, które mają docelowy widżet interfejsu, np. kliknięcie określonego przycisku.
optional Jeśli ustawisz wartość true, to działanie zostanie pominięte, gdy nie będzie można go wykonać. Na przykład to działanie jest pomijane, gdy nie może znaleźć docelowego widżetu interfejsu na ekranie, ale nie powoduje to błędu skryptu Robo. Wartość domyślna to false.
replacementText Tekst do wpisania w docelowym widżecie interfejsu. 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. Wymagane w przypadku działań oczekiwania.
pointTapXCoordinate i pointTapYCoordinate Współrzędne X i Y piksela w miejscu dotknięcia. Wyklucza się wzajemnie z pointTapXPercent i pointTapYPercent. Wymagane w przypadku działań polegających na kliknięciu punktu.
pointTapXPercent i pointTapYPercent Współrzędne procentowe X i Y klikniętego punktu. Wyklucza się wzajemnie z pointTapXCoordinate i pointTapYCoordinate. Wymagane w przypadku działań polegających na kliknięciu 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:

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 Java pasujące do resourceId.
contentDescription –
contentDescriptionRegex Wyrażenie regularne Java pasujące do contentDescription.
text (który pojawia się na ekranie) –
textRegex Wyrażenie regularne Java pasujące do text.
groupViewChildPosition, recyclerViewChildPosition lub adapterViewChildPosition Reprezentuje pozycję elementu podrzędnego widżetu interfejsu użytkownika w zależności od rodzaju jego 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óżnianie elementów listy jest zwykle możliwe tylko przez użycie ich różnych pozycji podrzędnych w widżecie nadrzędnym. Oznacza to, że użycie tylko jednego deskryptora elementu do zidentyfikowania widżetu interfejsu jest zwykle niewystarczające. Dlatego atrybut elementDescriptors działania zawiera sekwencję deskryptorów elementów uporządkowanych w taki sposób, że pierwszy odpowiada docelowemu widżetowi interfejsu, drugi – widżetowi nadrzędnemu docelowego widżetu interfejsu itd. Docelowy widżet interfejsu działania jest dopasowywany, gdy wszystkie jego deskryptory elementów pasują do odpowiedniej podhierarchii widżetu interfejsu.

Poniżej znajdziesz przykład skryptu Robo z działaniami polegającymi na zmianie tekstu i kliknięciu. 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

Możesz opcjonalnie poprzedzić listę działań w skrypcie Robo obiektem JSON, który określa opcje wykonywania tego skryptu. Ten nagłówek konfiguracji zaczyna się od słowa kluczowego roboscript, po którym następuje reprezentacja JSON żądanych opcji wykonywania.

Skrypty Robo obsługują te opcje wykonywania:

  • executionMode – opcje wykonywania stosowane podczas działania skryptu Robo:
    • strict – jeśli ustawisz wartość true, skrypt Robo nie będzie używać dopasowania częściowego, pomijania bieżącego działania ani zawieszania. Oznacza to, że skrypt Robo jest wykonywany jako zwykły test z instrumentacją i kończy się niepowodzeniem, gdy tylko nie uda się wykonać któregoś z działań. Domyślnie jest to false.
    • dismiss_popups – jeśli ustawisz wartość true, test Robo będzie odrzucać wszystkie nieoczekiwane okna podczas wykonywania skryptu Robo, nawet w trybie strict. Ta opcja nie działa, gdy nie jesteś w trybie 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 wykonywania. Domyślna wartość to true.
  • postscript – opcje wykonywania stosowane 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 wykonywanego w trybie strict bez powiadomień na ekranie, który czeka 3 sekundy, po czym indeksowanie zostaje zatrzymane:

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

Parametry szablonu

Parametr szablonu to obiekt zastępczy w skrypcie Robo, który jest zastępowany rzeczywistą wartością, gdy test Robo wczytuje ten skrypt do wykonania. Parametry szablonu są poprzedzone podwójnym podkreśleniem i znakiem procentu, a na końcu mają znak procentu i podwójne podkreślenie.

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, które zaczynają się od # 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 nie zostaną wykonane (lub przynajmniej podjęte) wszystkie jego działania. Test Robo próbuje dopasować działanie skryptu Robo za każdym razem, gdy wybiera działanie do wykonania. Skrypt Robo wykorzystuje te techniki, aby zwiększyć niezawodność:

Technika Opis
Dopasowanie częściowe Jeśli nie można w pełni dopasować bieżącego działania skryptu Robo, kryteria dopasowania są rozluźniane i dopasowanie jest ponawiane. Dopasowanie częściowe nie uwzględnia deskryptora najbardziej zewnętrznego elementu podczas dopasowywania docelowego widżetu interfejsu działania skryptu Robo.

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

Pomiń bieżące działanie Jeśli nie można w pełni lub częściowo dopasować bieżącego działania skryptu Robo, Robo próbuje dopasować kolejne działanie skryptu Robo. Jeśli kolejne działanie jest w pełni lub częściowo zgodne, test Robo pomija bieżące działanie skryptu Robo (i nigdy do niego nie wraca) i wykonuje kolejne.

Ta technika obsługuje scenariusze, w których zachowanie aplikacji zmienia się między wersjami lub jest niestabilne, np. gdy podczas nagrywania lub odtwarzania skryptu Robo na różnych ekranach może pojawiać się okno dialogowe.

Zawieś Jeśli nie można w pełni lub częściowo dopasować ani bieżących, ani kolejnych działań skryptu Robo, skrypt Robo jest tymczasowo zawieszany, a test Robo wybiera działanie do wykonania przy użyciu innych strategii. Po zakończeniu tego działania test Robo wznawia wykonywanie skryptu Robo.

Dopóki nie można dopasować bieżących lub kolejnych działań skryptu Robo, skrypt Robo pozostaje zawieszony w przypadku dowolnej liczby działań. Dlatego skrypty Robo nie muszą być prologiem testu Robo, a działania skryptu Robo można przeplatać ze standardowymi działaniami testu Robo. Ta technika obsługuje scenariusze, w których zachowanie aplikacji jest niestabilne lub 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 już mógł zostać uruchomiony podczas danego indeksowania. Jeśli w bieżącym kontekście można uruchomić więcej niż 1 skrypt Robo, priorytet jest określany przez wybranie w następującej kolejności skryptu Robo, który:

  1. ma atrybut contextDescriptor,
  2. ma najwyższy priority (domyślnie wszystkie skrypty Robo mają ten sam priority wykonania wynoszący 1).
  3. Pojawia się najwcześniej na liście skryptów Robo, jeśli priorytety skryptów Robo są takie same.

Poniżej znajduje się przykład pliku z 3 skryptami Robo, które wykonują to samo działanie i są wywoływane przez ten sam warunek – testowana aplikacja 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 działa na pierwszym planie, Robo uruchamia kolejno:

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

Powtarzane uruchomienia

Domyślnie Robo uruchamia skrypt Robo maksymalnie raz podczas indeksowania. Można to zmienić za pomocą atrybutu maxNumberOfRuns.

Oto przykład skryptu Robo, który przenosi testowaną aplikację do tła 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 danego indeksowania Robo:

Etap indeksowania Opis
pre_crawl Zanim Robo uruchomi i zacznie indeksować testowaną aplikację.
post_crawl Po zakończeniu indeksowania testowanej aplikacji przez Robo. Skrypt Robo post_crawl nie może przekraczać 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ć z danego ekranu (śledzenie wsteczne), gdy wszystkie możliwe działania na tym ekranie zostały już sprawdzone; 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 jest to crawl.

Poniżej znajduje się 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 znajduje się przykładowy skrypt Robo, który instruuje Robo, aby kliknął "Cancel", gdy próbuje wrócić z okna 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ą, jak Robo je wykonuje:

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

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

Poniżej znajduje się przykład bezwarunkowego skryptu Robo z działaniem warunkowym, które zamyka wyskakujące okienka, jeśli pojawią się w dowolnym momencie 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, które nakazują Robo ignorowanie określonych widżetów interfejsu lub wszystkich widżetów interfejsu na danym ekranie. Te instrukcje są reprezentowane jako ignorowanie „działań” odpowiednio za pomocą eventType ELEMENT_IGNORED i ALL_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, które są celem działań ignorowania (chyba że inne działanie skryptu Robo sprawi, że Robo wykona działanie na jednym z ignorowanych widżetów interfejsu).

Skrypt Robo może zawierać kombinację działań ignorowanych, warunkowych i bezwarunkowych. W przeciwieństwie do innych działań skryptu Robo działania ignorowania są stosowane, dopóki contextDescriptor skryptu Robo, który je zawiera, pasuje do ekranu podczas indeksowania przez Robo, niezależnie od wartości atrybutów priority i maxNumberOfRuns.

Poniżej znajdziesz przykład pliku z 2 skryptami Robo. Pierwszy skrypt Robo sprawia, że Robo ignoruje wszystkie widżety interfejsu na ekranie zawierającym widżet interfejsu o identyfikatorze 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 Javy ".*:id/done" na ekranie zawierającym widżet interfejsu z identyfikatorem 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 RecyclerView i AdapterView

Elementy podrzędne widżetów RecyclerView i AdapterView są ładowane dynamicznie i mogą być wyświetlane po wielu przesunięciach od bieżącego ekranu. Ponieważ rozmiar ekranu i liczba przesunięć wymaganych do dotarcia do tego elementu podrzędnego różnią się w zależności od formatu urządzenia, znacznie lepiej jest polegać na pozycji danych elementu podrzędnego, która jest bezwzględna. Mniej niezawodne jest poleganie na liczbie przesunięć wymaganych do wyświetlenia tego elementu podrzędnego na ekranie, a następnie użycie jego pozycji na ekranie.

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ą obiektami docelowymi działań skryptu Robo, jako adapterViewChildPosition.

Działania na elementach podrzędnych RecyclerView i AdapterView są wykonywane w tych krokach:

  1. Test Robo sprawdza, czy odpowiedni element podrzędny jest wyświetlany na ekranie, wykonując działanie pozycjonowania na zawierającym go elemencie RecyclerView lub AdapterView.

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

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

Nagrywanie skryptu Robo w Android Studio i uruchamianie go w Test Lab

Możesz utworzyć skrypt Robo w Android Studio, który zapisze skrypt jako plik JSON. Następnie możesz przesłać plik JSON do Firebase Test Lab wraz z aplikacją i przeprowadzić test.

Gdy uruchamiasz test Robo z dołączonym skryptem, test Robo najpierw wykonuje działania określone w skrypcie, a następnie sprawdza aplikację w zwykły sposób.

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

Działania skryptu Robo

Do wszystkich działań ma zastosowanie ten wspólny atrybut opcjonalny:

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

Asercja

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

W tabeli poniżej znajdziesz wymagane atrybuty:

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

Oto przykład asercji skryptu Robo, która sprawdza, czy testowana aplikacja działa 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 o identyfikatorze 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 "Settings" NIE jest wykrywany na ekranie za pomocą OCR:

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

Kliknij

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
eventType Określa typ działania skryptu Robo.
"eventType": "VIEW_CLICKED" klika element docelowy testowanej aplikacji;
"eventType": "SOFT_KEYBOARD_CLICK" klika element docelowy klawiatury ekranowej;
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Klika losowe elementy klawiatury ekranowej maksymalnie maxNumberOfRuns razy.
"eventType": "LIST_ITEM_CLICKED" Używane przez rejestrator skryptów Robo w Android Studio do klikania elementów listy.
elementDescriptors Identyfikuje kliknięty widżet interfejsu za pomocą hierarchii interfejsu Androida. Tej opcji nie można używać razem z opcją visionText.
visionText Identyfikuje kliknięty element za pomocą OCR. Tej opcji nie można używać razem z opcją elementDescriptors.
matchIndex Określa indeks wystąpienia dopasowanego elementu docelowego, gdy element docelowy jest identyfikowany za pomocą visionText. Jeśli jest to 0, działanie skryptu Robo wybiera pierwszy pasujący element, jeśli jest to 1, działanie skryptu 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 to SOFT_KEYBOARD_RANDOM_CLICK. Wartością domyślną jest 1.

Poniżej znajduje się przykład działania skryptu Robo, które klika przycisk o identyfikatorze zasobu "com.google.samples.apps.topeka:id/done":

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

Poniżej znajduje się 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
}

Poniżej znajdziesz 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"
    }
  ]
}

Poniżej znajdziesz przykład działania skryptu Robo, które klika losowe elementy klawiatury ekranowej maksymalnie 5 razy:

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

Wyłącz klawiaturę ekranową

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
"eventType": "DISABLE_KEYBOARD" --

Poniżej znajdziesz przykład działania skryptu Robo, które wyłącza klawiaturę ekranową:

{
  "eventType": "DISABLE_KEYBOARD"
}

Wykonaj polecenie powłoki adb

W tabeli poniżej znajdziesz wymagane atrybuty:

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 języku Java. 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.

Poniżej znajdziesz przykład działania skryptu Robo, które powoduje wyczyszczenie danych użytkownika testowanej aplikacji:

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

Przyznaj uprawnienia

To działanie jest rejestrowane przez rejestrator skryptów Robo w Android Studio, aby zapewnić zgodność wsteczną z Espresso Test Recorder. 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 wymagane atrybuty:

Atrybut Opis
"eventType": "PERMISSIONS_REQUEST" --

Ignorowanie wszystkich elementów na ekranie

To działanie sprawia, że Robo ignoruje wszystkie elementy na każdym ekranie, który aktywuje zawierający je skrypt Robo.

W tabeli poniżej znajdziesz wymagane atrybuty:

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

To działanie sprawia, że Robo ignoruje element (lub elementy) pasujące do określonego elementDescriptors.

W tabeli poniżej znajdziesz wymagane atrybuty:

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

Ten atrybut jest opcjonalny:

  • ignoreChildren – jeśli ustawisz wartość true, Robo będzie ignorować też wszystkie elementy podrzędne ignorowanych 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 treści zaczynają się od "Avatar":

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

Wprowadzany tekst

W tabeli poniżej znajdziesz wymagane atrybuty:

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

Poniżej znajduje się przykład działania skryptu Robo, które wprowadza "John" do widżetu interfejsu o identyfikatorze 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 wymagane atrybuty:

Atrybut Opis
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identyfikuje docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida. Wzajemnie wykluczające się z visionText.
visionText Identyfikuje element, który został kliknięty i przytrzymany, za pomocą OCR. Tej opcji nie można używać razem z opcją elementDescriptors.
matchIndex Określa indeks wystąpienia dopasowanego elementu docelowego, gdy element docelowy jest identyfikowany za pomocą visionText. Jeśli jest to 0, działanie skryptu Robo wybiera pierwszy pasujący element, jeśli jest to 1, działanie skryptu 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 długiego kliknięcia (w milisekundach).

Poniżej znajduje się przykład działania skryptu Robo, które wykonuje 5-sekundowe kliknięcie widżetu interfejsu z opisem treści "Avatar 8":

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

Wykonaj gest jednym punktem

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
"eventType": "ONE_POINT_GESTURE" --
coordinates 2 współrzędne gestu jednopunktowego w formacie „(x1,y1)->(x2,y2)” jako wartości procentowe lub piksele.

Ten atrybut jest opcjonalny:

  • dragAndDrop – jeśli ustawisz wartość true, gest jednym palcem będzie wykonywać działanie przeciągania i upuszczania. Domyślnie jest to false.

Oto przykład działania gestu jednopunktowego w skrypcie Robo, które powoduje przesunięcie palcem w dół:

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

Wykonaj gest dwoma palcami

W tabeli poniżej znajdziesz wymagane atrybuty:

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

Oto przykład działania skryptu Robo, które wykonuje gest rozciągania:

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

wykonywanie działań IME,

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

W tabeli poniżej znajdziesz wymagane atrybuty:

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

Poniżej znajduje się przykład działania skryptu Robo, które wykonuje działanie IME na widżecie interfejsu o identyfikatorze 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 przycisk Wstecz.

W tabeli poniżej znajdziesz wymagane atrybuty:

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

Oto przykład działania skryptu Robo, które polega na naciśnięciu przycisku Wstecz:

{
  "eventType": "PRESSED_BACK"
}

Naciśnij przycisk ekranu głównego

To działanie wysyła do urządzenia zdarzenie KEYCODE_HOME.

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
"eventType": "GO_HOME" --

Oto przykład działania skryptu Robo, które naciska przycisk ekranu głównego:

{
  "eventType": "GO_HOME"
}

Przewijanie elementu do widoku

To działanie powoduje, że test Robo przewija do przodu widżet interfejsu pasujący do określonego elementu elementDescriptors, dopóki widżet interfejsu pasujący do określonego elementu childElementDescriptors nie pojawi się na ekranie, dopóki nie będzie można już przewijać widżetu lub dopóki nie zostanie osiągnięta maksymalna liczba 50 przewinięć.

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identyfikuje przewijany widżet interfejsu za pomocą hierarchii interfejsu Androida.
childElementDescriptors Identyfikuje widżet interfejsu, do którego ma nastąpić przewinięcie, za pomocą hierarchii interfejsu Androida.

Oto przykład działania skryptu Robo, które przewija widżet interfejsu o identyfikatorze 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 nie zostanie osiągnięta maksymalna liczba 50 przewinięć):

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

Przesuń

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
"eventType": "VIEW_SWIPED" --
swipeDirection Określa kierunek przesunięcia:
  • Left
  • Right
  • Up
  • Down
  • Forward – Down lub Right w zależności od tego, czy docelowy widżet interfejsu można przewijać w pionie czy w poziomie.
  • Backward – Up lub Left w zależności od tego, czy docelowy widżet interfejsu można przewijać w pionie czy w poziomie.
elementDescriptors Identyfikuje docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida.

Poniżej znajduje się przykład działania skryptu Robo, które przesuwa w górę widżet interfejsu o identyfikatorze zasobu "my.app.package:id/custom_content":

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

Zapisz zrzut ekranu

W tabeli poniżej znajdziesz wymagane atrybuty:

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

Oto przykład działania skryptu Robo, które powoduje zrobienie zrzutu ekranu:

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

Kliknij punkt na ekranie.

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
"eventType": "POINT_TAP" --
pointTapXCoordinate Współrzędna X piksela w miejscu dotknięcia. Wyklucza się wzajemnie z pointTapXPercent i pointTapYPercent.
pointTapYCoordinate Współrzędna Y piksela w miejscu dotknięcia. Wyklucza się wzajemnie z pointTapXPercent i pointTapYPercent.
pointTapXPercent Współrzędna X punktu dotknięcia wyrażona w procentach. Wyklucza się wzajemnie z pointTapXCoordinate i pointTapYCoordinate.
pointTapYPercent Współrzędna Y dotkniętego punktu wyrażona w procentach. Wyklucza się wzajemnie z pointTapXCoordinate i pointTapYCoordinate.

Oto przykład działania skryptu Robo, które klika środek ekranu:

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

Kliknij punkt w obrębie elementu.

W tabeli poniżej znajdziesz wymagane atrybuty:

Atrybut Opis
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent Współrzędna X w procentach w elemencie docelowym.
pointTapYPercent Współrzędna Y w procentach w elemencie docelowym.
elementDescriptors Identyfikuje docelowy widżet interfejsu za pomocą hierarchii interfejsu Androida.

Poniżej znajduje się 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 indeksowanie

To działanie spowoduje zatrzymanie testu Robo.

W tabeli poniżej znajdziesz wymagane atrybuty:

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 wymagane atrybuty:

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

Oto przykład działania testu 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 wymagane atrybuty:

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

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

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

Dalsze kroki