Пытаюсь написать тесты с новым тестовым набором для Android (Espresso) . Но я не могу найти никакой информации о том, как проверить, отображается ли диалоговое окно, и выполнить с ним какие-либо действия (например, щелкнуть положительные и отрицательные кнопки и т. Д.). Обратите внимание, что диалоговое окно также может отображаться, а WebView
не самим приложением.
Любая помощь будет оценена. Мне просто нужна ссылка или пример кода для основ:
- Проверьте, появляется ли диалоговое окно
- Выполнять щелчки по кнопкам диалога
- Взаимодействовать с внутренним видом диалога (если это настраиваемый вид)
- Preform щелкает за пределами диалогового окна и проверяет, отображается ли он или нет (например, если
setCancelable(false)
был вызван в построителе диалогов, и мы хотим это проверить)
Спасибо за совет!
android
android-espresso
Серж Лотутовичи
источник
источник
Ответы:
Чтобы проверить, появляется ли диалоговое окно, вы можете просто проверить, отображается ли Просмотр с текстом, присутствующим внутри диалогового окна:
onView(withText("dialogText")).check(matches(isDisplayed()));
или, на основе текста с идентификатором
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
Чтобы щелкнуть по кнопке диалогов, сделайте следующее (button1 - ОК, 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());
источник
android.R.id.message
а заголовок имел скрытый идентификаторandroid.R.id.alertTitle
.int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Чтобы ответить на вопрос 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())))); }
id
Прошел в это идентификаторView
отображается в данный момент в вашем диалоге. Вы также можете написать такой метод:@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());
источник
Идентификаторы кнопок R.id.button1 и R.id.button2 не будут одинаковыми на разных устройствах. Идентификаторы могут меняться в зависимости от версии ОС.
Правильный способ добиться этого - использовать UIAutomator. Включите зависимость UIAutomator в свой build.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(); }
источник
android.R.id.button1
,android.R.id.button2
иandroid.R.id.button3
для «позитив», «нейтральный» и «негативный», являются глобальные символы , которые могут быть использованы. Если вы выбираете кнопки с помощью их текста - что совершенно нормально - вам не нужен UIAutomator, но вы можете сделать то же самое с EspressoonView(withText("ButtonTest")).perform(click())
.На всякий случай, если кто-то наткнется на этот вопрос, как и я. Все ответы будут работать только для диалогов с кнопками диалога. Не пытайтесь использовать это для диалоговых окон прогресса без взаимодействия с пользователем. Espresso продолжает ждать, пока приложение перейдет в состояние ожидания. Пока отображается диалог выполнения, приложение не простаивает.
источник