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 (х).Произвести (нажмите())
Ответы
Ответ 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());
Это лучше всего подходит для меня с текстовыми данными строки.