Espresso - 在列表视图中单击文本

Cha*_*ham 35 android android-testing android-espresso

我试图使用Espresso点击列表视图中的文本.我知道他们有这个指南,但我看不到如何通过查找文本来完成这项工作.这就是我尝试过的

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

正如所料,这不起作用.错误表示层次结构中没有视图.有谁知道如何选择一个字符串?("ASDF"在这种情况下)提前谢谢.

由于@haffax而更新

我收到错误:

com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException:'可从类中分配:class android.widget.AdapterView'匹配层次结构中的多个视图.

第二个错误

有了这段代码

onData(hasToString(startsWith("ASDF"))).inAdapterView(withContentDescription("MapList")).perform(click());
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

com.google.android.apps.common.testing.ui.espresso.PerformException:在视图'上执行'加载适配器数据'时出错,内容描述为:"MapList"'.

引起:java.lang.RuntimeException:找不到匹配的数据:asString(以"ASDF"开头的字符串)


昂达(任何()).inAdapterView(withContentDescription( "降序")).atPosition(X).perform(点击())

haf*_*fax 43

问题是,您尝试将列表视图本身与instanceOf(ListView.class)as参数匹配onData().onData()需要匹配的调整数据的数据匹配ListView,而不是ListView它本身,也并非ViewAdapter.getView()返回,但实际的数据.

如果您的生产代码中有类似的内容:

ListView listView = (ListView)findViewById(R.id.myListView);
ArrayAdapter<MyDataClass> adapter = getAdapterFromSomewhere();
listView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

然后Matcher参数Espresso.onData()应匹配所需的实例MyDataClass.所以,这样的事情应该有效:

onData(hasToString(startsWith("ASDF"))).perform(click());
Run Code Online (Sandbox Code Playgroud)

(你可以使用另一种Matcher方法org.hamcrest.Matchers)

如果您的活动中有多个适配器视图,您可以ViewMatchers.inAdapterView()使用视图匹配器调用,指定AdapterView,如下所示:

onData(hasToString(startsWith("ASDF")))
    .inAdapterView(withId(R.id.myListView))
    .perform(click());
Run Code Online (Sandbox Code Playgroud)