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 działanie innego skryptu 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 a konkretnie do głównego etapu 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 jeden raz 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
warunków. 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 są obecne wartości atrybutów,
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 natrue
, 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 jestfalse
.dismiss_popups
– jeśli ma wartośćtrue
, test Robo odrzuca wszystkie nieoczekiwane także podczas wykonywania skryptu Robo, nawet w trybiestrict
. Ten nie działa, gdy nie jest w trybiestrict
. Domyślnie jest tofalse
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 jesttrue
.
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 tofalse
.
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:
- Ma atrybut
contextDescriptor
. - Ma najwyższy wskaźnik
priority
(domyślnie wszystkie skrypty Robo mają takie same wartości wykonaniepriority
z1
). - 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:
"Robo script 2"
, ponieważ ma najwyższy priorytet."Robo script 1"
, ponieważ pojawia się wcześniej wśród pozostałych odpowiednich Skrypty Robo o tym samym priorytecie."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. O
post_crawl Skrypt Robo nie może przekraczać 15 sekund w
W przeciwnym razie indeksowanie może się zakończyć po upływie limitu czasu.
|
crawl
|
Główny etap indeksowania, podczas którego Robo indeksuje aplikację w trakcie testu. |
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:
Test Robo sprawdza, czy na ekranie wyświetla się odpowiednie dziecko. za pomocą działania pozycjonującego w obiekcie RecyclerView lub AdapterView.
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 narzędziu Test Lab
Możesz utworzyć skrypt Robo w Android Studio, który zapisze go jako plik JSON. Następnie możesz przesłać plik JSON do usługi Firebase Test Lab 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 za pomocą narzędzia Test Lab w Android Studio.
Działania skryptu Robo
Ten wspólny atrybut opcjonalny ma zastosowanie do wszystkich działań:
description
– pomaga śledzić wykonanie tego działania skryptu Robo w 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 natrue
, Robo ignoruje również wszystkie elementy podrzędne argumentu ignorowanych widżetów interfejsu. Domyślnie jest tofalse
.
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 tofalse
.
Poniżej znajdziesz przykład działania skryptu Robo jednym punktowym, który polega na gestach 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:
|
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"
}
]
}