Przewodnik po skryptach Robo

Ten dokument zawiera informacje referencyjne na temat skryptów Robo, takich jak struktury, możliwości, użycia, nagrywania i działań. Skrypty Robo są testy, które automatyzują zadania związane z ręczną kontrolą jakości (QA) w przypadku aplikacji mobilnych; włącz tryb ciągłej integracji (CI) i strategie testowania przed opublikowaniem. Robo skrypt to plik JSON opisujący sekwencję interfejsu użytkownika (UI) inne czynności.

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

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

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

  • Nagraj skrypt Robo i edytuj go ręcznie. (tylko w Androidzie)

Aby dowiedzieć się więcej o korzystaniu ze skryptów Robo, zapoznaj się z sekcją Uruchamianie Robo skrypt.

Wprowadzenie

Skrypt Robo jest udostępniany na potrzeby testu Robo razem z innymi danymi wejściowymi, takimi jak app-under-test, Android Application Package (APK).

Poniżej znajdziesz przykładowy skrypt Robo, który loguje użytkownika w aplikacji: wyzwalane przy uruchamianiu aplikacji w trakcie testu:

[
  {
    "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 jest tylko jeden skrypt Robo i ma on wartość domyślną app_under_test_shown, jak w przykładzie powyżej, a następnie może określić skrypt Robo w pliku przy użyciu prostszego formatu – tak jak jego kolejne działania:

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "user123",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/username"
      }
    ]
  },
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "12345",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/password"
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/login"
      }
    ]
  }
]

Obsługa skryptów Robo w systemie iOS+

Robo na iOS+ (beta) ma ograniczoną obsługę skryptów Robo. Składnia skryptu Robo w przypadku iOS+ jest taka sama jak w przypadku Androida, a także obsługiwana w systemach iOS+. działają podobnie do ich odpowiedników na Androidzie.

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

  • Asercja
  • Kliknij
  • Długie kliknięcie
  • Przesuwanie palcem
  • Ignoruj wszystkie elementy
  • Czekaj
  • Zrób zrzut ekranu
  • Zakończ indeksowanie

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

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

Podane niżej warunki uruchamiania w deskryptorach kontekstu są obsługiwane w iOS+:

  • Wyświetlono aplikację w trakcie testowania
  • Element jest
  • Wykonano czynność inną niż Robo

Struktura

Skrypt Robo ma kilka atrybutów opisujących sposób jego wykonywania. Większość z tych atrybutów jest opcjonalna ze wstępnie zdefiniowanymi wartościami domyślnymi:

Atrybut Opis
id Liczba całkowita, która pomaga śledzić ten skrypt Robo w danych wyjściowych indeksowania. Robo ma wbudowane skrypty Robo z własnymi skryptami id. Chociaż ten sam element id w różnych skryptach Robo nie ma wpływu na ich działania, odróżniając działania od tych skryptów Robo w danych wyjściowych indeksowania. może być trudnym zadaniem. Zalecamy przypisanie unikalnej wartości id w postaci 1000 lub więcej dla skryptów Robo, aby uniknąć konfliktów.
description Podobne do id, ale bardziej opisowe.
crawlStage Na etapie indeksowania Robo stosuje ten skrypt Robo. Domyślnie 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 uruchomić tę Robo skrypt. Domyślnie Robo może jednorazowo uruchomić skrypt Robo.
contextDescriptor Opisuje kontekst lub warunek, który wyzwala ten skrypt Robo. Jeśli go pominiesz, warunek wyzwalający tego skryptu Robo będzie uznawany za zawsze spotykane; czyli skrypt Robo jest bezwarunkowy.
actions Wszystkie działania tego skryptu Robo.

Pojedynczy plik zawiera kolekcję co najmniej 1 skryptu Robo.

Poniżej znajdziesz przykład pliku z dwoma bezwarunkowymi skryptami Robo, z których każdy wykonując jedno działanie, które jest 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 określa kontekst lub warunek wyzwalający Robo za pomocą jednego lub kilku atrybutów:

Atrybut Opis
"condition": "always" Zawsze aktywuje skrypt Robo.
"condition": "element_present" Sprawdza, czy widżet interfejsu pasuje do elementDescriptors lub na ekranie jest tekst określony przez visionText.
"condition": "element_disabled" Sprawdza, czy widżet interfejsu pasujący do elementDescriptors jest są widoczne na ekranie i nie można z nich korzystać.
"condition": "element_checked" Sprawdza, czy widżet interfejsu pasujący do elementDescriptors jest widoczne na ekranie i zaznaczone.
"condition": "app_under_test_shown" Sprawdza, czy test aplikacji działa na pierwszym planie.
"condition": "default_launcher_shown" Sprawdza, czy wyświetla się ekran główny urządzenia, co oznacza, że nie ma żadnych aplikacji które działają na pierwszym planie.
"condition": "non_roboscript_action_performed" Sprawdza, czy ostatni nonRoboscriptActionCount z rzędu czynności wykonywane przez test Robo nie są działaniami skryptu Robo.
negateCondition Jeśli ma wartość true, neguje condition. Dla: na przykład możesz użyć tego atrybutu, aby sprawdzić, czy widżet interfejsu NIE lub że testowana aplikacja NIE jest uruchomiona 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 atrybutami element_present, element_disabled i element_checked conditions. Wzajemnie wyklucza się z: visionText. Więcej informacje znajdziesz w artykule Deskryptory elementu.
visionText Tekst na ekranie jest wykrywany za pomocą optycznego rozpoznawania znaków (OCR) API. visionText jest stosowany w połączeniu z Warunek element_present. Wzajemnie wyklucza się z elementDescriptors
nonRoboscriptActionCount Liczba kolejnych wykonanych wcześniej działań innych niż skrypt Robo. Jest używane w połączeniu z non_roboscript_action_performed warunek wyzwalający skrypt Robo po każdym nonRoboscriptActionCount działań Robo. Domyślnie jest to 1

Poniżej znajdziesz przykładowy skrypt Robo, który jest aktywowany przez widżet interfejsu użytkownika z identyfikatorem zasobu "my.app.package:id/page_header" dostępnym w ekran:

{
  "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 wywoływanego przez Kod "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żde działanie Robo inne niż skrypt:

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

Działania

Każde działanie w skrypcie Robo jest przedstawiane jako pakiet par atrybut-wartość, które zostały opisane w tej tabeli:

Atrybut Opis
eventType Określa rodzaj działania, np. kliknięcie, edycja tekstu itp. Wymagane dla każdego działania.
elementDescriptors Deskryptory identyfikujące widżet interfejsu użytkownika. Wymagane w przypadku wszystkich działań, które mieć docelowy widżet interfejsu, np. kliknięcie konkretnego przycisku.
optional Jeśli ma wartość true, to działanie jest pomijane, gdy nie można tego zrobić przeprowadzonych przez nas działań. To działanie jest pomijane, gdy na przykład nie może znaleźć docelowego widżetu interfejsu na ekranie – bez problemów z zawierającym Robo. skrypt. Domyślną wartością jest false.
replacementText Tekst do wpisania w docelowym widżecie interfejsu. Wymagane do edytowania tekstu .
swipeDirection Określa kierunek przesuwania. Wymagane do działania przesuwania.
delayTime Określa czas oczekiwania (w milisekundach). Wymagane dla działań związanych z oczekiwaniem.
pointTapXCoordinate i pointTapYCoordinate Współrzędne X i Y piksela klikniętego punktu. Wzajemnie wykluczające się z użytkownikami pointTapXPercent i pointTapYPercent. Wymagane w przypadku działań wykonywanych za pomocą dotknięcia punktowego.
pointTapXPercent i pointTapYPercent Procentowe współrzędne X i Y klikniętego punktu. Wzajemnie tylko w usługach pointTapXCoordinate i pointTapYCoordinate Wymagane w przypadku działań wykonywanych za pomocą dotknięcia punktowego.

Poniżej znajdziesz przykład skryptu Robo z 2 działaniami bez wartości docelowej widżety interfejsu, które nie działają w danym interfejsie; widżet:

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

Deskryptory elementów

Deskryptor elementu identyfikuje widżet interfejsu za pomocą co najmniej jednej następujące atrybuty identyfikujące:

Atrybut Opis
className
ancestorClassName Nazwa klasy elementu nadrzędnego hierarchii elementu. Element nadrzędny to dowolny węzłów nadrzędnych w hierarchii interfejsu użytkownika, w tym element
resourceId
resourceIdRegex Wyrażenie regularne Java pasujące do resourceId.
contentDescription
contentDescriptionRegex Wyrażenie regularne Java pasujące do contentDescription.
text (wyświetlana na ekranie)
textRegex Wyrażenie regularne Java pasujące do text.
groupViewChildPosition, recyclerViewChildPosition lub adapterViewChildPosition Reprezentuje pozycję podrzędną widżetu interfejsu w zależności od jego rodzaju widżet nadrzędny.

Często te atrybuty są niezdefiniowane, na przykład przycisk może nie mieć tekst i opis treści. Nawet jeśli określone wartości atrybutów są obecne, mogą nie być unikalne na danym ekranie aplikacji (w tym resourceId).

Na przykład odróżnianie pozycji listy jest zwykle możliwe tylko używając różnych pozycji podrzędnych w widżecie nadrzędnym. Oznacza to, że że używanie tylko jednego deskryptora elementu do identyfikacji widżetu interfejsu niewystarczające. Dlatego atrybut elementDescriptors działania zawiera atrybut sekwencji deskryptorów elementów uporządkowanych w taki sposób, że pierwszy odpowiada docelowemu widżetowi interfejsu, drugi – docelowy widżetu nadrzędnego widżetu interfejsu i tak dalej. Docelowy widżet interfejsu działania zostaje dopasowany gdy wszystkie jego deskryptory elementów pasują do odpowiedniego widżetu interfejsu. podhierarchii.

Poniżej znajduje się przykładowy skrypt Robo ze zmianą tekstu i kliknięciem Działania, które wymagają wskazania docelowego widżetu interfejsu za pomocą podane deskryptory 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ę działań w skrypcie Robo prefiksem JSON określający opcje wykonywania tego skryptu Robo. Ten nagłówek konfiguracji zaczyna się od słowa kluczowego roboscript, po którym następuje Format JSON odpowiednich opcji wykonywania.

Skrypty Robo obsługują te opcje wykonywania:

  • executionMode – opcje wykonywania są stosowane, gdy uruchomiony jest skrypt Robo:
    • strict – jeśli jest ustawiony na true, skrypt Robo nie wykorzystuje dopasowanie częściowe, pominięcie bieżącego działania i zawieszenie. Oznacza to, że skrypt Robo jest wykonywany jako zwykły test instrumentacji. i kończy się niepowodzeniem, gdy nie będzie można wykonać żadnego z jego działań. Domyślnie jest false.
    • dismiss_popups – jeśli ma wartość true, test Robo odrzuca wszystkie nieoczekiwane także podczas wykonywania skryptu Robo, nawet w trybie strict. Ten nie działa, gdy nie jest w trybie strict. Domyślnie jest to false
    • notify – jeśli ma wartość false, skrypt Robo nie wyświetla się na ekranie. powiadomienia na początku i na końcu jego wykonania. Domyślnie jest true.
  • postscript – opcje wykonywania są stosowane po zakończeniu działania skryptu Robo:
    • terminate – jeśli ma wartość true, test Robo kończy indeksowanie po Robo. . Domyślnie jest to false.

Poniżej znajdziesz przykład skryptu Robo uruchomionego w trybie strict bez powiadomienia na ekranie usypiane przez trzy sekundy. Po tym czasie przystanki:

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

Parametry szablonu

Parametr szablonu to obiekt zastępczy w skrypcie Robo, który jest zastępowany ciągiem rzeczywista wartość, gdy test Robo wczytuje ten skrypt do wykonania. Szablon są poprzedzone podwójnym podkreśleniem, po którym następuje znak procentu, i są poprzedzone znakiem procenta, po którym następuje podwójne podkreślenie.

Skrypty Robo obsługują ten parametr szablonu:

  • __%APP_PACKAGE_NAME%__ – nazwa pakietu aplikacji w trakcie testu.

Poniżej znajdziesz przykład skryptu Robo, który zatrzymuje test aplikacji proces:

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

Komentarze

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

Poniżej znajduje się przykładowy skrypt 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ą ukończone (lub co najmniej ), skrypt Robo pozostaje aktywny. Test Robo wciąż próbuje dopasować Akcja skryptu Robo, która wybiera działanie do wykonania. Skrypt Robo stosuje następujące techniki zwiększania niezawodności:

Technika Opis
Dopasowanie częściowe Jeśli nie można w pełni dopasować bieżącej czynności skryptu Robo, kryteria są łagodne i następuje ponowna próba dopasowania. Dopasowanie częściowe nie uwzględnia najbardziej zewnętrznego deskryptora elementu podczas dopasowywania docelowy widżet interfejsu działania skryptu Robo.

Jeśli częściowe dopasowanie się powiedzie, odpowiednie działanie skryptu Robo jest przeprowadzana w zwykły sposób. Ta technika obsługuje scenariusze, w których struktura aplikacji zmienia się, np. pomiędzy wersjami, gdy ekran i zmieniono kolejność elementów.

Pomiń bieżące działanie Jeśli nie można w pełni lub częściowo dopasować bieżącej czynności skryptu Robo, Robo próbuje dopasować kolejne działanie skryptu Robo. Jeśli kolejne działanie całkowicie lub częściowo pasuje, test Robo pomija (i nigdy nie wraca do) bieżące działanie skryptu Robo, a następnie wykonuje ono kolejną.

Ta technika działa w sytuacjach, gdy działanie aplikacji zmienia się lub działa niestabilnie, np. gdy przerywane okno dialogowe może mogą pojawiać się na różnych ekranach podczas nagrywania i odtwarzania Robo. skrypt.

Zawieś Jeśli 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 jest tymczasowo zawieszony wybiera działanie do wykonania, używając innych strategii. Po wykonaniu tego działania zostanie zakończony, test Robo wznowi wykonywanie skryptu Robo.

Dopóki nie będzie można dopasować bieżących lub kolejnych działań skryptu Robo, Skrypt Robo pozostaje zawieszony na potrzeby dowolnej liczby działań. Dlatego Robo skrypty nie muszą być prologem testu Robo, i możesz przeplatać działania skryptu Robo ze standardowym testem Robo. . Ta technika działa w sytuacjach, gdy działanie aplikacji jest niestabilne, lub gdy zmiany między wersjami aplikacji są na tyle duże, że test Robo musi „wypełnić luki” ze standardowymi działaniami.

Priorytety

Jeśli skrypt Robo osiągnie poziom maxNumberOfRuns, nie będzie już można go aktywować podczas danego indeksowania. Jeśli bieżący może aktywować więcej niż 1 skrypt Robo kontekst jest nadany priorytet przez wybranie w następującej kolejności skryptu Robo które:

  1. Ma atrybut contextDescriptor.
  2. Ma najwyższy wskaźnik priority (domyślnie wszystkie skrypty Robo mają takie same wartości wykonanie priority z 1).
  3. Pojawia się najwcześniej na liście skryptów Robo, jeśli skrypty Robo są dostępne priorytety są takie same.

Poniżej znajdziesz przykład pliku z 3 skryptami Robo, które wykonują to samo działanie i są wywoływane przez ten sam warunek – 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 test aplikacji działa na pierwszym planie, Robo wywołuje następujący kod: zamówienie:

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

Powtórzenia

Domyślnie Robo uruchamia skrypt Robo najwyżej raz podczas indeksowania. Może to być do dostosowania za pomocą atrybutu maxNumberOfRuns.

Poniżej znajdziesz przykład skryptu Robo, który przenosi test aplikacji do w tle maksymalnie 10 razy:

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

Etap indeksowania

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

Etap indeksowania Opis
pre_crawl Przed uruchomieniem Robo i rozpoczęciem indeksowania aplikacji w trakcie testów.
post_crawl Gdy Robo zakończy indeksowanie aplikacji w trakcie testowania.
crawl Główny etap indeksowania, podczas którego Robo indeksuje aplikację w trakcie testowania.
close_screen Gdy Robo próbuje wrócić do poprzedniego ekranu (backtrack), gdy sprawdzane są wszystkie możliwe działania widoczne na ekranie. Domyślnie Robo zwraca się do użytkownika, co w niektórych sytuacjach jest niepożądane.

Jeśli atrybut crawlStage skryptu Robo nie jest określony, wskazuje się, że być crawl.

Poniżej znajdziesz przykład skryptu Robo, który czyści użytkownika w trakcie testowania aplikacji dane, zanim Robo zacznie je indeksować:

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

Poniżej znajdziesz przykład skryptu Robo, który instruuje Robo, aby kliknął "Cancel" za każdym razem, gdy próbuje on wykonać czynność cofniętą po potwierdzeniu okno:

{
  "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ą trzy dodatkowe atrybuty opisujące działanie Robo:

Atrybut Opis
priority Priorytet tego działania warunkowego w porównaniu z innymi działania warunkowe w ramach skryptu Robo. Domyślnie wszystkie działania warunkowe mają priorytet 1.
maxNumberOfRuns Ile razy to działanie warunkowe może być wykonywane w jednym uruchomienia skryptu Robo zawierającego skrypt Robo. Domyślnie wszystkie działania można wykonać najwyżej raz w pojedynczym wykonaniu ich który zawiera skrypt Robo.
contextDescriptor Kontekst/warunek wyzwalający to działanie warunkowe. Zawiera o takiej samej strukturze i podobnych możliwościach deskryptor kontekstu skryptu Robo

Po uruchomieniu skrypt Robo wykonuje po kolei działania bezwarunkowe kolejność występowania. Jeśli skrypt Robo zawiera działania warunkowe, są brane pod uwagę za każdym razem przed wybraniem działania bezwarunkowego do wykonania. Jeśli dowolne działanie warunkowe jest wywoływane i wybierane na podstawie jego priorytetu oraz pozostałych uruchomień, skrypt Robo wykona to działanie warunkowe. W przeciwnym razie skrypt Robo wykonuje poniższe działanie bezwarunkowe. Być prawidłowy, skrypt Robo musi zawierać co najmniej jedno działanie bezwarunkowe.

Poniżej znajdziesz przykład bezwarunkowego skryptu Robo z warunkiem warunkowym działanie, które zamyka wyskakujące okienka, jeśli pojawią się one w dowolnym momencie podczas działania Robo. wykonanie skryptu:

{
  "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 ignorowania konkretnego interfejsu widżetów ani wszystkich widżetów UI na danym ekranie. Te instrukcje są następujące przedstawiane jako ignorowanie „działań”. z: eventType ELEMENT_IGNORED i ALL_ELEMENTS_IGNORED.

Gdy atrybut contextDescriptor skryptu Robo z ignorowaniem akcje pasują do danego ekranu, Robo nie współpracuje z żadnymi widżetami interfejsu. są celem ignorowania działań (chyba że jakakolwiek inna akcja skryptu Robo uniemożliwi Robo wykonuje czynność na jednym z ignorowanych widżetów interfejsu).

Skrypt Robo może zawierać połączenie ignorowania, warunków warunkowych i bezwarunkowych . W przeciwieństwie do innych działań skryptu Robo ignorowanie działań jest stosowane przez długi czas , bo skrypt contextDescriptor zawierający skrypt Robo pasuje do ekranu Indeksowanie Robo niezależnie od wartości priority i maxNumberOfRuns .

Poniżej znajdziesz przykład pliku z 2 skryptami Robo. Pierwszy Robo sprawia, że Robo ignoruje wszystkie widżety interfejsu na ekranie zawierającym widżet interfejsu z identyfikator zasobu "my.app.package:id/ignored_screen". Drugi skrypt Robo sprawia, Robo ignoruje widżety interfejsu, których identyfikatory zasobów pasują do wyrażenia regularnego Java ".*:id/done" w ekran zawierający 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 obiektów RecyclerView i AdapterView

Elementy podrzędne widżetów RecyclerView i AdapterView są ładowane dynamicznie i może zostać wyświetlona po wielu przesunięciach od bieżącego ekranu. Ponieważ rozmiar ekran i liczba przesunięć wymaganych do wyświetlenia tego dziecka są inne w przypadku różnych formatów urządzeń, opiera się pozycji danych dziecka, która jest bezwzględna. Jest to mniej niezawodne podejście liczby przesunięć wymaganych, aby pokazać to dziecko na ekranie, a potem użyj pozycji ekranu.

Dlatego skrypt Robo przechwytuje bezwzględne pozycje danych elementu RecyclerView które są celem działań skryptu Robo, recyclerViewChildPosition Skrypt Robo rejestruje również dane bezwzględne pozycji elementów podrzędnych AdapterView, które są celem działań skryptu Robo jako adapterViewChildPosition

Działania na elementach podrzędnych RecyclerView i AdapterView są wykonywane w następujący sposób: kroki:

  1. Test Robo sprawdza, czy na ekranie wyświetla się odpowiednie dziecko. za pomocą działania pozycjonującego w obiekcie RecyclerView lub AdapterView.

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

Poniżej znajdziesz przykład działania kliknięcia obiektu AdapterView (android.widget.GridView) dziecko:

{
  "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 znajdziesz przykład działania kliknięcia w widoku RecyclerView (android.support.v7.widget.RecyclerView) dziecko:

{
  "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 testów

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

Gdy uruchamiasz test Robo z dołączonym skryptem, test Robo najpierw przechodzi cały proces, określone działania, a następnie jak zwykle korzysta z aplikacji.

Aby utworzyć plik JSON skryptu Robo w Android Studio, wykonaj czynności opisane w Nagraj skrypt Robo, korzystając z Laboratorium w Android Studio.

Działania skryptu Robo

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

  • description – pomaga śledzić wykonanie tego działania skryptu Robo w Robo z wynikami testów.

Asercja

Jeśli potwierdzony warunek jest spełniony, skrypt Robo przechodzi do kolejnych działania, które może być kolejnym asercją. W przeciwnym razie wykonanie skryptu Robo zostało zatrzymane z powodu nieudanego potwierdzenia.

Wymagane atrybuty:

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

Poniżej znajdziesz przykład asercji skryptu Robo, która sprawdza, czy app-under-test jest na pierwszym planie:

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

Poniżej znajdziesz przykład asercji skryptu Robo, która sprawdza, czy interfejs użytkownika widżet o identyfikatorze zasobu "com.google.samples.apps.topeka:id/done" to Prezentuj na ekranie:

{
  "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 że obiekt "Settings" NIE jest wykrywany na ekranie za pomocą OCR:

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

Kliknij

Wymagane atrybuty:

Atrybut Opis
eventType Określa typ działania skryptu Robo.
"eventType": "VIEW_CLICKED" Klika element docelowy aplikacji w trakcie testu.
"eventType": "SOFT_KEYBOARD_CLICK" Klika docelowy element klawiatury programowej.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Klika losowe elementy klawiatury programowej w górę do maxNumberOfRuns razy.
"eventType": "LIST_ITEM_CLICKED" Używany przez rejestrator skryptów Robo w Android Studio do klikania listy elementy(ów).
elementDescriptors Identyfikuje kliknięty widżet UI za pomocą hierarchii interfejsu Androida. Wzajemnie wyklucza się z: visionText.
visionText Identyfikuje kliknięty element za pomocą OCR. Wzajemnie wyklucza się z elementDescriptors
maxNumberOfRuns Określa, ile razy należy kliknąć losowy element klawiatury programowej. gdy eventType to SOFT_KEYBOARD_RANDOM_CLICK. Wartością domyślną jest 1.

Poniżej znajdziesz przykład działania skryptu Robo, które powoduje kliknięcie przycisku z identyfikator 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 powoduje kliknięcie Na ekranie wykryto "Privacy Policy" przy użyciu OCR:

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

Poniżej znajdziesz przykład działania skryptu Robo, które klika element klawiatury 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 powoduje kliknięcie losowego przycisku myszy elementy klawiatury do maksymalnie 5 razy:

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

Wyłącz klawiaturę programową

Wymagane atrybuty:

Atrybut Opis
"eventType": "DISABLE_KEYBOARD" --

Poniżej znajduje się przykład działania skryptu Robo, które wyłącza przycisk pozorny klawiatura:

{
  "eventType": "DISABLE_KEYBOARD"
}

Wykonaj polecenie powłoki adb

Wymagane atrybuty:

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

Ten atrybut jest opcjonalny:

  • expectedOutputRegex – oczekiwany wynik polecenia w postaci zwykłego kodu Java i wyrażenia. Jeśli dane wyjściowe nie są zgodne, działanie skryptu Robo kończy się niepowodzeniem. Według 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 usuwa dane użytkownika app-under-test:

{
  "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 dla zgodność wsteczną z Espresso Test Recorder. Test Robo przyznaje wszystkie uprawnienia aplikacji w trakcie testu na początku podczas każdego indeksowania. NIE wykorzystuj tego działania w Skrypty Robo.

Wymagane atrybuty:

Atrybut Opis
"eventType": "PERMISSIONS_REQUEST" --

Ignorowanie wszystkich elementów na ekranie

Powoduje to, że Robo ignoruje wszystkie elementy na ekranie, który uruchamia który zawiera skrypt Robo.

Wymagane atrybuty:

Atrybut Opis
"eventType": "ALL_ELEMENTS_IGNORED" --

Poniżej znajduje się przykład działania skryptu Robo, które powoduje, że Robo ignoruje wszystko elementów na ekranie:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Ignorowanie elementu

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

Wymagane atrybuty:

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

Ten atrybut jest opcjonalny:

  • ignoreChildren – jeśli jest ustawiona na true, Robo ignoruje również wszystkie elementy podrzędne argumentu ignorowanych widżetów interfejsu. Domyślnie jest to false.

Poniżej znajduje się przykład działania skryptu Robo, które powoduje, że Robo ignoruje wszystko elementów, których opis treści zaczyna się od "Avatar":

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

Wprowadzany tekst

Wymagane atrybuty:

Atrybut Opis
eventType Określa typ działania skryptu Robo.
"eventType": "VIEW_TEXT_CHANGED" Wpisuje podany tekst w docelowym widżecie interfejsu.
"eventType": "ENTER_TEXT" wstawia dany tekst do docelowego widżetu interfejsu, a następnie wysyła KEYCODE_ENTER zdarzenie do tego widżetu interfejsu.
elementDescriptors Identyfikuje docelowy widżet interfejsu przy użyciu hierarchii interfejsu Androida.
replacementText Tekst do wpisania w docelowym widżecie interfejsu.

Poniżej znajdziesz przykład działania skryptu Robo, które przesyła "John" do widżet interfejsu z identyfikatorem zasobu, "com.google.samples.apps.topeka:id/first_name":

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

Długie kliknięcie

Wymagane atrybuty:

Atrybut Opis
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identyfikuje docelowy widżet interfejsu przy użyciu hierarchii interfejsu Androida. Wzajemnie dostępna tylko w usłudze visionText.
visionText Identyfikuje długo kliknięty element za pomocą OCR. Wzajemnie wyklucza się z elementDescriptors

Ten atrybut jest opcjonalny:

  • delayTime – określa, jak długo trwa naciśnięcie i przytrzymanie długiego kliknięcia, w formacie milisekund.

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

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

Wykonaj gest jednopunktowy

Wymagane atrybuty:

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

Ten atrybut jest opcjonalny:

  • dragAndDrop – jeśli ma wartość true, gest jednopunktowy powoduje wykonanie „przeciągnij i upuść”. Domyślnie jest to false.

Poniżej znajdziesz przykład działania skryptu Robo polegającego na gestach jednopunktowych, przesunie palcem w dół:

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

Wykonaj gest dwupunktowy

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)" w postaci procentowej lub pikseli.

Poniżej znajdziesz przykład działania skryptu Robo, które powoduje ściągnięcie palców gest:

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

Wykonaj działanie IME

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

Wymagane atrybuty:

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

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

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

Naciśnij Wstecz

Wymagane atrybuty:

Atrybut Opis
eventType Określa typ działania 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 wycofania w interfejsie API 28.

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

{
  "eventType": "PRESSED_BACK"
}

Naciśnij przycisk ekranu głównego

To działanie powoduje wysłanie zdarzenia KEYCODE_HOME do urządzenia.

Wymagane atrybuty:

Atrybut Opis
"eventType": "GO_HOME" --

Oto przykład działania skryptu Robo, które powoduje naciśnięcie ekranu głównego:

{
  "eventType": "GO_HOME"
}

Przewijanie elementów w widoczny sposób

To działanie spowoduje, że test Robo przewinie do przodu widżet interfejsu, który pasuje do z wartością elementDescriptors do czasu, aż widżet interfejsu będzie zgodny z określonym Na ekranie znajduje się ikona childElementDescriptors, a przewijany widżet może nie są już przewijane lub osiągnięto maksymalną liczbę 50 przewinięć.

Wymagane atrybuty:

Atrybut Opis
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identyfikuje przewijany widżet UI za pomocą hierarchii UI Androida.
childElementDescriptors Identyfikuje widżet interfejsu do przewinięcia przy użyciu hierarchii interfejsu Androida.

Poniżej znajdziesz przykład działania skryptu Robo, które przewija widżet UI z identyfikatorem zasobu "my.app.package:id/scrollable_card_container" aż do interfejsu użytkownika na ekranie jest widoczny widżet z tekstem "Orange" (lub lub została osiągnięta maksymalna liczba 50 przewinięć):

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

Przesuwanie palcem

Wymagane atrybuty:

Atrybut Opis
"eventType": "VIEW_SWIPED" --
swipeDirection Określa kierunek przesuwania:
  • Left
  • Right
  • Up
  • Down
  • ForwardDown lub Right w zależności od możliwości przewijania w pionie lub poziomie. docelowego widżetu interfejsu.
  • BackwardUp lub Left w zależności od możliwości przewijania w pionie lub poziomie docelowego interfejsu użytkownika. widżet.
elementDescriptors Identyfikuje docelowy widżet interfejsu przy użyciu hierarchii interfejsu Androida.

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

Zrób zrzut ekranu

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.

Wymagane atrybuty:

Atrybut Opis
"eventType": "POINT_TAP" --
pointTapXCoordinate Współrzędna X piksela klikniętego punktu. Wzajemnie wyklucza się z pointTapXPercent i pointTapYPercent.
pointTapYCoordinate Współrzędna Y piksela klikniętego punktu. Wzajemnie wyklucza się z pointTapXPercent i pointTapYPercent.
pointTapXPercent Procentowa współrzędna X klikniętego punktu. Wzajemnie wyklucza się z pointTapXCoordinate i pointTapYCoordinate.
pointTapYPercent Współrzędna procentowa Y klikniętego punktu. Wzajemnie wyklucza się z pointTapXCoordinate i pointTapYCoordinate.

Poniżej znajdziesz przykład działania skryptu Robo, które klika się w środku ekran:

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

Kliknij punkt w obrębie elementu

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 za pomocą hierarchii interfejsu Androida.

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

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

Zakończ indeksowanie

To działanie zatrzyma test Robo.

Wymagane atrybuty:

Atrybut Opis
"eventType": "TERMINATE_CRAWL" --

Poniżej znajduje się przykład działania skryptu Robo, które zatrzymuje test Robo:

{
  "eventType": "TERMINATE_CRAWL"
}

Czekaj

Wymagane atrybuty:

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

Poniżej znajdziesz przykład działania skryptu Robo, które oczekuje na 3 sek.:

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

Poczekaj na element

To działanie powoduje, że test Robo będzie czekać na pojawienie się elementu na ekranie do określony czas oczekiwania.

Wymagane atrybuty:

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

Poniżej znajdziesz przykład działania skryptu Robo, które czeka do 30 sekund sekund dla widżetu interfejsu z identyfikatorem zasobu "my.app.package:id/confirmation_button" pojawi się na ekranie:

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

Dalsze kroki