Espresso - withEffectiveVisibility与isDisplayed的区别

26

isDisplayed和withEffectiveVisibility有什么区别?

onView(withText("Much Dagger")).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)));


onView(withText("Much Dagger")).check(matches(ViewMatchers.isDisplayed());
2个回答

30
根据文档,返回一个匹配器,用于匹配 "有效" 可见性设置为给定值的{@link View}。有效可见性不仅考虑视图自身的可见性值,还考虑其祖先的可见性值。在 View.VISIBLE 的情况下,这意味着视图及其所有祖先都具有 visibility=VISIBLE。在 GONE 和 INVISIBLE 的情况下,则相反-任何 GONE 或 INVISIBLE 父级都将使其所有子项具有其有效可见性。
注意:与名称可能暗示的相反,视图的可见性并不直接转换为视图是否显示在屏幕上(使用 isDisplayed() 进行判断)。例如,视图及其所有祖先可以具有 visibility=VISIBLE,但是用户可能需要滚动才能实际看到该视图。除非您专门针对可见性值进行测试,否则请使用 isDisplayed。
因此,如果用于验证视图是否可见,请使用isDisplayed(),但对于其他验证,如不可见和 gone,请使用withEffectiveVisibilty()。

1
正如之前的回答所建议的那样,isDisplayed()验证目标视图是否出现在屏幕可见矩形内。然而,使用它有一个注意点。根据官方文档,isDisplayed() -

选择部分显示的视图(例如:视图的完整高度/宽度大于可见矩形的高度/宽度)。

但实际上,这并不总是有效的。如果目标视图在可见矩形中的可见比例超过80%,则只有isDisplayed()有效。但如果您的视图的可见性低于该阈值,则需要使用isDisplayingAtLeast()。此方法采用您认为视图在可见矩形中占据的自定义百分比量。如果您的视图不在可见矩形中(0%可见)或在可见矩形中完全可见(100%可见),则此方法无效。如果您想确保视图完全出现在可见矩形中,则可以使用isCompletelyDisplayed)
底线是,如果您要确保目标视图对用户可见(即作为用户,您可以在屏幕上看到它),则请使用isDisplayed()或其他其变体。
现在来谈谈withEffectiveVisibility()的目的。它基本上确保目标视图具有所需的可见性属性设置。它可以验证三种可见性状态-VISIBLEINVISIBLEGONE。请记住,此验证不需要将视图放置在可见矩形中。视图只需要出现在视图层次结构中。当充气布局时,它会创建一个ViewTree,您的视图可以位于该树中的任何位置(即在任何节点中)。此方法验证它们在树中拥有的可见状态。
因此,底线是,当您想要验证当前处于可见/不可见矩形内/外的视图可见性状态时,可以使用此方法。例如-如果您有一个可滚动的布局,在其中CTA(即按钮)位于底部,并且与之交互会更改布局顶部的视图的可见性状态,则无需滚动到布局顶部,即可断言可见性状态的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接