การจับคู่ (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: ไม่พบมุมมองในลำดับชั้นที่ตรงกัน: กับ id: คือหากมุมมองเป้าหมายไม่ได้เป็นส่วนหนึ่งของลำดับชั้นมุมมองคุณอาจต้องใช้ Espresso.onData เพื่อ โหลดจาก AdapterViews ต่อไปนี้: android.widget.ListView {... }

มันแปลก ๆ. ฉันกำลังตรวจสอบว่าไม่มี UI และคาดว่าจะไม่พบมุมมองนี้ แล้วทำไม Espresso ถึงโยนข้อผิดพลาด? โปรดแนะนำสิ่งที่อาจเกิดขึ้นที่นี่

ขอบคุณทึ่ง!

คำตอบ:


167

จำเป็นต้องใช้doesNotExist()แทน. พบที่นี่

ถ้ามุมมองที่มีในลำดับชั้นดู แต่ในสภาวะที่มองไม่เห็น (การมองเห็นมีการตั้งค่า 'มองไม่เห็น') not(isDisplayed)การใช้งาน อย่างไรก็ตามหากมุมมองไม่มีเลยในลำดับชั้นของมุมมอง (เช่นตั้งค่าการมองเห็นเป็น "GONE") doesNotExist()จะใช้


17
มันไม่ได้ผลสำหรับฉัน แต่onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));ได้ผล
Sithu

37
@Sithu - มันขึ้นอยู่กับแอพ หากมุมมองที่คุณกำลังมองหาอยู่ในลำดับชั้นของมุมมอง แต่มองไม่เห็นคุณจะต้องใช้ not (isDisplayed) อย่างไรก็ตามหากไม่มีมุมมองในลำดับชั้นของมุมมองคุณต้องใช้ doesNotExist ()
user846316

1
ฉันมีปุ่มในรูปแบบการมองเห็น แต่ชุดView.GONEในonCreateเมื่อบทบาทของผู้ใช้ ดังนั้นหมายความว่าอยู่ในลำดับชั้นของมุมมองและมองไม่เห็นหรือไม่?
Sithu

ใช่ ขอบคุณสำหรับสิ่งนี้สุดยอดแก้ไขปัญหาของฉันและทำให้เช้าของฉันดีขึ้นมาก (เข้านอนด้วยปัญหานี้)
Booger

หากมุมมองหายไปจากลำดับชั้นมุมมองซึ่งอาจเกิดขึ้นได้เมื่อการกระทำทำให้เกิดการเปลี่ยนแปลงไปยังกิจกรรมอื่นคุณควรใช้ ViewAssertions.doesNotExist (): View.GONE ตัวอย่างในตัวอย่างของคุณไม่ถูกต้องและทำให้เข้าใจผิด โปรดแก้ไขคำตอบของคุณ
metis

18

ใช้งานกับวิธีการของคุณได้เช่นกัน แต่สิ่งนี้:

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

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

5
นี่คือคำตอบที่ถูกต้องบางส่วน สิ่งนี้จะใช้ได้ก็ต่อเมื่อไม่มีมุมมอง targedet ในเค้าโครง (ลำดับชั้นของมุมมองไม่มีมุมมองนี้) อย่างไรก็ตามการยืนยันนี้จะล้มเหลวหากมุมมองเป้าหมายมีอยู่จริงในลำดับชั้นของมุมมองเค้าโครง แต่สถานะการมองเห็นจะหายไปหรือมองไม่เห็น ข้อความยืนยันความล้มเหลวในกรณีนั้นจะระบุ:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid

ถูกต้องฉันคิดว่าคุณสามารถตรวจสอบข้อความแสดงข้อผิดพลาดด้วยลำดับชั้นมุมมองโดยละเอียด
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());

ขอบคุณสำหรับสิ่งนี้ - IMHO นี่เป็นทางออกที่ดีที่สุดสำหรับ "ตรวจสอบว่ามุมมองหายไปจากหน้าจอหรือไม่" การแก้ไขหนึ่งครั้งแม้ว่า: IME การใช้งานคือonView(withId(R.id.someView)).check(isNotDisplayed());
สตริง

4

คุณสามารถลองใช้ตัวเลือกนี้ได้หากคุณตรวจสอบการเปิดเผยมุมมอง "withEffectiveVisibility"

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.