मैच (नहीं है (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: पदानुक्रम में कोई दृश्य नहीं मिला मिलान: id के साथ: यदि लक्ष्य दृश्य पदानुक्रम का हिस्सा नहीं है, तो आपको Espresso.onData का उपयोग करने की आवश्यकता हो सकती है इसे निम्न अडैप्टर व्यूज़ में से किसी एक पर लोड करें: android.widget.ListView {...}

यह अजीब है। मैं यूआई की अनुपस्थिति की जांच कर रहा हूं और इसकी उम्मीद है कि यह दृश्य नहीं मिलेगा। फिर एस्प्रेसो त्रुटि क्यों फेंक रही है? कृपया सुझाव दें कि यहां क्या गलत हो सकता है।

धन्यवाद, चकित!

जवाबों:


161

doesNotExist()इसके बजाय उपयोग करने की आवश्यकता है । यहां मिला

यदि दृश्य पदानुक्रम में है, लेकिन अदृश्य अवस्था में है (दृश्यता 'INVISIBLE' पर सेट है), का उपयोग करें not(isDisplayed)। हालाँकि, यदि दृश्य पदानुक्रम में बिल्कुल भी नहीं है (उदाहरण के लिए 'GONE' के लिए दृश्यता सेट), doesNotExist()का उपयोग किया जाता है।


17
यह मेरे लिए काम नहीं करता है, लेकिन onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));काम किया है।
सिथू

35
@ सिथू -यह ऐप पर निर्भर करता है। यदि आप जिस दृश्य की तलाश कर रहे हैं वह दृश्य पदानुक्रम में है, लेकिन अदृश्य है, तो आपको नहीं (isDisplayed) का उपयोग करने की आवश्यकता है। हालाँकि, यदि दृश्य पदानुक्रम में नहीं है, तो आपको doNotExist () का उपयोग करने की आवश्यकता है।
user846316

1
मेरे पास लेआउट में बटन है, लेकिन उपयोगकर्ता की भूमिका View.GONEमें दृश्यता सेट onCreateकरें। तो, क्या इसका मतलब यह है कि यह पदानुक्रम और अदृश्य दृश्य में है?
सिथू

हाँ! इसके लिए धन्यवाद, सुपर ने मेरी समस्या को हल कर दिया, और मेरी सुबह को बहुत बेहतर बनाता है (इस मुद्दे के साथ बिस्तर पर गया)।
Booger

यदि दृश्य पदानुक्रम से चला गया है - जो तब हो सकता है जब कोई क्रिया किसी अन्य गतिविधि के लिए संक्रमण का कारण बनती है - आपको ViewAssertions.doesNotExist () का उपयोग करना चाहिए: आपके उदाहरण में View.GONE उदाहरण गलत और भ्रामक है। कृपया अपना उत्तर संपादित करें
Metis

18

आपकी विधि के साथ भी काम करें, लेकिन कुछ इस तरह से:

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

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

5
यह आंशिक रूप से सही उत्तर है। यह केवल तभी काम करेगा जब लेआउट में टारगेट दृश्य मौजूद नहीं होता है (देखें पदानुक्रम में यह दृश्य शामिल नहीं है।) हालांकि, यह अभिकथन विफल हो जाएगा यदि लक्षित दृश्य वास्तव में लेआउट दृश्य पदानुक्रम में मौजूद है, लेकिन यह दृश्यता स्थिति पूर्ण है या INVISIBLE है। उस स्थिति में जोरदार विफलता संदेश राज्य करेगा:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.