Напишите тест, который нажимает на представления внутри 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", тогда он работает нормально