以下语句不起作用,因为doesNotExist()
返回ViewAssertion
而不是匹配器。没有try-catch
的任何方式使它工作?
.check(either(matches(doesNotExist())).or(matches(not(isDisplayed()))));
我有同样的问题,我的一个观点最初没有某个视图,但可以添加它并稍后隐藏它。用户界面依赖于哪些状态的背景活动被破坏了。
我最后只是编写了一个关于doesNotExist实现的变体:
public class ViewAssertions {
public static ViewAssertion doesNotExistOrGone() {
return new ViewAssertion() {
@Override
public void check(View view, NoMatchingViewException noView) {
if (view != null && view.getVisibility() != View.GONE) {
assertThat("View is present in the hierarchy and not GONE: "
+ HumanReadables.describe(view), true, is(false));
}
}
};
}
}
如果要检查层次结构中是否存在视图,请使用以下断言。
ViewInteraction.check(doesNotExist());
如果要检查层次结构中是否存在视图但未向用户显示,请使用以下断言。
ViewInteraction.check(matches(not(isDisplayed())));
希望这可以帮助。
not(isDisplayed)
并不完美,因为即可在ScrollView中显示视图但在屏幕下方。
简单检查view.getVisibility() != View.GONE
也不是100%的解决方案。如果隐藏了视图父视图,则视图将被有效隐藏,因此测试应该通过该方案。
我建议检查视图及其父项是否可见:
fun isNotPresented(): ViewAssertion = object : ViewAssertion {
override fun check(view: View?, noViewFoundException: NoMatchingViewException?) {
if (view != null) {
if (view.visibility != View.VISIBLE) {
return
}
var searchView: View = view
while (searchView.parent != null && searchView.parent is View) {
searchView = searchView.parent as View
if (searchView.visibility != View.VISIBLE) {
return
}
}
assertThat<Boolean>(
"View is present in the hierarchy and it is visible" + HumanReadables.describe(view),
true,
`is`(false)
)
}
}
}