espresso onData匹配层次结构中的多个视图

时间:2016-05-13 03:26:15

标签: android android-espresso

我有一个带有2个ListView的Activity,我想找到第一个ListView的Child,但是我找到了第一个ListView的Child和第二个ListView,为什么?请帮帮我。

代码:

DataInteraction dataInteraction =
            onData(allOf(
                    withClassName(endsWith("LinearLayout")),
                    hasSibling(withText("9.0")),
                    hasSibling(withText("衬衫"))
            ));
        dataInteraction.onChildView(withId(R.id.order_untake_jijia_listview_jia))
                .atPosition(0);
        dataInteraction.perform(ViewActions.click());

它找到了:

ListView{id=2131493579, res-name=order_jijia_listview, visibility=VISIBLE, width=768,
            height=659, has-focus=false, has-focusable=true, has-window-focus=true, 
            is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, 
            is-layout-requested=false, is-selected=false, root-is-layout-requested=false, 
            has-input-connection=false, x=0.0, y=345.0, child-count=7} ****MATCHES****

ListView{id=2131493586, res-name=order_jijia_pop_listview, visibility=VISIBLE, 
            width=0, height=0, has-focus=false, has-focusable=false, 
            has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, 
            is-focusable=false, is-layout-requested=true, is-selected=false, 
            root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0,
            child-count=0} ****MATCHES****

2 个答案:

答案 0 :(得分:0)

您有两场比赛,因为您必须使用RecyclerView。这就是为什么espresso找到两个在布局中定义了相同id的元素。

看看这个答案: Espresso RecyclerView inside ViewPager

此外,我认为如果您的应用中存在泄漏,它可以匹配多个视图,但我认为您更有可能使用recyclerview并且您只需要以适当的方式访问它。

也有可能你在不同的布局中定义了相同的id,并且其中一些在内存中,即使它们不在同一时间在屏幕上,在这种情况下你可以使用isCompletelyDisplayed()方法来匹配显示的那个。

希望这有帮助。

答案 1 :(得分:0)

您必须指出espresso应该执行搜索/操作的适配器视图:

onData(allOf(withClassName(endsWith("LinearLayout")),
        hasSibling(withText("9.0")),
        hasSibling(withText("衬衫"))))
             .inAdapterView(withId(R.id.order_jijia_listview))
             .onChildView(withId(R.id.order_untake_jijia_listview_jia))
             .atPosition(0)
             .perform(click());