使用具有动态元素id的espresso android选择DropDown值

时间:2015-04-03 19:35:38

标签: android-espresso

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都是动态的。

2 个答案:

答案 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());