6

使用 Espresso,我希望能够单击 ExpandableListView(名为 CustomExpandableView)的特定子项。listview 创建一组RelativeLayouts(名为MyContainer)。

理想情况下,我想单击 CustomExpandableView 中的特定 MyContainer。但是,我可以只点击第一个。

MyContainer 对象没有我可以引用的唯一 ID,但它们的子对象有,例如 - “text=Sample Text Here 1”

我尝试了几种不同的变体,使用 onData 传递类类型并尝试让孩子处于特定位置,但它只是不起作用。而且,我想避免获取对象并对其进行迭代,直到找到合适的孩子。

这是视图层次结构的一部分供参考(我从层次结构中删除了不重要的信息):

+----->CustomExpandableView{}
|
+-------->线性布局{}
|
+------->TextView{}
|
+------->框架布局{}
|
+-------->面包屑视图{}
|
+--------->图像按钮{}
|
+--------->TextView{}
|
+-------->线性布局{}
|
+------->我的容器{}
|
+-------->ImageView{res-name=thumb, }
|
+-------->ImageView{res-name=divider}
|
+-------->TextView{res-name=label, text=Sample Text Here 1, input-type=0, ime-target=false}
|
+------->我的容器{}
|
+-------->ImageView{res-name=thumb}
|
+-------->ImageView{res-name=divider}
|
+-------->TextView{res-name=label text=Sample Text Here 2, input-type=0, ime-target=false}
|
4

4 回答 4

1

当您尝试使用onData时,Espresso 会尝试通过某些参数不查看视图,而是获取并搜索此适配器中的数据(通过调用Adapter)。ListViewAdapter#getItem

但在这种情况下,ExpandableListView要获取哪些数据并不明显。为此目的,Espresso 提供了onData...().usingAdapterViewProtocol(AdapterViewProtocol). 这个方法javadoc说:

/** * Use a different AdapterViewProtocol if the Adapter implementation does not * satisfy the AdapterView contract like (@code ExpandableListView) */

这个 AdapterViewProtocol 接口看起来像:http ://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/google/android/apps/common/testing/ ui/espresso/action/AdapterViewProtocol.java

实现示例AdapterViewProtocolhttps ://stackoverflow.com/a/40282991/1282732

正确定义后,onData将找到您搜索的项目视图。之后,如果您需要对孩子执行操作或检查。你应该onData#onChildView

于 2016-10-27T10:59:55.433 回答
0

尝试将 instanceOf 与hasSibling匹配器相结合,例如

onView(allOf(is(instanceOf(MyContainer.class)), hasSibling(withText("Sample Text Here 1"))))
于 2013-11-06T05:16:44.417 回答
0

您可以在此处直接关注 Google 提供的EspressoSamples
你必须使用 onData()例如

onData(allOf(is(instanceOf(Map.class)), hasEntry(equalTo("STR"), is("item: 50")))
  .perform(click());
于 2013-12-09T16:02:53.830 回答
0
val listViewItem = onData(anything()).inAdapterView(withId(android.R.id.list)).atPosition(10)

listViewItem.onChildView(withId(android.R.id.checkbox)).check(matches(isChecked()))

如果您知道需要访问子视图的位置,这将很有帮助。在这里,在第一行中,我从列表视图中获得了第 10 个位置视图(即视图组)。在第二行中,我访问其子“复选框”并对其进行断言。仅供参考:这是在 kotlin 中,您可以使用 android studio 将其转换为 java。

于 2019-01-06T18:39:36.923 回答