android 咖啡检查视图doesNotExist或not isDisplayed

5kgi1eie  于 2023-04-10  发布在  Android
关注(0)|答案(4)|浏览(131)

下面的语句不起作用,因为doesNotExist()返回一个ViewAssertion而不是一个匹配器。有没有办法让它在没有try-catch的情况下工作?

.check(either(matches(doesNotExist())).or(matches(not(isDisplayed()))));
3npbholx

3npbholx1#

如果你想检查一个视图是否在层次结构中不存在,请使用下面的Assert。

ViewInteraction.check(doesNotExist());

如果你想检查一个视图是否存在于层次结构中,但没有显示给用户,请使用下面的Assert。

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

希望这能帮上忙。

s5a0g9ez

s5a0g9ez2#

我也遇到了同样的问题,我的一个视图最初没有特定的视图,但可以添加它并在以后隐藏它。UI的状态取决于后台活动是否被破坏。
我最后只是写了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));
                }
            }
        };
    }
}
pb3s4cty

pb3s4cty3#

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)
            )
        }
    }
}
ukxgm1gy

ukxgm1gy4#

我也遇到过类似的情况,我相信这个方法是有效的,我会检查显示的视图不存在,需要不显示或者不在视图层次结构中:

onView(allOf(withId(R.id.viewId), isDisplayed())).check(doesNotExist())

相关问题