Проверьте, отображается ли диалоговое окно с эспрессо
Я пытаюсь написать несколько тестов с новой android-test-kit (Эспрессо). Но я не могу найти никакой информации о как проверьте, отображается ли диалоговое окно, и выполните над ним некоторые действия (например, нажатие положительных и отрицательных кнопок и т. д.). Обратите внимание, что диалоговое окно может также отображаться с помощью WebView
, а не самим приложением.
любая помощь будет оценили. Мне просто нужна ссылка, или какой-то пример кода основы:
- Проверьте, появляется ли диалоговое окно
- выполнение кликов по диалоговым кнопкам
- взаимодействие с внутренним видом диалогового окна (если это пользовательский вид)
- преформа щелкает вне диалогового окна и проверяет, отображается ли она или нет (например, если
setCancelable(false)
был вызван в диалоговом конструкторе, и мы хотим это проверить)
Спасибо за совет!
6 ответов:
чтобы проверить, появляется ли диалоговое окно, вы можете просто проверить, отображается ли Вид с текстом, который присутствует внутри диалогового окна:
onView(withText("dialogText")).check(matches(isDisplayed()));
или на основе текста с идентификатором
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
чтобы нажать на кнопку диалогов сделать это (button1-OK, button2-отмена):
onView(withId(android.R.id.button1)).perform(click());
обновление
- Я думаю, что это возможно, так как кофе имеет поддержка нескольких окон.
- не уверен, что щелкнул за пределами пользовательский диалоговый вид, но для проверки, отображается ли он или нет, вам нужно создать свой пользовательский сопоставитель и проверить его внутри.
Я в настоящее время использую это, и это, кажется, работает нормально.
onView(withText(R.string.my_title)) .inRoot(isDialog()) // <--- .check(matches(isDisplayed()));
Если у вас есть AlertDialog так:
вы можете проверить, отображаются ли компоненты:
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()));
действие:
onView(withId(android.R.id.button3)).perform(click());
на всякий случай кто-нибудь наткнется на этот вопрос, как я сделал. Все ответы будут работать только для диалогов с диалоговыми кнопками. Не пытайтесь использовать это для диалогов прогресса без взаимодействия с пользователем. Эспрессо продолжает ждать, пока приложение войдет в состояние ожидания. Пока отображается диалоговое окно хода выполнения, приложение не простаивает.
чтобы ответить на вопрос 4, который принятый ответ не делает, я изменил следующий код, который я нашел здесь на Stack Overflow (ссылке) для проверки того, был показан тост.
@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) { return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
The
id
передается идентификатор aView
в настоящее время отображается в диалоговом окне. Вы также можете написать метод следующим образом:@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) { return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
и теперь он ищет
View
содержит определенную текстовую строку.использовать его как Итак:
getRootView(getActivity(), R.id.text_id).perform(click());
кнопка идентификаторы ИД Р..button1 и ИД Р..button2 находились не будешь же на всех устройствах. Идентификаторы могут меняться вместе с версиями ОС.
правильный способ достичь этого-использовать UIAutomator. Включите зависимость UIAutomator в свою сборку.gradle
// Set this dependency to build and run UI Automator tests androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
и использовать
// 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(); }