matches(not(isDisplayed()))与NoMatchingViewException失败

use*_*316 70 android-espresso

我试图测试缺少UI视图.视图选择器如下:

public static ViewInteraction onMyTestUi() {
    return onView(withId(R.id.myTestId));
}
Run Code Online (Sandbox Code Playgroud)

选择器可以正常检查是否显示视图,但在检查视图是否未显示时出错.我使用如下:

 onMyTestUi().check(matches(not(isDisplayed())));
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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

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

谢谢,惊讶!

use*_*316 138

需要doesNotExist()改用.在这里找到.

  • @Sithu-它取决于应用程序.如果您要查找的视图位于视图层次结构中但不可见,则需要使用not(isDisplayed).但是,如果视图层次结构中没有视图,则需要使用doesNotExist(). (27认同)
  • 它不适合我,但是`onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));`确实有效. (13认同)
  • View.GONE 可与 not(isDisplayed() 配合使用,但不适用于 doesNotExist()。如果可见性消失,doesNotExist 返回 true。我尝试使用示例。在您提供的链接中,没有任何与 View.GONE 相关的内容。 (2认同)

Mor*_*zov 13

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

onView(withId(R.id.next)).check(matches(not(isDisplayed())));
Run Code Online (Sandbox Code Playgroud)


小智 12

onView(withText("")).check(doesNotExist());
Run Code Online (Sandbox Code Playgroud)

  • 这是一个部分正确的答案.这仅在布局中不存在targedet视图时才起作用(视图层次结构不包含此视图.)但是,如果目标视图实际存在于布局视图层次结构中,则此断言将失败,但它的可见性状态为GONE或INVISIBLE.在这种情况下,断言失败消息将声明:`android.support.test.espresso.base.DefaultFailureHandler $ AssertionFailedWithCauseError:视图存在于层次结构中...... (2认同)

Pab*_*bel 10

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

    onView(withId(R.id.YOURVIEW)).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Run Code Online (Sandbox Code Playgroud)


jim*_*251 7

如果您想检查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));
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

用法:

onView(withId(R.id.someView)).check(isNotDisplayed());
Run Code Online (Sandbox Code Playgroud)