使用带有动态元素ID的espresso android进行DropDown值选择

Sta*_*ace 4 android-espresso

PopupWindow$PopupViewContainer(@xxxxxxxx)
--ListPopupWindow$DropDownListView(@yyyyyyyy)
  --RelativeLayout(@zzzzzzz)
    ImageView
    TextView
  --RelativeLayout(@aaaaaaaa)
    ImageView
    TextView
  --RelativeLayout(@aaaaaaaa)
    ImageView
    TextView
Run Code Online (Sandbox Code Playgroud)

我想知道如何使用espresso android自动化访问RelativeLayout 2中的TextView,因为@id它不存在并且值是动态分配的。

上面是下拉列表,我想单击第二个选择。

例如,当我们在任何搜索框中搜索项目时,我们都会得到列表填充。我想单击填充列表中的第二个。所有的元素ID都是动态的。

小智 6

我一直在努力解决这个问题,我发现您需要使用 的组合withText来选择视图和一个名为的选项,该选项RootMatchers.isPlatformPopup()将尝试在视图中找到匹配的文本,例如自动完成视图,它实际上是为此目的而设计的。

它应该看起来像;

onView(withText("matching text"))
.inRoot(RootMatchers.isPlatformPopup())
.perform(click());
Run Code Online (Sandbox Code Playgroud)


Dan*_*rov 5

您也许可以做到

onData(anything())
    .atPosition(1)
    .perform(click());
Run Code Online (Sandbox Code Playgroud)

但是,这仅假设一个适配器视图。如果您还有其他人,则需要以某种方式挑选出来ListPopupWindow$DropDownListView

我知道您说过所有ID都是动态的,但是是否可以通过ID选择某些祖先视图?如果是这样,您可以做类似的事情

onData(anything())
    .inAdapterView(isDescendantOfA(withId(someAncestorId)))
    .atPosition(1)
    .perform(click());
Run Code Online (Sandbox Code Playgroud)

作为最后的选择,我们可以在类名上进行匹配,但这有点脆弱:

onData(anything())
    .inAdapterView(withClassName(equalTo(
        "android.widget.ListPopupWindow$DropDownListView")))
    .atPosition(1)
    .perform(click());
Run Code Online (Sandbox Code Playgroud)