Подтвердить что ты не робот

Espresso - Щелчок по тексту в виде списка

Я пытаюсь щелкнуть по тексту в виде списка, используя Espresso. Я знаю, что они это руководство, но я не вижу, как это сделать, ища текст. Это то, что я пробовал

Espresso.onData(Matchers.allOf(Matchers.is(Matchers.instanceOf(ListView.class)), Matchers.hasToString(Matchers.startsWith("ASDF")))).perform(ViewActions.click());

Как и ожидалось, это не сработало. Ошибка не указала вид в иерархии. Кто-нибудь знает, как выбрать строку? ("ASDF" в этом случае) Спасибо заранее.

Обновление из-за @haffax

Я получил ошибку:

com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException: 'присваивается классу: class android.widget.AdapterView' соответствует нескольким представлениям в иерархии.

Вторая ошибка

С помощью этого кода

onData(hasToString(startsWith("ASDF"))).inAdapterView(withContentDescription("MapList")).perform(click());

Я получаю эту ошибку

com.google.android.apps.common.testing.ui.espresso.PerformException: Ошибка выполнения "данных адаптера нагрузки" в представлении с описанием содержимого: "MapList".

Вызвано: java.lang.RuntimeException: не найдено данных: asString (строка, начинающаяся с ASDF)


Решение

Ondata (ничего()). InAdapterView (withContentDescription ( "убывание" )). AtPosition (х).Произвести (нажмите())

4b9b3361

Ответ 1

Проблема заключается в том, что вы пытаетесь сопоставить представление списка с аргументом instanceOf(ListView.class) как для onData(). onData() требует сопоставления данных, который соответствует адаптированным данным ListView, а не самому ListView, а также не View, возвращаемому Adapter.getView(), а фактическим данным.

Если в вашем производственном коде есть что-то подобное:

ListView listView = (ListView)findViewById(R.id.myListView);
ArrayAdapter<MyDataClass> adapter = getAdapterFromSomewhere();
listView.setAdapter(adapter);

Затем аргумент Matcher Espresso.onData() должен соответствовать желаемому экземпляру MyDataClass. Итак, что-то вроде этого должно работать:

onData(hasToString(startsWith("ASDF"))).perform(click());

(Вы можете использовать другой Matcher, используя метод org.hamcrest.Matchers)

Если у вас есть несколько видов адаптеров в вашей деятельности, вы можете вызвать ViewMatchers.inAdapterView() с помощью макета представления, который определяет AdapterView следующим образом:

onData(hasToString(startsWith("ASDF")))
    .inAdapterView(withId(R.id.myListView))
    .perform(click());

Ответ 2

Если у адаптера есть собственный класс модели, например Item:

public static Matcher<Object> withItemValue(final String value) {
        return new BoundedMatcher<Object, Item>(Item.class) {
            @Override
            public void describeTo(Description description) {
                description.appendText("has value " + value);
            }

            @Override
            public boolean matchesSafely(Item item) {
                return item.getName().toUpperCase().equals(String.valueOf(value));
            }
        };
    }

Затем выполните следующие действия:

onData(withItemValue("DRINK1")).inAdapterView(withId(R.id.menu_item_grid)).perform(click());

Ответ 3

onData(hasEntry(equalTo(ListViewActivity.ROW_TEXT),is("List item: 25")))
        .onChildView(withId(R.id.rowTextView)).perform(click());

Это лучше всего подходит для меня с текстовыми данными строки.