matchs(not(isDisplayed()))はNoMatchingViewExceptionで失敗します


87

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:一致する階層内のビューが見つかりません:with id:isターゲットビューがビュー階層の一部でない場合は、Espresso.onDataを使用して次のAdapterViewsのいずれかからロードします:android.widget.ListView {...}

変ですね。UIがないことを確認していますが、このビューが見つからないことが予想されます。では、なぜEspressoがエラーをスローしているのでしょうか。ここで何がうまくいかないのか提案してください。

ありがとう、びっくり!

回答:


166

doesNotExist()代わりに使用する必要があります。ここで見つかりまし

ビューがビュー階層にあるが非表示状態(可視性が「INVISIBLE」に設定されている)の場合は、を使用しますnot(isDisplayed)。ただし、ビューがビュー階層にまったく存在しない場合(たとえば、可視性が「GONE」に設定されている場合)doesNotExist()が使用されます。


17
それは私にはうまくいきませんが、onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));うまくいきました。
Sithu 2016

37
@ Sithu-アプリによって異なります。探しているビューがビュー階層にあるが非表示の場合は、not(isDisplayed)を使用する必要があります。ただし、ビューがビュー階層にない場合は、doesNotExist()を使用する必要があります。
user846316 2016

1
レイアウトにボタンがありますが、ユーザーロールに可視性View.GONEを設定onCreateします。それで、それはそれがビュー階層にあり、見えないことを意味しますか?
Sithu 2016

うん!これに感謝し、私の問題を超解決し、私の朝をずっと良くしました(この問題で寝ました)。
鼻くそ2018

ビューがビュー階層から削除された場合(アクションによって別のアクティビティへの遷移が発生した場合に発生する可能性があります)、ViewAssertions.doesNotExist()を使用する必要があります。例のView.GONEの例は間違っており、誤解を招く可能性があります。あなたの答えを編集してください
メティス

18

あなたの方法でも動作しますが、次のようなものです:

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

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

5
これは部分的に正しい答えです。これは、ターゲットビューがレイアウトに存在しない場合にのみ機能します(ビュー階層にこのビューが含まれていません)。ただし、ターゲットビューが実際にレイアウトビュー階層に存在する場合、このアサーションは失敗しますが、その可視性の状態はGONEまたはINVISIBLEです。その場合のアサーションエラーメッセージは、状態だろう:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
サイモン・ドロイド

正解です。詳細ビュー階層でエラーメッセージを確認できると思います。
Olivia Liao

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());

これをありがとう-私見これは一般化された「ビューが画面から消えているかどうかを確認する」ための最良の解決策です。ただし、1つの修正:IME、使用法はonView(withId(R.id.someView)).check(isNotDisplayed());
String

4

ビューの可視性を「withEffectiveVisibility」で確認すると、このオプションを試すことができます

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.