用于嵌套 RecyclerView 的 Espresso 匹配器

Espresso Matcher for Nested RecyclerView

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

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

截图如下:

我希望能够验证 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。谢谢。

试试这个

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) 是否有 ID 为 R.id.info_field

的 child

注:

.check() 接受一个 ViewAssertion ,这意味着 view 与你给 onView() 方法的 ViewMatcher 匹配只是由 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() 应用于 onView() 内匹配的 R.id.row_content 而不是 .check() 中断言匹配的 R.id.info_field 调用

我能够使用上面提供的@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 匹配器来指定我试图验证的视图的多个特征。