Próbuję napisać kilka testów z nowym zestawem testowym na Androida (Espresso) . Ale nie mogę znaleźć żadnych informacji, jak sprawdzić, czy okno dialogowe jest wyświetlane i wykonać w nim pewne czynności (np. Kliknięcie przycisków pozytywów i negatywów itp.). Zwróć uwagę, że okno dialogowe może być również wyświetlane przez a WebView
, a nie przez samą aplikację.
Każda pomoc będzie mile widziana. Potrzebuję tylko linku lub przykładowego kodu do podstaw:
- Sprawdź, czy pojawi się okno dialogowe
- Wykonaj kliknięcia przycisków dialogowych
- Interakcja z widokiem wewnętrznym okna dialogowego (jeśli jest to widok niestandardowy)
- Preform klika poza oknem dialogowym i sprawdź, czy się wyświetla (na przykład czy
setCancelable(false)
został wywołany w kreatorze okien dialogowych i chcemy to sprawdzić)
Dziękuję z góry!
android
android-espresso
Serj Lotutovici
źródło
źródło
Odpowiedzi:
Aby sprawdzić, czy pojawi się okno dialogowe, możesz po prostu sprawdzić, czy jest wyświetlany widok z tekstem obecnym w oknie dialogowym:
onView(withText("dialogText")).check(matches(isDisplayed()));
lub na podstawie tekstu o identyfikatorze
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
Aby kliknąć przycisk okna dialogowego, wykonaj następujące czynności (przycisk1 - OK, przycisk2 - Anuluj):
onView(withId(android.R.id.button1)).perform(click());
AKTUALIZACJA
źródło
Obecnie używam tego i wydaje się, że działa dobrze.
onView(withText(R.string.my_title)) .inRoot(isDialog()) // <--- .check(matches(isDisplayed()));
źródło
Jeśli masz taki AlertDialog:
Możesz sprawdzić, czy komponenty są wyświetlane:
int titleId = mActivityTestRule.getActivity().getResources() .getIdentifier( "alertTitle", "id", "android" ); onView(withId(titleId)) .inRoot(isDialog()) .check(matches(withText(R.string.my_title))) .check(matches(isDisplayed())); onView(withId(android.R.id.text1)) .inRoot(isDialog()) .check(matches(withText(R.string.my_message))) .check(matches(isDisplayed())); onView(withId(android.R.id.button2)) .inRoot(isDialog()) .check(matches(withText(android.R.string.no))) .check(matches(isDisplayed())); onView(withId(android.R.id.button3)) .inRoot(isDialog()) .check(matches(withText(android.R.string.yes))) .check(matches(isDisplayed()));
i wykonaj czynność:
onView(withId(android.R.id.button3)).perform(click());
źródło
android.R.id.message
a tytuł miał ukryty identyfikatorandroid.R.id.alertTitle
.int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Aby odpowiedzieć na pytanie 4, na które zaakceptowana odpowiedź nie odpowiada, zmodyfikowałem następujący kod, który znalazłem tutaj na Stack Overflow ( link ), aby sprawdzić, czy wyświetlono Toast.
@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) { return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
id
Przekazany jest id tematyceView
aktualnie wyświetlane w oknie dialogowym. Możesz również napisać taką metodę:@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) { return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
A teraz szuka
View
określonego ciągu tekstowego.Użyj go w ten sposób:
getRootView(getActivity(), R.id.text_id).perform(click());
źródło
Ids R.id.button1 i R.id.button2 nie będą takie same na różnych urządzeniach. Identyfikatory mogą się zmieniać wraz z wersjami systemu operacyjnego.
Prawidłowym sposobem osiągnięcia tego jest użycie UIAutomator. Uwzględnij zależność UIAutomator w pliku build.gradle
// Set this dependency to build and run UI Automator tests androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
I użyć
// Initialize UiDevice instance UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // Search for correct button in the dialog. UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText")); if (button.exists() && button.isEnabled()) { button.click(); }
źródło
android.R.id.button1
,android.R.id.button2
aandroid.R.id.button3
za „pozytywny”, „neutralny” i „negatywne”, to symbole globalne, które mogą być użyte. Jeśli zdecydujesz się wybierać przyciski za pomocą ich tekstu - co jest całkowicie w porządku - nie potrzebujesz UIAutomator, ale możesz zrobić to samo z EspressoonView(withText("ButtonTest")).perform(click())
.Na wypadek, gdyby ktoś tak jak ja natknął się na to pytanie. Wszystkie odpowiedzi będą działać tylko dla okien dialogowych Z przyciskami dialogowymi. Nie próbuj używać tego do okien dialogowych postępu bez interakcji użytkownika. Espresso ciągle czeka, aż aplikacja przejdzie w stan bezczynności. Dopóki okno dialogowe postępu jest widoczne, aplikacja nie jest bezczynna.
źródło