Напишите тест, который нажимает на представления внутри PopupWindow
У меня есть ListView внутри PopupWindow, и я хочу щелкнуть второй элемент в списке. Я пробовал следующее:
// Open the popupwindow
onView(withId(R.id.popupwindow_open)).perform(click());
И теперь, когда появляется всплывающее окно, я попытался:
onData(anything()).inAdapterView(withContentDescription("delete")).atPosition(1).perform(
click());
или это:
onView(withContentDescription("delete"))).perform(click());
Но я всегда понимаю, что представление не найдено. Как я могу сделать это в Espresso?
Ответы
Ответ 1
Всплывающие окна и оповещения системы Android отображаются в другом окне. Таким образом, вам нужно попытаться найти представление в этом конкретном окне, а не в главном окне активности.
Espresso предоставляет удобный метод для поиска корневого представления для всплывающих окон. Попробуйте это.
onView(ViewMatchers.withContentDescription("delete"))
.inRoot(RootMatchers.isPlatformPopup())
.perform(ViewActions.click());
Ответ 2
В вашем случае у вас есть два разных окна. Итак, чтобы указать на Espresso, с каким окном вы хотите взаимодействовать, вы должны использовать Root matcher. Попробуйте немного или немного поиграйте с этими решениями:
onView(withContentDescription("delete"))
.inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
.perform(click());
или
onData(withContentDescription("delete"))
.inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
.inAdapterView(withId(R.id.adapter_view))
.perform(click());
Ответ 3
Попробуй это:
onView(withId(android.R.id.id_you_are_looking_for)).perform(click());
В моем случае я использую системные диалоги, поэтому перед идентификатором должен стоять "android", тогда он работает нормально