Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Przewodnik po skryptach Robo

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Ten dokument zawiera informacje referencyjne o skryptach Robo, w tym strukturę, możliwości, użycie, nagrywanie i akcje. Skrypty Robo to testy, które automatyzują zadania ręcznego zapewniania jakości (QA) dla aplikacji mobilnych i umożliwiają ciągłą integrację (CI) oraz strategie testowania przed uruchomieniem. Skrypt Robo to plik JSON, który opisuje sekwencję interfejsu użytkownika (UI) i innych działań.

Skrypt Robo możesz utworzyć w następujący sposób:

  • Użyj funkcji nagrywania skryptów Robo.
  • Utwórz skrypt Robo ręcznie.
  • Nagraj skrypt Robo, a następnie edytuj go ręcznie.

Aby dowiedzieć się więcej o korzystaniu ze skryptów Robo, zobacz Uruchamianie skryptu Robo .

Skrypt Robo jest dostarczany do Robo test wraz z innymi danymi wejściowymi, takimi jak testowana aplikacja Android Application Package (APK).

Poniżej znajduje się przykład skryptu Robo, który loguje użytkownika do aplikacji:

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

Struktura

Każda akcja w skrypcie Robo jest reprezentowana jako pakiet co najmniej jednej pary atrybut-wartość, które opisano w poniższej tabeli:

Atrybut Opis
eventType Określa typ akcji, na przykład kliknięcie, edycja tekstu itp. Wymagane dla każdej akcji.
elementDescriptors Deskryptory identyfikujące widżet interfejsu użytkownika. Wymagane w przypadku wszystkich działań, które mają docelowy widżet interfejsu użytkownika, takich jak kliknięcie określonego przycisku.
optional Jeśli jest ustawiona na true , ta akcja jest pomijana, gdy nie można jej wykonać. Na przykład ta akcja jest pomijana, gdy nie może znaleźć docelowego widżetu interfejsu użytkownika na ekranie – bez niepowodzenia zawierającego skrypt Robo. Domyślna wartość to false .
replacementText Tekst do wprowadzenia do docelowego widżetu interfejsu użytkownika. Wymagane do działań związanych z edycją tekstu.
swipeDirection Określa kierunek przeciągnięcia. Wymagane w przypadku operacji przesuwania.
delayTime Określa czas oczekiwania w milisekundach. Wymagane w przypadku akcji oczekiwania.
pointTapXCoordinate i pointTapYCoordinate Współrzędne X i Y w pikselach punktu zaczepienia. Wzajemnie wykluczające się z pointTapXPercent i pointTapYPercent . Wymagane w przypadku działań typu point tap.
pointTapXPercent i pointTapYPercent Procentowe współrzędne X i Y punktu zaczepionego. Wzajemnie wykluczające się z pointTapXCoordinate i pointTapYCoordinate . Wymagane w przypadku działań typu point tap.

Poniżej znajduje się przykład skryptu Robo z dwoma akcjami bez docelowych widżetów interfejsu użytkownika, co oznacza, że ​​te akcje nie działają na konkretnym widżecie interfejsu użytkownika:

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

Deskryptory elementów

Deskryptor elementu identyfikuje widżet interfejsu użytkownika za pomocą co najmniej jednego z następujących atrybutów identyfikujących:

Atrybut Opis
className
ancestorClassName Nazwa klasy przodka hierarchii interfejsu użytkownika elementu. Przodkiem jest dowolny z węzłów nadrzędnych w hierarchii interfejsu użytkownika elementu, w tym sam element.
resourceId
resourceIdRegex Wyrażenie regularne Java zgodne z identyfikatorem resourceId .
contentDescription
contentDescriptionRegex Wyrażenie regularne Java zgodne z contentDescription .
text (który pojawia się na ekranie)
textRegex Wyrażenie regularne Java do dopasowania text .
groupViewChildPosition , recyclerViewChildPosition lub adapterViewChildPosition Reprezentuje pozycję podrzędną widżetu interfejsu użytkownika w zależności od rodzaju jego widżetu nadrzędnego.

Często te atrybuty są niezdefiniowane, na przykład przycisk może nie mieć tekstu i opisu zawartości. Nawet jeśli niektóre wartości atrybutów są obecne, mogą nie być unikatowe na ekranie danej aplikacji (w tym resourceId ).

Na przykład rozróżnianie elementów listy jest zwykle możliwe tylko przy użyciu ich różnych pozycji podrzędnych w widżecie nadrzędnym. Oznacza to, że użycie tylko jednego deskryptora elementu do identyfikacji widżetu interfejsu użytkownika jest zwykle niewystarczające. Dlatego atrybut elementDescriptors akcji zawiera sekwencję deskryptorów elementów, które są uporządkowane w taki sposób, że pierwszy z nich odpowiada docelowemu widżetowi interfejsu użytkownika, drugi odpowiada nadrzędnemu widżetowi docelowego widżetu interfejsu użytkownika i tak dalej. Docelowy widżet interfejsu użytkownika akcji jest dopasowywany, gdy wszystkie jego deskryptory elementów są zgodne z odpowiednią podhierarchią widżetu interfejsu użytkownika.

Poniżej znajduje się przykład skryptu Robo z akcjami zmiany tekstu i kliknięcia, które wymagają zidentyfikowania docelowego widżetu interfejsu użytkownika za pomocą dostarczonych 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żna poprzedzić listę akcji w skrypcie Robo obiektem JSON, który określa opcje wykonania dla tego skryptu Robo. 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ą następujące opcje wykonania:

  • executionMode - opcje wykonania stosowane podczas działania skryptu Robo:
  • postscript - opcje wykonania stosowane po zakończeniu skryptu Robo:
    • terminate — jeśli ustawiono na true , test Robo zatrzymuje indeksowanie po zakończeniu skryptu Robo.

Poniżej znajduje się przykład skryptu Robo wykonywanego w trybie strict , który śpi przez trzy sekundy, po czym indeksowanie zostaje zatrzymane:

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

Parametry szablonu

Parametr szablonu to symbol zastępczy w skrypcie Robo, który jest zastępowany rzeczywistą wartością, gdy test Robo ładuje skrypt Robo do wykonania. Parametry szablonu są poprzedzone podwójnym podkreśleniem, po którym następuje znak procentu i są poprzedzone znakiem procentu, po którym następuje podwójne podkreślenie.

Skrypty Robo obsługują następujący parametr szablonu:

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

Poniżej znajduje się przykład skryptu Robo, który zatrzymuje proces testowanej aplikacji:

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

Uwagi

Skrypt Robo może zawierać wiersze komentarza, które zaczynają się od # lub // .

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

Możliwości

Domyślnie, dopóki wszystkie działania skryptu Robo nie zostaną zakończone (lub przynajmniej podjęte), skrypt Robo pozostaje aktywny. Test Robo nieustannie próbuje dopasować akcję skryptu Robo za każdym razem, gdy wybiera akcję do wykonania. Skrypt Robo wykorzystuje następujące techniki w celu zwiększenia odporności:

Technika Opis
Częściowe dopasowanie Jeśli bieżąca akcja skryptu Robo nie może być w pełni dopasowana, kryteria dopasowania zostają złagodzone, a dopasowanie jest ponawiane. Częściowe dopasowanie nie uwzględnia najbardziej zewnętrznego deskryptora elementu podczas dopasowywania docelowego widżetu interfejsu użytkownika akcji skryptu Robo.

Jeśli częściowe dopasowanie się powiedzie, odpowiednia akcja skryptu Robo jest wykonywana jak zwykle. Ta technika obsługuje scenariusze, w których struktura aplikacji zmienia się, na przykład między wersjami aplikacji, gdy elementy ekranu są zmieniane.

Pomiń bieżącą akcję Jeśli bieżąca akcja skryptu Robo nie może być w pełni lub częściowo dopasowana, Robo próbuje dopasować kolejną akcję skryptu Robo. Jeśli kolejna akcja w pełni lub częściowo pasuje, test Robo pomija (i nigdy nie powraca) bieżącą akcję skryptu Robo i wykonuje kolejną.

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

Zawieszać Jeśli ani bieżące, ani kolejne działania skryptu Robo nie mogą być w pełni lub częściowo dopasowane, skrypt Robo jest tymczasowo zawieszony, a test Robo wybiera akcję do wykonania przy użyciu innych strategii. Po zakończeniu tej akcji Robo test wznawia wykonywanie skryptu Robo.

Dopóki nie można dopasować bieżących lub kolejnych akcji skryptu Robo, skrypt Robo pozostaje zawieszony na dowolną liczbę akcji. Tak więc skrypty Robo niekoniecznie muszą być prologiem do testu Robo i można przeplatać akcje skryptu Robo ze standardowymi akcjami testu Robo. Ta technika obsługuje scenariusze, w których zachowanie aplikacji jest niestabilne lub gdy zmiany między wersjami aplikacji są na tyle duże, że test Robo musi „wypełnić luki” standardowymi akcjami.

Obsługa RecyclerView i AdapterView

Elementy podrzędne widżetów RecyclerView i AdapterView są ładowane dynamicznie i mogą być wyświetlane w wielu przesunięciach od bieżącego ekranu. Ponieważ rozmiar ekranu i liczba przesunięć wymaganych, aby dotrzeć do tego dziecka, są różne dla różnych typów urządzenia, znacznie bardziej niezawodne jest poleganie na pozycji danych dziecka, która jest bezwzględna. Mniej solidnym podejściem jest poleganie na liczbie przesunięć, które są wymagane, aby przenieść to dziecko na ekran, a następnie użyć jego pozycji na ekranie.

Dlatego skrypt Robo przechwytuje bezwzględne pozycje danych obiektów podrzędnych RecyclerView, które są celami akcji skryptu Robo, jako recyclerViewChildPosition . Skrypt Robo przechwytuje również pozycje danych bezwzględnych obiektów podrzędnych AdapterView, które są celami działań skryptu Robo, jako adapterViewChildPosition .

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

  1. Test Robo zapewnia, że ​​odpowiedni element podrzędny jest wyświetlany na ekranie poprzez akcję pozycjonowania na zawierającym go RecyclerView lub AdapterView.

  2. Test robota wykonuje nagraną akcję bezpośrednio na elemencie podrzędnym, ponieważ jest on już wyświetlany na ekranie.

Poniżej znajduje się przykład akcji kliknięcia na 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
    }
  ]
}

Poniżej znajduje się przykład akcji kliknięcia na obiekcie podrzędnym 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
    }
  ]
}

Nagraj skrypt Robo w Android Studio i uruchom go w laboratorium testowym

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 z aplikacją i odpowiednio uruchomić test.

Gdy uruchamiasz test Robo z dołączonym skryptem, Robo najpierw testuje kroki przez wstępnie zaprogramowane działania, a następnie eksploruje aplikację w zwykły sposób.

Aby utworzyć plik JSON skryptu Robo w Android Studio, wykonaj czynności opisane w sekcji Rejestrowanie skryptu Robo przy użyciu Test Lab w Android Studio .

Akcje skryptu Robo

Poniższy wspólny atrybut opcjonalny ma zastosowanie do wszystkich działań:

  • description - pomaga śledzić wykonanie tej akcji skryptu Robo w wynikach testów Robo.

Twierdzenie

Jeśli potwierdzony warunek jest prawdziwy, skrypt Robo przechodzi do następnej akcji, która może być kolejną asercją. W przeciwnym razie wykonanie skryptu Robo zostanie zatrzymane z powodu nieudanej asercji, a wynik testu to NIEPOWODZENIE.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "ASSERTION" --
contextDescriptor Opisuje potwierdzony kontekst lub warunek.

Deskryptor kontekstu

Deskryptor kontekstu definiuje kontekst/warunek za pomocą jednego lub kombinacji następujących atrybutów:

Atrybut Opis
"condition": "element_present" Sprawdza, czy na ekranie znajduje się widżet interfejsu użytkownika zgodny elementDescriptors lub tekstem określonym przez visionText .
"condition": "element_disabled" Sprawdza, czy widżet interfejsu użytkownika zgodny elementDescriptors jest obecny na ekranie i nie można z nim wchodzić w interakcję.
"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 ​​na pierwszym planie nie działają żadne aplikacje.
"condition": "non_roboscript_action_performed" Sprawdza, czy ostatnia akcja wykonywana przez test Robo nie jest akcją skryptu Robo.
negateCondition Jeśli ustawione na true , neguje condition . Na przykład możesz użyć tego atrybutu, aby sprawdzić, czy widżet interfejsu użytkownika NIE jest obecny na ekranie lub czy testowana aplikacja NIE jest uruchomiona na pierwszym planie.
elementDescriptors Jeden lub więcej deskryptorów elementów, które identyfikują widżet interfejsu użytkownika na ekranie. Jest używany w połączeniu z warunkami element_present i element_disabled . Wzajemnie wykluczające się z visionText . Aby uzyskać więcej informacji, zobacz Deskryptory elementów .
visionText Tekst na ekranie jest wykrywany za pomocą interfejsu API do optycznego rozpoznawania znaków (OCR). visionText jest używany w połączeniu z warunkiem element_present . Wzajemnie wykluczające się z elementDescriptors .

Poniżej znajduje się 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 znajduje się przykład asercji skryptu Robo, która sprawdza, czy na ekranie znajduje się widżet interfejsu użytkownika 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 znajduje się przykład asercji skryptu Robo, która sprawdza, czy "Settings" NIE są wykrywane na ekranie za pomocą OCR:

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

Kliknij

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
eventType Określa typ akcji skryptu Robo.
"eventType": "VIEW_CLICKED" Klika element docelowy testowanej aplikacji.
"eventType": "SOFT_KEYBOARD_CLICK" Klika docelowy element klawiatury programowej.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Klika losowe elementy miękkiej klawiatury do maxNumberOfRuns razy.
"eventType": "LIST_ITEM_CLICKED" Używany przez rejestrator skryptów Robo w Android Studio do klikania elementów listy.
elementDescriptors Identyfikuje kliknięty widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android. Wzajemnie wykluczające się z visionText .
visionText Identyfikuje kliknięty element za pomocą OCR. Wzajemnie wykluczające się z elementDescriptors .
maxNumberOfRuns Określa, ile razy należy kliknąć losowy element klawiatury programowej, gdy SOFT_KEYBOARD_RANDOM_CLICK eventType Wartość domyślna to 1 .

Poniżej znajduje się przykład akcji skryptu Robo, która 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 akcji skryptu Robo, która klika "Privacy Policy" wykrytą na ekranie za pomocą OCR:

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

Poniżej znajduje się przykład akcji skryptu Robo, która klika element klawiatury programowej z opisem treści "Emoji button" :

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

Poniżej znajduje się przykład akcji skryptu Robo, która klika losowe elementy klawiatury miękkiej do pięciu razy:

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

Wyłącz klawiaturę programową

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "DISABLE_KEYBOARD" --

Poniżej znajduje się przykład akcji skryptu Robo, która wyłącza klawiaturę programową:

{
  "eventType": "DISABLE_KEYBOARD"
}

Wykonaj polecenie powłoki adb

W poniższej tabeli wymieniono wymagane atrybuty:

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

Poniżej znajduje się przykład akcji skryptu Robo, która czyści dane użytkownika testowanej aplikacji:

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

Udziel uprawnień

Ta czynność jest rejestrowana przez rejestrator skryptów Robo w Android Studio w celu zapewnienia wstecznej kompatybilności z Espresso Test Recorder . Test Robo przyznaje wszystkie uprawnienia do testowanej aplikacji na początku każdego indeksowania, a zatem ta akcja jest zakazem operacji. NIE używaj tej akcji w swoich skryptach Robo.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "PERMISSIONS_REQUEST" --

Wprowadź tekst

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
eventType Określa typ akcji skryptu Robo.
"eventType": "VIEW_TEXT_CHANGED" Wprowadza podany tekst do docelowego widżetu interfejsu użytkownika.
"eventType": "ENTER_TEXT" wprowadza podany tekst do docelowego widżetu interfejsu użytkownika, a następnie wysyła zdarzenie KEYCODE_ENTER do tego widżetu interfejsu użytkownika.
elementDescriptors Identyfikuje docelowy widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.
replacementText Tekst do wprowadzenia do docelowego widżetu interfejsu użytkownika.

Poniżej znajduje się przykład akcji skryptu Robo, która wprowadza "John" do widżetu interfejsu użytkownika 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"
    }
  ]
}

Długie kliknięcie

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identyfikuje docelowy widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.

Poniższy atrybut jest opcjonalny:

  • delayTime — określa, jak długo powinno trwać naciśnięcie długiego kliknięcia (w milisekundach).

Poniżej znajduje się przykład akcji skryptu Robo, która wykonuje pięciosekundowe kliknięcie widżetu interfejsu użytkownika z opisem zawartości "Avatar 8" :

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

Wykonaj jednopunktowy gest

W poniższej tabeli wymieniono wymagane atrybuty:

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

Poniższy atrybut jest opcjonalny:

  • dragAndDrop — jeśli jest ustawiona na true , gest jednopunktowy wykonuje akcję przeciągania i upuszczania. Domyślnie jest to false .

Poniżej znajduje się przykład jednopunktowej akcji gestu skryptu Robo, która wykonuje przesunięcie w dół:

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

Wykonaj dwupunktowy gest

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "TWO_POINT_GESTURE" --
coordinates Cztery współrzędne dla gestu dwupunktowego, sformatowane jako "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" jako procenty lub piksele.

Poniżej znajduje się przykład akcji skryptu Robo, która wykonuje gest uszczypnięcia:

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

Wykonaj działanie edytora IME

Ta akcja naciska przycisk bieżącej akcji, na przykład next, done i search w edytorze Input Method Editor (IME) dla określonego docelowego widżetu interfejsu użytkownika.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Identyfikuje docelowy widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.

Poniżej znajduje się przykład akcji skryptu Robo, która wykonuje akcję IME na widżecie interfejsu użytkownika 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 wstecz

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
eventType Określa typ akcji skryptu Robo.
"eventType": "PRESSED_BACK" Wysyła zdarzenie KEYCODE_BACK do urządzenia.
"eventType": "PRESSED_BACK_EMULATOR_28" Używany przez rejestrator skryptów Robo w Android Studio do ponownego naciskania emulatorów API 28.

Poniżej znajduje się przykład akcji skryptu Robo, która naciska wstecz:

{
  "eventType": "PRESSED_BACK"
}

Naciśnij home

Ta czynność powoduje wysłanie zdarzenia KEYCODE_HOME na urządzenie.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "GO_HOME" --

Poniżej znajduje się przykład akcji skryptu Robo, która naciska na home:

{
  "eventType": "GO_HOME"
}

Przewiń element do widoku

Ta akcja powoduje, że test Robo przewija do przodu widżet interfejsu użytkownika, który pasuje do określonych elementówDescriptors, do momentu childElementDescriptors się na ekranie widżetu interfejsu użytkownika, który pasuje do określonego elementDescriptors , lub przewinięcia widżetu nie można już przewijać lub gdy zostanie osiągnięta maksymalna liczba 50 przewijań.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identyfikuje przewijany widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.
childElementDescriptors Identyfikuje widżet interfejsu użytkownika do przewijania przy użyciu hierarchii interfejsu użytkownika systemu Android.

Poniżej znajduje się przykład akcji skryptu Robo, która przewija widżet interfejsu użytkownika z identyfikatorem zasobu "my.app.package:id/scrollable_card_container" do momentu pojawienia się na ekranie widżetu interfejsu użytkownika z tekstem "Orange" (lub nie będzie już wykonać lub osiągnięto maksymalną liczbę 50 zwojów):

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

Trzepnąć

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "VIEW_SWIPED" --
swipeDirection Określa kierunek przesunięcia:
  • Left
  • Right
  • Up
  • Down
  • Do Forward — w Down lub w Right w zależności od przewijalności w pionie lub poziomie docelowego widżetu interfejsu użytkownika.
  • Backward — w Up lub w Left w zależności od przewijalności w pionie lub poziomie docelowego widżetu interfejsu użytkownika.
elementDescriptors Identyfikuje docelowy widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.

Poniżej znajduje się przykład akcji skryptu Robo, która przesuwa w górę widżet interfejsu użytkownika z identyfikatorem zasobu "my.app.package:id/custom_content" :

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

Zrobić zrzut ekranu

W poniższej tabeli wymieniono wymagane atrybuty:

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

Poniżej znajduje się przykład akcji skryptu Robo, która wykonuje zrzut ekranu:

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

Dotknij punktu na ekranie

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "POINT_TAP" --
pointTapXCoordinate Współrzędna X w pikselach punktu stukanego. Wzajemnie wykluczające się z pointTapXPercent i pointTapYPercent .
pointTapYCoordinate Współrzędna Y w pikselach punktu stukanego. Wzajemnie wykluczające się z pointTapXPercent i pointTapYPercent .
pointTapXPercent Procentowa współrzędna X punktu zaczepionego. Wzajemnie wykluczające się z pointTapXCoordinate i pointTapYCoordinate .
pointTapYPercent Procentowa współrzędna Y punktu zaczepienia. Wzajemnie wykluczające się z pointTapXCoordinate i pointTapYCoordinate .

Poniżej znajduje się przykład akcji skryptu Robo, która dotyka środka ekranu:

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

Stuknij punkt w elemencie

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent Procentowa współrzędna X w elemencie docelowym.
pointTapYPercent Procentowa współrzędna Y w elemencie docelowym.
elementDescriptors Identyfikuje docelowy widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.

Poniżej znajduje się przykład akcji skryptu Robo, która przesuwa suwak paska wyszukiwania w prawo:

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

Zakończ indeksowanie

Ta czynność zatrzymuje test Robo.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "TERMINATE_CRAWL" --

Poniżej znajduje się przykład akcji skryptu Robo, która zatrzymuje test Robo:

{
  "eventType": "TERMINATE_CRAWL"
}

Czekać

W poniższej tabeli wymieniono wymagane atrybuty:

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

Poniżej znajduje się przykład akcji skryptu Robo, która czeka przez trzy sekundy:

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

Poczekaj na element

Ta akcja powoduje, że test Robo czeka na pojawienie się elementu na ekranie do określonego czasu.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Określa limit czasu oczekiwania w milisekundach.
elementDescriptors Identyfikuje oczekiwany widżet interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.

Poniżej znajduje się przykład akcji skryptu Robo, która czeka do 30 sekund na pojawienie się na ekranie widżetu interfejsu użytkownika z identyfikatorem zasobu "my.app.package:id/confirmation_button" :

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

Następne kroki