Android Espresso - нажмите на элемент навигационного ящика с изображением и текстом

Как я могу щелкнуть элемент навигационной панели, если навигационная панель состоит из списка строк с изображением и текстовым представлением?

Я использовал пример исходного кода теста Espresso из: git / testapp_test / src / main / java / com / google / android / apps / common / testing / ui / testapp / DrawerActionsTest.java

Я получил DrawerActions и DrawerMatchers из вклада и поместил их локально в мой тестовый проект.

Строка навигационного ящика:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="48dp" 
    android:background="@drawable/list_selector">

    <ImageView
        android:id="@+id/icon"
        etc ... />

    <TextView
        android:id="@+id/title"
        etc.... />

</RelativeLayout>

Элементы навигации:

public class NavDrawerItem {
    public String title;
    public int icon;
    ....

    // a matcher
    @Override
    public boolean equals( Object mob2) {
        String otherName = ((NavDrawerItem) mob2).title;
        return( title.equals( otherName));
    }
} 

NavigationDrawerAdapter заполняет представление ящика навигации.

Источник теста Espresso открывает ящик, закрывает его, открывает его снова ... но я не могу найти соответствие для первого элемента "Импорт". Таким образом, тест останавливается на щелчке.

Код является:

public LearnerAppAutoTest() {
    super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
    super.setUp();
    getActivity();
}

public void testOpenAndCloseDrawer() {
    openDrawer(R.id.drawer_layout);
    closeDrawer(R.id.drawer_layout);

    openDrawer(R.id.drawer_layout);
    onView(withId(R.id.drawer_layout)).check(matches(isOpen()));

    String rowContents = "Import";

    // Option 1: too many lists having an "Import" string
    onData( allOf( is( instanceOf( String.class)), is( rowContents))).perform(click());

    // Option 2: selecting on NavDrawerItem.class and a matcher
    //    ... still all matches, also in other lists match. Why? They don't have NavDrawerItems. 
    onData( allOf( is( instanceOf( NavDrawerItem.class)), is( rowContents))).perform(click());

    // Option 3: custom matcher
    //   ... still all matches, also in other lists match. Why?
    onData( allOf( instanceOf( NavDrawerItem.class), navDrawerItemHavingName( rowContents))).perform( click());

  }

Итак, что бы я ни программировал, есть несколько сопоставителей ... даже из списков, в которых нет классов NavDrawerItem.

Ответы на вопрос(1)

Ваш ответ на вопрос