嵌套RecyclerView的Espresso Matcher

时间:2015-12-07 16:54:06

标签: android android-recyclerview android-espresso ui-testing

所以这是我的层次结构的细分:

RecyclerView --> LinearLayout --> RecyclerView --> FrameLayout -> FrameLayout 

这是一个截图:

layout

我希望能够验证显示文本的FrameLayout。这是我到目前为止所尝试的:

onView(withRecyclerView(R.id.container_list).atPositionOnView(0, R.id.row_content))
                .check(matches(withRecyclerView(R.id.row_content).atPositionOnView(0, R.id.info_field)))
                .check(matches(isDisplayed()));

但它会导致AmbiguousViewMatcherException。关于如何验证嵌套视图的任何想法?应该提到我使用here中的ViewMatcher。感谢。

2 个答案:

答案 0 :(得分:8)

我能够使用上面提供的解释@manidesto进行一些细微的更改来验证它。

onView(allOf(isDescendantOfA(withRecyclerView(R.id.container_list).atPosition(0)),
                isDescendantOfA(withRecyclerView(R.id.row_content).atPosition(0)),
                withId(R.id.info_field)))
                .check(matches(isDisplayed()));

主要增强功能是我使用allOf匹配器来指定我尝试验证的视图的多个特征。

答案 1 :(得分:3)

试试这个

onView(withRecyclerView(R.id.container_list).atPositionOnView(0, R.id.row_content))
    .check(matches(withChild(withId(R.id.info_field))))

这只是检查View(R.id.row_content)是否有身份R.id.info_field

的孩子

注意:

.check()接收ViewAssertion,这意味着view方法所提供的ViewMatcher所匹配的onView()仅由{{1}声明}}

所以当你这样做时

ViewAssertion

onView(withRecyclerView(R.id.container_list).atPositionOnView(0, R.id.row_content)) .check(matches(withChild(withId(R.id.info_field)))) .check(matches(isDisplayed())) - ViewMatcher适用于isDisplayed()匹配的内R.id.row_content而不是onView()声称匹配R.id.info_field来电