Проверьте, отображается ли диалог с эспрессо
Я пытаюсь написать несколько тестов с помощью нового андроида-теста-набора (Espresso). Но я не могу найти информацию о как проверить, отображается ли диалоговое окно и выполнять некоторые действия над ним (например, щелчок положительных и отрицательных кнопок, e.t.c.). Обратите внимание, что диалог может также отображаться с помощью WebView
, а не с помощью приложения.
Любая помощь будет оценена по достоинству. Мне просто нужна ссылка или какой-то пример кода для основ:
- Проверьте, отображается ли диалоговое окно
- Выполнять клики по кнопкам диалога
- Взаимодействие с внутренним представлением диалога (если это пользовательский вид)
- Предварительная задержка заходит за диалоговое окно и проверяет, отображается ли она или нет (например, если
setCancelable(false)
был вызван в построителе диалогов, и мы хотим проверить это)
Спасибо вам за консультацию!
Ответы
Ответ 1
-
Чтобы проверить, отображается ли диалоговое окно, вы можете просто проверить, отображается ли вид с текстом, который присутствует в диалоговом окне:
onView(withText("dialogText")).check(matches(isDisplayed()));
или, на основе текста с id
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
-
Чтобы щелкнуть по кнопке диалога, сделайте это (кнопка1 - ОК, кнопка2 - Отмена):
onView(withId(android.R.id.button1)).perform(click());
UPDATE
- Я думаю, это возможно, поскольку Espresso имеет поддержку нескольких окон.
- Не уверен, что нужно щелкнуть вне пользовательского диалогового окна, но для проверки того, отображается ли оно или нет, вам нужно создать свой настраиваемый соединитель и проверить его внутри.
Ответ 2
В настоящее время я использую это, и, похоже, он работает нормально.
onView(withText(R.string.my_title))
.inRoot(isDialog()) // <---
.check(matches(isDisplayed()));
Ответ 3
Если у вас есть 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
Чтобы ответить на вопрос 4, на который не ответил принятый ответ, я изменил следующий код, который я нашел здесь в разделе "Переполнение стека" (ссылка) для проверки того,.
@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());
Ответ 5
На всякий случай кто-то наткнется на этот вопрос, как я. Все ответы будут работать только для диалогов с диалоговыми кнопками. Не пытайтесь использовать это для диалогов прогресса без взаимодействия с пользователем. Espresso продолжает ждать, пока приложение не войдет в незанятое состояние. Пока отображается диалог выполнения, приложение не праздно.
Ответ 6
Идентификаторы кнопок 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();
}