Przewodnik po skryptach Robo

Ten dokument zawiera informacje referencyjne na temat skryptów Robo, w tym strukturę, możliwości, użycie, nagrywanie i działania. 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 opisujący sekwencję interfejsu użytkownika (UI) i innych działań.

Skrypt Robo możesz utworzyć na następujące sposoby:

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

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

  • Nagraj skrypt Robo, a następnie edytuj go ręcznie. (tylko na Androidzie)

Aby dowiedzieć się więcej na temat używania skryptów Robo, zobacz Uruchamianie skryptu Robo .

Wstęp

Skrypt Robo jest dostarczany do testu Robo wraz z innymi danymi wejściowymi, takimi jak testowany pakiet aplikacji dla systemu Android (APK).

Poniżej znajduje się przykład skryptu Robo, który loguje użytkownika do 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 wyzwalający app_under_test_shown , jak w powyższym przykładzie, to możesz określić skrypt Robo w pliku, używając prostszego formatu - po prostu jako sekwencję jego 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 iOS+ dla skryptów Robo

Robo dla iOS+ (Beta) ma ograniczoną obsługę skryptów Robo. Składnia skryptu Robo dla systemu iOS+ jest identyczna ze składnią systemu Android, a obsługiwane funkcje systemu iOS+ zachowują się podobnie do ich odpowiedników w systemie Android.

W systemie iOS+ obsługiwane są następujące działania:

  • Twierdzenie
  • Kliknij
  • Długie kliknięcie
  • Trzepnąć
  • Ignoruj ​​wszystkie elementy
  • Czekać
  • Zrobić zrzut ekranu
  • Zakończ indeksowanie

W systemie iOS+ obsługiwane są następujące atrybuty identyfikujące w deskryptorach elementów:

  • Nazwa klasy
  • Nazwa klasy nadrzędnej
  • Opis treści (i wyrażenie regularne)
  • Tekst (i wyrażenie regularne)

W systemie iOS+ obsługiwane są następujące warunki wyzwalania w deskryptorach kontekstu :

  • Pokazano testowaną aplikację
  • Element obecny
  • Wykonano działanie skryptu inne niż Robo

Struktura

Skrypt Robo ma kilka atrybutów opisujących sposób, w jaki Robo go wykonuje. Większość tych atrybutów jest opcjonalna i ma predefiniowane wartości domyślne:

Atrybut Opis
id Liczba całkowita, która pomaga śledzić ten skrypt Robo w wynikach przeszukiwania. Robo ma wbudowane skrypty Robo z własnymi id . Chociaż ten sam id w różnych skryptach Robo nie wpływa na ich zachowanie, odróżnienie działań od tych skryptów Robo w wynikach indeksowania może być trudne. Zalecamy przypisanie unikalnego id 1000 lub wyższego dla skryptów Robo, aby uniknąć konfliktów.
description Podobny do id , ale bardziej opisowy.
crawlStage Na etapie przeszukiwania Robo stosuje ten skrypt Robo. Domyślnie jest to główny etap indeksowania.
priority Priorytet tego skryptu Robo w porównaniu do innych skryptów Robo. Domyślnie wszystkie skrypty Robo mają priorytet 1 .
maxNumberOfRuns Określa, ile razy podczas przeszukiwania Robo może wykonać ten skrypt Robo. Domyślnie Robo może wykonać skrypt Robo jeden raz.
contextDescriptor Opisuje kontekst lub warunek, który uruchamia ten skrypt Robo. Jeśli zostanie pominięty, warunek uruchomienia tego skryptu Robo uważa się za zawsze spełniony; innymi słowy, skrypt Robo jest bezwarunkowy.
actions Wszystkie działania tego skryptu Robo.

Pojedynczy plik zawiera zbiór jednego lub więcej skryptów Robo.

Poniżej znajduje się przykład pliku z dwoma bezwarunkowymi skryptami Robo, każdy z pojedynczą akcją wykonywaną raz na początku przeszukiwania:

[
  {
    "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 uruchamia skrypt Robo przy użyciu 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 użytkownika odpowiadający elementDescriptors lub tekstowi określonemu przez visionText .
"condition": "element_disabled" Sprawdza, czy widżet interfejsu użytkownika pasujący do elementDescriptors jest obecny na ekranie i nie można z nim wchodzić w interakcję.
"condition": "element_checked" Sprawdza, czy widżet interfejsu użytkownika pasujący do elementDescriptors jest obecny na ekranie i jest sprawdzany.
"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 są uruchomione żadne aplikacje.
"condition": "non_roboscript_action_performed" Sprawdza, czy ostatnie kolejne akcje nonRoboscriptActionCount wykonane przez test Robo nie są akcjami skryptu Robo.
negateCondition Jeśli ustawione na true , neguje condition . Możesz na przykład użyć tego atrybutu, aby sprawdzić, czy na ekranie NIE ma widżetu interfejsu użytkownika lub czy testowana aplikacja NIE działa na pierwszym planie.
elementDescriptors Jeden lub więcej deskryptorów elementów identyfikujących widżet interfejsu użytkownika na ekranie. Jest używany w połączeniu z warunkami element_present , element_disabled i element_checked . Wzajemnie wykluczające się z visionText . Aby uzyskać więcej informacji, zobacz Deskryptory elementów .
visionText Tekst na ekranie jest wykrywany przy użyciu interfejsu API optycznego rozpoznawania znaków (OCR). visionText jest używany w połączeniu z warunkiem element_present . Wzajemnie wykluczające się z elementDescriptors .
nonRoboscriptActionCount Liczba kolejnych działań wykonanych wcześniej w skrypcie innym niż Robo. Jest używany w połączeniu z warunkiem non_roboscript_action_performed w celu uruchomienia skryptu Robo po każdej akcji Robo nonRoboscriptActionCount . Domyślnie jest to 1 .

Poniżej znajduje się przykład skryptu Robo uruchamianego przez widżet interfejsu użytkownika z identyfikatorem zasobu "my.app.package:id/page_header" obecnym 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 znajduje się przykład skryptu Robo uruchamianego przez "Privacy Policy" wykrytą przez funkcję optycznego rozpoznawania 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 znajduje się przykład skryptu Robo, który czeka 5 sekund po każdej akcji Robo niebędącej skryptem:

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

działania

Każda akcja w skrypcie Robo jest reprezentowana jako pakiet jednej lub większej liczby par atrybut-wartość, które opisano w poniższej tabeli:

Atrybut Opis
eventType Określa typ akcji, np. kliknięcie, edycja tekstu itp. Wymagane przy 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, np. kliknięcie określonego przycisku.
optional Jeśli ustawiona na true , ta akcja jest pomijana, jeśli 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 uszkodzenia zawierającego skrypt Robo. Domyślnie wartość to false .
replacementText Tekst do wprowadzenia w docelowym widżecie interfejsu użytkownika. Wymagane do działań związanych z edycją tekstu.
swipeDirection Określa kierunek przeciągnięcia. Wymagane w przypadku czynności przesuwania.
delayTime Określa czas oczekiwania (w milisekundach). Wymagane w przypadku akcji oczekiwania.
pointTapXCoordinate i pointTapYCoordinate Współrzędne X i Y w pikselach dotkniętego punktu. Wzajemnie się wykluczają z pointTapXPercent i pointTapYPercent . Wymagane w przypadku akcji typu point tap.
pointTapXPercent i pointTapYPercent Procentowe współrzędne X i Y dotkniętego punktu. Wzajemnie wykluczające się z pointTapXCoordinate i pointTapYCoordinate . Wymagane w przypadku akcji typu point tap.

Poniżej znajduje się przykład skryptu Robo z dwiema 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 widget interfejsu użytkownika przy użyciu jednego lub większej liczby następujących atrybutów identyfikujących:

Atrybut Opis
className
ancestorClassName Nazwa klasy przodka hierarchii interfejsu użytkownika elementu. Przodek to dowolny z węzłów nadrzędnych w hierarchii interfejsu użytkownika elementu, łącznie z samym elementem.
resourceId
resourceIdRegex Wyrażenie regularne Java pasujące do resourceId .
contentDescription
contentDescriptionRegex Wyrażenie regularne Java odpowiadające contentDescription .
text (który pojawia się na ekranie)
textRegex Wyrażenie regularne Java pasujące do 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 obecne są pewne wartości atrybutów, mogą one nie być unikalne na ekranie danej aplikacji (w tym resourceId ).

Na przykład rozróżnienie elementów listy jest zwykle możliwe tylko poprzez użycie 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 uporządkowanych w taki sposób, że pierwszy 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 pasują do odpowiedniej podhierarchii widżetu interfejsu użytkownika.

Poniżej znajduje się przykład skryptu Robo z akcjami zmiany tekstu i kliknięcia, przy czym oba wymagają identyfikacji 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żesz poprzedzić listę akcji w skrypcie Robo obiektem JSON, który określa opcje wykonania 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:
    • strict — jeśli ustawione na true , skrypt Robo nie stosuje częściowego dopasowywania, pomijania bieżącej akcji i zawieszania . Oznacza to, że skrypt Robo jest wykonywany jako zwykły test oprzyrządowania i kończy się niepowodzeniem, gdy nie można wykonać żadnej z jego akcji. Domyślnie jest to false .
    • notify - jeśli ustawione na false , skrypt Robo nie będzie wyświetlał powiadomień na ekranie na początku i na końcu jego wykonania. Domyślnie jest to true .
  • postscript - opcje wykonania stosowane po zakończeniu skryptu Robo:
    • terminate — jeśli ustawione na true , test Robo zatrzymuje indeksowanie po zakończeniu skryptu Robo. Domyślnie jest to false .

Poniżej znajduje się przykład skryptu Robo wykonanego w trybie strict bez powiadomień na ekranie, który jest uśpiony przez trzy sekundy, po czym indeksowanie zostaje zatrzymane:

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

Parametry szablonu

Parametr szablonu to element zastępczy w skrypcie Robo, który jest zastępowany rzeczywistą wartością, gdy test Robo ładuje ten skrypt Robo do wykonania. Parametry szablonu są poprzedzone podwójnym podkreśleniem, po którym następuje znak procentu, i są zakończone 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ć linie 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 nie zostaną podjęte), skrypt Robo pozostaje aktywny. Test Robo 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 niezawodności:

Technika Opis
Częściowe dopasowanie Jeśli nie można w pełni dopasować bieżącej akcji skryptu Robo, kryteria dopasowania są rozluźniane i powtarzane jest dopasowanie. 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 zostanie wykonana w zwykły sposób. Ta technika obsługuje scenariusze, w których struktura aplikacji zmienia się, na przykład pomiędzy wersjami aplikacji, gdy elementy ekranu są zmieniane.

Pomiń bieżącą akcję Jeśli nie można w pełni lub częściowo dopasować bieżącej akcji skryptu Robo, Robo próbuje dopasować kolejną akcję skryptu Robo. Jeśli kolejna akcja jest całkowicie lub częściowo zgodna, test Robo pomija (i nigdy nie powraca do) bieżącej akcji skryptu Robo i wykonuje następną.

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

Wstrzymać Jeśli ani bieżące, ani kolejne akcje skryptu Robo nie mogą zostać w pełni lub częściowo dopasowane, skrypt Robo zostaje tymczasowo zawieszony, a test Robo wybiera akcję do wykonania, korzystając z innych strategii. Po zakończeniu tej akcji test Robo 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. Zatem skrypty Robo niekoniecznie muszą być prologiem do testu Robo i można przeplatać działania skryptu Robo ze standardowymi działaniami testowymi 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” swoimi standardowymi działaniami.

Priorytety

Jeśli skrypt Robo osiągnie wartość maxNumberOfRuns , nie będzie można go już uruchomić w danym przeszukiwaniu. Jeśli w bieżącym kontekście można uruchomić więcej niż jeden skrypt Robo, priorytet zostanie przyznany poprzez 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 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 trzema skryptami Robo, które wykonują tę samą akcję i są uruchamiane przez ten sam warunek – testowana aplikacja znajduje się na pierwszym planie:

[
  {
    "id": 1000,
    "description": "Robo script 1",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "DELAYED_MESSAGE_POSTED",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1001,
    "description": "Robo script 2",
    "priority": "2",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "DELAYED_MESSAGE_POSTED",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1002,
    "description": "Robo script 3",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "DELAYED_MESSAGE_POSTED",
        "delayTime": 3000
      }
    ]
  }
]

Gdy testowana aplikacja znajduje się na pierwszym planie, Robo uruchamia w następującej 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 odpowiednich skryptów Robo z tym samym priorytetem.
  3. "Robo script 3" jako ostatni obowiązujący skrypt Robo.

Powtarzające się biegi

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

Poniżej znajduje się przykład skryptu Robo, który przenosi testowaną aplikację w tło maksymalnie 10 razy:

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

Etap pełzania

Skrypty Robo mają zastosowanie na różnych etapach danego indeksowania Robo:

Etap pełzania Opis
pre_crawl Zanim Robo uruchomi i zacznie indeksować testowaną aplikację.
post_crawl Gdy Robo zakończy indeksowanie testowanej aplikacji.
crawl Główny etap indeksowania, podczas którego Robo indeksuje testowaną aplikację.
close_screen Kiedy Robo próbuje wrócić (cofnąć się) z danego ekranu, gdy rozpatrzone zostaną wszystkie możliwe akcje na tym ekranie. Domyślnie Robo cofa się, co w niektórych scenariuszach jest niepożądane.

Jeśli atrybut crawlStage skryptu Robo nie jest określony, zakłada 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ład skryptu Robo, który instruuje Robo, aby kliknął "Cancel" przy każdej próbie powrotu (cofnięcia się) 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ć akcje warunkowe. Akcje warunkowe mają trzy dodatkowe atrybuty opisujące sposób, w jaki Robo je wykonuje:

Atrybut Opis
priority Priorytet tej akcji warunkowej w porównaniu z innymi akcjami warunkowymi w ramach zawierającego ją skryptu Robo. Domyślnie wszystkie akcje warunkowe mają priorytet 1 .
maxNumberOfRuns Ile razy można wykonać tę akcję warunkową podczas jednego wykonania zawierającego ją skryptu Robo. Domyślnie wszystkie akcje warunkowe można wykonać co najwyżej raz w jednym wykonaniu zawierającego je skryptu Robo.
contextDescriptor Kontekst/warunek wyzwalający tę akcję warunkową. Ma tę samą strukturę i oferuje podobne możliwości jak [contextDescriptor skryptu Robo](#context-descriptor).

Po uruchomieniu skrypt Robo wykonuje swoje bezwarunkowe akcje jedna po drugiej, w kolejności ich występowania. Jeśli skrypt Robo zawiera akcje warunkowe, są one brane pod uwagę za każdym razem przed wybraniem akcji bezwarunkowej do wykonania. Jeśli jakakolwiek akcja warunkowa zostanie uruchomiona i wybrana na podstawie jej priorytetu i pozostałej liczby uruchomień, skrypt Robo wykona tę akcję warunkową. W przeciwnym razie skrypt Robo wykona następującą bezwarunkową akcję. Aby skrypt Robo był ważny, musi zawierać co najmniej jedną akcję bezwarunkową.

Poniżej znajduje się przykład bezwarunkowego skryptu Robo z akcją warunkową, która zamyka wyskakujące okna dialogowe, 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": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    }
}

Ignorowanie działań

Skrypt Robo może zawierać instrukcje dla Robo, aby ignorował określone widżety interfejsu użytkownika lub wszystkie widżety interfejsu użytkownika na określonym ekranie. Instrukcje te są reprezentowane jako ignorowanie „akcji” odpowiednio z eventType ELEMENT_IGNORED i ALL_ELEMENTS_IGNORED .

Ilekroć atrybut contextDescriptor skryptu Robo zawierającego działania ignorujące pasuje do danego ekranu, Robo nie wchodzi w interakcję z żadnymi widżetami interfejsu użytkownika, na które są ukierunkowane jego działania ignorujące (chyba że inna akcja skryptu Robo zmusi Robo do wykonania akcji na jednym z ignorowanych widżetów interfejsu użytkownika).

Skrypt Robo może zawierać kombinację działań ignorowających, warunkowych i bezwarunkowych. W przeciwieństwie do innych akcji skryptu Robo, stosowane są akcje ignorowania, o ile zawierające contextDescriptor skryptu Robo odpowiadają ekranowi podczas przeszukiwania Robo, niezależnie od wartości atrybutów priority i maxNumberOfRuns .

Poniżej znajduje się przykład pliku z dwoma skryptami Robo. Pierwszy skrypt Robo powoduje, że Robo ignoruje wszystkie widżety interfejsu użytkownika na ekranie zawierającym widżet interfejsu użytkownika z identyfikatorem zasobu "my.app.package:id/ignored_screen" . Drugi skrypt Robo powoduje, że Robo ignoruje widżety interfejsu użytkownika, których identyfikatory zasobów pasują do wyrażenia regularnego Java ".*:id/done" na ekranie zawierającym widżet interfejsu użytkownika 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

Widżety potomne RecyclerView i AdapterView są ładowane dynamicznie i mogą być wyświetlane po wielu przesunięciach od bieżącego ekranu. Ponieważ rozmiar ekranu i liczba przeciągnięć wymaganych do dotarcia do tego dziecka są różne w zależności od kształtu urządzenia, znacznie bezpieczniejsze jest poleganie na pozycji danych dziecka, która jest bezwzględna. Mniej solidnym podejściem jest poleganie na liczbie przeciągnięć wymaganych do doprowadzenia dziecka do ekranu, a następnie wykorzystania jego pozycji na ekranie.

Dlatego skrypt Robo przechwytuje bezwzględne pozycje danych elementów podrzędnych RecyclerView, które są obiektami docelowymi działań skryptu Robo, jako recyclerViewChildPosition . Skrypt Robo przechwytuje także 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 następujących krokach:

  1. Test Robo zapewnia, że ​​odpowiednie dziecko zostanie wyświetlone na ekranie poprzez akcję pozycjonowania na zawierającym RecyclerView lub AdapterView.

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

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

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

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

Możesz utworzyć skrypt Robo w Android Studio, który zapisuje skrypt jako plik JSON. Następnie możesz przesłać plik JSON do laboratorium testowego Firebase za pomocą aplikacji i odpowiednio uruchomić test.

Kiedy uruchamiasz test Robo z dołączonym skryptem, Robo najpierw wykonuje wcześniej zaplanowane działania, a następnie normalnie eksploruje aplikację.

Aby utworzyć plik JSON skryptu Robo w Android Studio, wykonaj kroki opisane w temacie Nagrywanie skryptu Robo przy użyciu laboratorium testowego w Android Studio .

Działania skryptu Robo

Poniższy wspólny atrybut opcjonalny ma zastosowanie do wszystkich akcji:

  • description — pomaga śledzić wykonanie tej akcji skryptu Robo w wynikach testu Robo.

Twierdzenie

Jeśli stwierdzony 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.

W poniższej tabeli wymieniono wymagane atrybuty:

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

Poniżej znajduje się przykład asercji skryptu Robo, która sprawdza, czy testowana aplikacja znajduje się na pierwszym planie:

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

Poniżej znajduje się przykład potwierdzenia skryptu Robo, który 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 potwierdzenia skryptu Robo, który sprawdza, czy "Settings" NIE zostały wykryte na ekranie przy użyciu 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 klawiatury programowej maksymalnie razy maxNumberOfRuns .
"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 za pomocą 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 eventType jest SOFT_KEYBOARD_RANDOM_CLICK . 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 polega na kliknięciu "Privacy Policy" wykrytej 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 programowej maksymalnie pięć 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.

Następujący atrybut jest opcjonalny:

  • expectedOutputRegex — oczekiwany wynik polecenia jako wyrażenie regularne Java. Jeśli dane wyjściowe nie są zgodne, akcja 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 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%__"
}

Przyznaj uprawnienia

Ta akcja 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, dlatego ta akcja jest nieskuteczna. NIE używaj tej akcji w skryptach Robo.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "PERMISSIONS_REQUEST" --

Ignoruj ​​wszystkie elementy na ekranie

Ta akcja powoduje, że Robo ignoruje wszystkie elementy na dowolnym ekranie, które uruchamiają zawierający skrypt Robo.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "ALL_ELEMENTS_IGNORED" --

Poniżej znajduje się przykład akcji skryptu Robo, która powoduje, że Robo ignoruje wszystkie elementy na ekranie:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Ignoruj ​​element

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

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Identyfikuje ignorowane widżety interfejsu użytkownika przy użyciu hierarchii interfejsu użytkownika systemu Android.

Następujący atrybut jest opcjonalny:

  • ignoreChildren - jeśli ustawione na true , Robo ignoruje również wszystkich potomków ignorowanych widżetów interfejsu użytkownika. Domyślnie jest to false .

Poniżej znajduje się przykład akcji skryptu Robo, która powoduje, że Robo ignoruje wszystkie elementy, których opisy zawartości zaczynają się od "Avatar" :

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

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 w docelowym widżecie interfejsu użytkownika.

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

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. Wzajemnie wykluczające się z visionText .
visionText Identyfikuje długo klikany element za pomocą OCR. Wzajemnie wykluczające się z elementDescriptors .

Następujący atrybut jest opcjonalny:

  • delayTime — określa, jak długo 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 treś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 gestu jednopunktowego, sformatowane jako „(x1,y1)->(x2,y2)” jako wartości procentowe lub piksele.

Następujący atrybut jest opcjonalny:

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

Poniżej znajduje się przykład jednopunktowego gestu skryptu Robo, który 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 wartości procentowe lub piksele.

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

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

Wykonaj czynność edytora IME

Ta akcja powoduje naciśnięcie przycisku bieżącej akcji, na przykład Dalej, Gotowe i Szukaj, w edytorze metody wprowadzania (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 widgecie 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 ponownie

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 cofania emulatorów API 28.

Poniżej znajduje się przykład akcji skryptu Robo, która powoduje cofnięcie:

{
  "eventType": "PRESSED_BACK"
}

Naciśnij przycisk Home

Ta akcja wysyła zdarzenie KEYCODE_HOME do urządzenia.

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "GO_HOME" --

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

{
  "eventType": "GO_HOME"
}

Przewiń element do widoku

Ta akcja powoduje, że Robo testuje przewijanie widżetu interfejsu użytkownika odpowiadającego określonym elementDescriptors do momentu pojawienia się na ekranie widżetu interfejsu użytkownika odpowiadającego określonym childElementDescriptors , przewijania widżetu nie można już przewijać lub osiągnięcia maksymalnej liczby 50 przewinięć.

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 którego można przewinąć 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 o identyfikatorze zasobu "my.app.package:id/scrollable_card_container" do momentu pojawienia się na ekranie widżetu interfejsu użytkownika z tekstem "Orange" (lub nie można już przewijać więcej zostać wykonane lub osiągnięta zostanie maksymalna liczba 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
  • Forward — w Down lub Right , w zależności od możliwości przewijania docelowego widżetu interfejsu użytkownika w pionie lub w poziomie.
  • BackwardUp lub Left , w zależności od możliwości przewijania docelowego widżetu interfejsu użytkownika w pionie lub w poziomie.
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 o identyfikatorze 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"
}

Kliknij punkt na ekranie

W poniższej tabeli wymieniono wymagane atrybuty:

Atrybut Opis
"eventType": "POINT_TAP" --
pointTapXCoordinate Współrzędna X w pikselach dotkniętego punktu. Wzajemnie się wykluczają z pointTapXPercent i pointTapYPercent .
pointTapYCoordinate Współrzędna Y w pikselach dotkniętego punktu. Wzajemnie się wykluczają z pointTapXPercent i pointTapYPercent .
pointTapXPercent Procentowa współrzędna X dotkniętego punktu. Wzajemnie wykluczające się z pointTapXCoordinate i pointTapYCoordinate .
pointTapYPercent Procentowa współrzędna Y wybranego punktu. 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
}

Kliknij 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 przez określony czas.

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