match (not (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 포함 : is 대상보기가보기 계층 구조의 일부가 아닌 경우 Espresso.onData를 사용하여 다음 AdapterViews : android.widget.ListView {...} 중 하나에서로드합니다.

이건 이상해. UI가 없는지 확인 중이며이 뷰를 찾을 수 없을 것으로 예상됩니다. 그렇다면 Espresso에서 오류가 발생하는 이유는 무엇입니까? 여기서 무엇이 잘못 될 수 있는지 제안하십시오.

감사합니다, 놀랐습니다!

답변:


161

doesNotExist()대신 사용해야 합니다. 여기 에서 찾았 습니다 .

뷰가 뷰 계층 구조에 있지만 보이지 않는 상태 인 경우 (visibility가 'INVISIBLE'로 설정 됨) not(isDisplayed). 그러나 뷰가 뷰 계층 구조에 전혀 없으면 (예 : 가시성이 'GONE'으로 설정 됨) doesNotExist()사용됩니다.


17
그것은 나를 위해 작동하지 않지만 작동 onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));했습니다.
Sithu

35
@Sithu-앱에 따라 다릅니다. 찾고있는 뷰가 뷰 계층 구조에 있지만 보이지 않는 경우 not (isDisplayed)를 사용해야합니다. 그러나 뷰가 뷰 계층 구조에 없으면 doesNotExist ()를 사용해야합니다.
user846316 2011

1
레이아웃에 버튼이 있지만 사용자 역할 View.GONEonCreate따라 가시성 을 설정합니다 . 그렇다면 뷰 계층 구조에 있고 보이지 않는다는 의미입니까?
Sithu

네! 덕분에 슈퍼가 내 문제를 해결하고 아침을 훨씬 더 좋게 만들었습니다 (이 문제로 잠자리에 들었습니다).
Booger

뷰가 뷰 계층 구조에서 벗어난 경우 (작업으로 인해 다른 활동으로 전환 될 때 발생할 수 있음) ViewAssertions.doesNotExist ()를 사용해야합니다. 예제의 View.GONE 예제는 잘못되었으며 오해의 소지가 있습니다. 답변을 수정하세요
metis

18

또한 귀하의 방법으로 작업하지만 다음과 같습니다.

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

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

5
이것은 부분적으로 정답입니다. 이것은 targedet 뷰가 레이아웃에 존재하지 않는 경우에만 작동합니다 (뷰 계층 구조는이 뷰를 포함하지 않습니다.) 그러나 대상 뷰가 실제로 레이아웃 뷰 계층 구조에 존재하지만 가시성 상태가 GONE 또는 INVISIBLE이면이 어설 션이 실패합니다. 이 경우 어설 션 실패 메시지는 다음과 같이 표시됩니다.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)))

다른 것들은 작동하지 않았지만 이것은 작동했습니다. 감사합니다
Saul_programa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.