PopupWindow$PopupViewContainer(@xxxxxxxx)
--ListPopupWindow$DropDownListView(@yyyyyyyy)
--RelativeLayout(@zzzzzzz)
ImageView
TextView
--RelativeLayout(@aaaaaaaa)
ImageView
TextView
--RelativeLayout(@aaaaaaaa)
ImageView
TextView
我想知道如何使用espresso android自动化访问RelativeLayout 2中的TextView,因为@id
不存在且值是动态分配的。
以上是下拉列表,我想点击第二个选项。
例如,当我们在任何搜索框中搜索项目时,我们会填充列表。我想点击填充列表中的第二个。所有元素id都是动态的。
答案 0 :(得分:4)
你或许能够做到
onData(anything())
.atPosition(1)
.perform(click());
但是,它只假定一个适配器视图。如果您有其他人,则需要以某种方式选择ListPopupWindow$DropDownListView
。
我知道你说所有的ID都是动态的,但有没有一些你可以通过ID选择的祖先视图?如果是这样,你可以做类似
的事情onData(anything())
.inAdapterView(isDescendantOfA(withId(someAncestorId)))
.atPosition(1)
.perform(click());
作为最后的手段,我们可以匹配类名,但它会有点脆弱:
onData(anything())
.inAdapterView(withClassName(equalTo(
"android.widget.ListPopupWindow$DropDownListView")))
.atPosition(1)
.perform(click());
答案 1 :(得分:2)
我正在努力解决这个问题,我发现你需要使用withText
的组合来选择视图和一个名为RootMatchers.isPlatformPopup()
的选项,它会尝试查找视图中的匹配文本,例如自动完成视图,它实际上是为此目的而设计的。
应该看起来像;
onView(withText("matching text"))
.inRoot(RootMatchers.isPlatformPopup())
.perform(click());