2015-04-03 54 views
3
PopupWindow$PopupViewContainer(@xxxxxxxx) 
--ListPopupWindow$DropDownListView(@yyyyyyyy) 
    --RelativeLayout(@zzzzzzz) 
    ImageView 
    TextView 
    --RelativeLayout(@aaaaaaaa) 
    ImageView 
    TextView 
    --RelativeLayout(@aaaaaaaa) 
    ImageView 
    TextView 

我想知道如何使用Android的咖啡自动化访问TextView的在RelativeLayout的2,作为@id不存在和值动态分配。下拉值选择用咖啡与Android动态元素的ID

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

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

回答

3

您也许能够只是做

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

是每个ID在弹出的动态,当我看到树视图(在Android Studio中),用于这个弹出它不是在MainSearchActivity显示,但其在树视图PopupWindow不同的行动:@xxxxxxxx。现在,当我尝试上面的代码时,它抛出错误“android.support.test.espresso.NoMatchingViewException”,因为PopupWindow不在主要活动中,它不是指弹出窗口中的布局,而是从MainSearchActivity引用。我想在执行上面的代码时将焦点设置为popupwindow,它应该引用popupwindow布局而不是MainActivityWindow。 – StackTrace 2015-04-07 01:13:54

+0

对此的任何解决方案?我遇到了多个纺纱者的问题。 – JPM 2017-08-08 22:30:13

+0

@JPM你应该使用'inAdapterView',但是你传递哪个匹配器取决于你的视图层次结构。你的匹配者有不同的ID吗?通过'withId'。不同的初始选择?通过'SpinnerText'传递给它。不同的父容器(具有不同的ID)?传递它isDescendantOfA'。 – 2017-08-09 18:30:22

0

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

它应该看起来像这样;

onView(withText("matching text")) 
.inRoot(RootMatchers.isPlatformPopup()) 
.perform(click());