浓缩咖啡 - withEffectiveVisibility vs isDisplayed
Posted
技术标签:
【中文标题】浓缩咖啡 - withEffectiveVisibility vs isDisplayed【英文标题】:Espresso - withEffectiveVisibility vs isDisplayed 【发布时间】:2015-09-23 03:19:36 【问题描述】:isDisplayed
和 withEffectiveVisibility
有什么区别?
onView(withText("Much Dagger")).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)));
onView(withText("Much Dagger")).check(matches(ViewMatchers.isDisplayed());
【问题讨论】:
【参考方案1】:根据文档
返回匹配 @link View 的匹配器,其“有效”可见性设置为给定值。有效可见性不仅考虑视图的可见性值,还考虑其祖先的可见性值。在 View.VISIBLE 的情况下,这意味着视图及其所有祖先的可见性 = VISIBLE。在 GONE 和 INVISIBLE 的情况下,情况正好相反 - 任何 GONE 或 INVISIBLE 父级都会使其所有子级都具有有效可见性。
注意:
与名称可能暗示的相反,视图可见性并不直接转化为视图是否显示在屏幕上(为此使用 isDisplayed())。例如,视图及其所有祖先的可见性 = VISIBLE,但可能需要滚动到视图才能对用户真正可见。除非您在测试中专门针对可见性值,否则请使用 isDisplayed。
因此,如果用于验证视图是否可见,请使用 isDisplayed(),但如果不可见且已消失,请使用 withEffectiveVisibilty()
【讨论】:
【参考方案2】:正如前面的答案所暗示的,isDisplayed()
验证目标视图是否存在于屏幕的可见矩形中。但是,使用它有一个问题。根据官方文档,isDisplayed()
-
选择部分显示的视图(例如:全高/全宽 视图的高度/宽度大于可见的高度/宽度 矩形)。
但实际上,这总是行不通的。如果目标视图在可见矩形中的可见度超过 80%,则只有 isDisplayed()
有效。但是如果您的视图的可见性低于该阈值,那么您需要使用isDisplayingAtLeast()
。此方法采用自定义百分比量,您可以感觉到 视图在可见矩形中占据。如果您的视图不在可见矩形(0% 可见)或在可见矩形中完全可见(100% 可见),这将不起作用。如果要确保视图是否完全存在于可见的 Rectangle 中,则可以使用isCompletelyDisplayed)
。
底线是,如果您想确保目标视图是否对用户可见(即作为用户,您可以在屏幕上看到它),然后选择isDisplayed()
或它的其他变体。
现在达到withEffectiveVisibility()
的目的。它基本上确保了 Target 视图设置了所需的 Visibility 属性。它可以验证三种可见性状态 - VISIBLE
、INVISIBLE
和 GONE
。请记住,此验证不要求视图出现在可见矩形中。视图只需要出现在视图层次结构中。当布局膨胀时,它会创建一个ViewTree
,您的视图可以位于该树中的任何位置(即在任何节点中)。他们在树中的可见性状态,通过这种方法进行验证。
所以底线是,当您想要验证当前位于可见矩形内部/外部的视图可见性状态时,您可以使用此方法。示例 - 如果您有一个可滚动的布局,其中 CTA(即按钮)位于最底部并与之交互会更改位于布局最顶部的视图的可见性状态,然后无需滚动到布局的顶部,您可以断言可见性状态更改。
【讨论】:
以上是关于浓缩咖啡 - withEffectiveVisibility vs isDisplayed的主要内容,如果未能解决你的问题,请参考以下文章