【问题标题】:matches(not(isDisplayed())) fails with NoMatchingViewExceptionmatch(not(isDisplayed())) 失败并出现 NoMatchingViewException
【发布时间】:2015-02-10 12:24:48
【问题描述】:

我正在尝试测试 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: 层次结构中没有找到匹配的视图:带有 id:is If 目标视图不是视图层次结构的一部分,您可能需要使用 Espresso.onData 从以下之一加载它 AdapterViews:android.widget.ListView{...}

这很奇怪。我正在检查 UI 的缺失,并且预计不会找到此视图。那么为什么 Espresso 会抛出错误呢? 请提出这里可能出现的问题。

谢谢, 惊讶!

【问题讨论】:

    标签: android-espresso


    【解决方案1】:

    需要改用doesNotExist()。 找到here

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

    【讨论】:

    • 它对我不起作用,但 onView(withId(R.id.myTestId)).check(matches(not(isDisplayed()))); 确实起作用。
    • @Sithu - 这取决于应用程序。如果您要查找的视图在视图层次结构中但不可见,则需要使用 not(isDisplayed)。但是,如果视图不在视图层次结构中,则需要使用 doesNotExist()。
    • 我在布局中有按钮,但在onCreate 中根据用户角色设置可见性View.GONE。那么,是否意味着它在视图层次结构中并且不可见?
    • 是的!谢谢你,超级解决了我的问题,让我的早晨好多了(带着这个问题睡觉了)。
    • 如果视图从视图层次结构中消失——当一个动作导致转换到另一个活动时可能会发生这种情况——你应该使用 ViewAssertions.doesNotExist():你的例子中的 View.GONE 例子是错误的并且误导。请编辑您的答案
    【解决方案2】:

    也可以使用你的方法,但是是这样的:

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

    【讨论】:

      【解决方案3】:
      onView(withText("")).check(doesNotExist());
      

      【讨论】:

      • 这是一个部分正确的答案。这仅在布局中不存在目标视图时才有效(视图层次结构不包含此视图)。但是,如果目标视图实际存在于布局视图层次结构中,但其可见性状态为 GONE 或 INVISIBLE,则此断言将失败。在这种情况下,断言失败消息将声明:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
      • 正确,所以我认为您可以使用详细的视图层次结构检查错误消息。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果您想检查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());
        猜你喜欢
        • 1970-01-01
        • 2016-01-02
        • 2011-07-07
        • 2023-03-21
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多