Espresso检查视图要么不显示,要么不显示

问题描述 投票:4回答:3

以下语句不起作用,因为doesNotExist()返回ViewAssertion而不是匹配器。没有try-catch的任何方式使它工作?

.check(either(matches(doesNotExist())).or(matches(not(isDisplayed()))));
android android-espresso hamcrest
3个回答
4
投票

我有同样的问题,我的一个观点最初没有某个视图,但可以添加它并稍后隐藏它。用户界面依赖于哪些状态的背景活动被破坏了。

我最后只是编写了一个关于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));
                }
            }
        };
    }
}

0
投票

如果要检查层次结构中是否存在视图,请使用以下断言。

ViewInteraction.check(doesNotExist());

如果要检查层次结构中是否存在视图但未向用户显示,请使用以下断言。

ViewInteraction.check(matches(not(isDisplayed())));

希望这可以帮助。


0
投票

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)
            )
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.