用于嵌套 RecyclerView 的 Espresso Matcher
Posted
技术标签:
【中文标题】用于嵌套 RecyclerView 的 Espresso Matcher【英文标题】:Espresso Matcher for Nested RecyclerView 【发布时间】:2015-12-07 16:54:06 【问题描述】:所以这是我的层次结构的细分:
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。谢谢。
【问题讨论】:
【参考方案1】:我能够使用上面提供的 @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
匹配器来指定我试图验证的视图的多个特征。
【讨论】:
你将如何测试点击第二个 recyclerview 中的项目? 正如这里提到的***.com/questions/62750213/…,此代码仅适用于 atPosition 的 0 值。【参考方案2】:试试这个
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
的孩子
注意:
.check()
接受一个ViewAssertion
,这意味着与ViewMatcher
匹配的view
给onView()
方法仅由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
【讨论】:
由于check
方法内部的withChild
,此新编辑不起作用。
对不起。我错过了matches()
@adavis 希望你的笔记有用
是的,感谢您的解释,这帮助我更好地专注于这个问题!以上是关于用于嵌套 RecyclerView 的 Espresso Matcher的主要内容,如果未能解决你的问题,请参考以下文章
在recyclerview的嵌套recyclerview中的嵌套列表中添加项目
Android中RecyclerView嵌套RecyclerView或嵌套ListView