match(not(isDisplayed()))失败,出现NoMatchingViewException


85

我正在尝试测试UI视图的缺失。视图选择器如下:

public static ViewInteraction onMyTestUi() {
    return onView(withId(R.id.myTestId));
}

选择器可以很好地检查视图是否显示,但是在检查视图是否未显示时会出错。我正在使用如下:

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

但是我收到以下错误:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException:找不到层次结构中与View匹配的视图:id:is如果目标视图不属于视图层次结构,则可能需要使用Espresso.onData从以下AdapterViews之一加载它:android.widget.ListView {...}

这很奇怪。我正在检查缺少UI,并且期望不会找到此视图。那为什么Espresso会抛出错误?请在这里提出可能出了什么问题。

谢谢,惊讶!

Answers:


161

需要使用doesNotExist()代替。在这里找到。

如果视图在视图层次结构中存在,但处于不可见状态(可见性设置为“不可见”),请使用not(isDisplayed)。但是,如果视图在视图层次结构中根本不存在(例如,可见性设置为“ GONE”),doesNotExist()则使用该视图。


17
它对我不起作用,但onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));确实起作用。
Sithu

35
@Sithu-取决于应用程序。如果您要查找的视图位于视图层次结构中但不可见,则需要使用not(isDisplayed)。但是,如果视图不在视图层次结构中,则需要使用didNotExist()。
user846316 '16

1
我在布局的按钮,但能见度集View.GONEonCreate根据用户的角色。那么,这是否意味着它在视图层次结构中并且不可见?
Sithu

是的 多亏了这个,super才解决了我的问题,并使我的早晨更好了(去睡这个问题)。
Booger

如果视图已从视图层次结构中移出(当动作导致转移到另一个活动时可能发生),则应使用ViewAssertions.doesNotExist():示例中的View.GONE示例是错误的并且具有误导性。请编辑您的答案
metis

18

也可以使用您的方法,但类似这样:

onView(withId(R.id.next)).check(matches(not(isDisplayed())));

13
onView(withText("")).check(doesNotExist());

5
这是部分正确的答案。仅当布局中不存在targedet视图(视图层次结构不包含该视图)时,此方法才有效。但是,如果目标视图确实存在于布局视图层次结构中,但其可见性状态为GONE或INVISIBLE,则此断言将失败。在这种情况下的断言失败消息将指出:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid

正确,所以我认为您可以使用详细的视图层次结构检查错误消息。
奥利维亚·廖

8

如果您想检查View或者是不可见的不存在

public static ViewAssertion isNotDisplayed() {
    return new ViewAssertion() {
        @Override
        public void check(View view, NoMatchingViewException noView) {
            if (view != null && isDisplayed().matches(view)) {
                throw new AssertionError("View is present in the hierarchy and Displayed: "
                        + HumanReadables.describe(view));
            }
        }
    };
}

用法:

onView(withId(R.id.someView)).check(isNotDisplayed());

谢谢您-恕我直言,这是广义“检查视图是否从屏幕上消失”的最佳解决方案。不过,有一个更正:IME,用法是onView(withId(R.id.someView)).check(isNotDisplayed());
字符串

4

如果您检查视图可见性“ withEffectiveVisibility”,则可以尝试使用此选项

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))

其他人没有用,但是这个人用了。谢谢
Saul_programa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.