浓缩咖啡 - withEffectiveVisibility vs isDisplayed

Posted

技术标签:

【中文标题】浓缩咖啡 - withEffectiveVisibility vs isDisplayed【英文标题】:Espresso - withEffectiveVisibility vs isDisplayed 【发布时间】:2015-09-23 03:19:36 【问题描述】:

isDisplayedwithEffectiveVisibility 有什么区别?

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 属性。它可以验证三种可见性状态 - VISIBLEINVISIBLEGONE。请记住,此验证不要求视图出现在可见矩形中。视图只需要出现在视图层次结构中。当布局膨胀时,它会创建一个ViewTree,您的视图可以位于该树中的任何位置(即在任何节点中)。他们在树中的可见性状态,通过这种方法进行验证。

所以底线是,当您想要验证当前位于可见矩形内部/外部的视图可见性状态时,您可以使用此方法。示例 - 如果您有一个可滚动的布局,其中 CTA(即按钮)位于最底部并与之交互会更改位于布局最顶部的视图的可见性状态,然后无需滚动到布局的顶部,您可以断言可见性状态更改。

【讨论】:

以上是关于浓缩咖啡 - withEffectiveVisibility vs isDisplayed的主要内容,如果未能解决你的问题,请参考以下文章

带有 AsyncTask 的浓缩咖啡

手机睡着的浓缩咖啡测试

未解决的浓缩咖啡方法

浓缩咖啡 - withEffectiveVisibility vs isDisplayed

带有“hasBackground”的浓缩咖啡测试

勺子和浓缩咖啡测试