35

我正在尝试使用 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: 'is assignable from class: 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(anything()).inAdapterView(withContentDescription("desc")).atPosition(x).perform(click())

4

3 回答 3

44

问题是,您尝试将列表视图本身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());
于 2014-04-09T19:58:31.840 回答
2

If adapter have custom model class for example 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));
            }
        };
    }

Then call following:

onData(withItemValue("DRINK1")).inAdapterView(withId(R.id.menu_item_grid)).perform(click());
于 2016-06-17T08:05:38.660 回答
0
onData(hasEntry(equalTo(ListViewActivity.ROW_TEXT),is("List item: 25")))
        .onChildView(withId(R.id.rowTextView)).perform(click());

这对我来说最适合行文本数据..

于 2016-01-30T09:02:26.760 回答