corresponde (not (isDisplayed ())) falha com NoMatchingViewException

87

Estou tentando testar a ausência da visualização da IU. O seletor de visualização é o seguinte:

public static ViewInteraction onMyTestUi() {
    return onView(withId(R.id.myTestId));
}

O seletor funciona bem para verificar se a visualização é exibida, mas dá erro ao verificar se a visualização não é exibida. Estou usando isso da seguinte maneira:

 onMyTestUi().check(matches(not(isDisplayed())));

Mas recebo o seguinte erro:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: Nenhuma visualização na hierarquia encontrada correspondente: com id: is Se a visualização de destino não fizer parte da hierarquia de visualização, pode ser necessário usar Espresso.onData para carregue-o de um dos seguintes AdapterViews: android.widget.ListView {...}

Isto é estranho. Estou verificando a ausência da IU e espera-se que essa visualização não seja encontrada. Então, por que o Espresso está gerando um erro? Por favor, sugira o que pode estar errado aqui.

Obrigado, espantado!

user846316
fonte

Respostas:

166

Precisa usar em seu doesNotExist()lugar. Encontrado aqui .

Se a visualização estiver na hierarquia de visualização, mas em um estado invisível (a visibilidade é definida como 'INVISÍVEL'), use not(isDisplayed). No entanto, se a visualização não estiver na hierarquia de visualização (por exemplo, visibilidade definida como 'GONE'), doesNotExist()será usado.

user846316
fonte
17
Não funciona para mim, mas onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));funcionou.
Sithu de
37
@Sithu - Depende do aplicativo. Se a visualização que você está procurando estiver na hierarquia de visualizações, mas invisível, será necessário usar not (isDisplayed). No entanto, se a visualização não estiver na hierarquia de visualizações, você precisará usar doesNotExist ().
user846316
1
Eu tenho o botão no layout, mas configurei a visibilidade View.GONEna onCreatefunção do usuário. Então, isso significa que está na hierarquia de visualizações e invisível?
Sithu,
sim! Obrigado por isso, super resolveu meu problema, e deixa minha manhã bem melhor (fui para a cama com esse problema).
Booger
Se a visualização foi removida da hierarquia de visualização - o que pode acontecer quando uma ação causou uma transição para outra atividade - você deve usar ViewAssertions.doesNotExist (): o exemplo View.GONE em seu exemplo está errado e enganoso. Edite sua resposta
metis
18

Também trabalhe com o seu método, mas algo assim:

onView(withId(R.id.next)).check(matches(not(isDisplayed())));
Morozov
fonte
15
onView(withText("")).check(doesNotExist());
Olivia Liao
fonte
5
Esta é uma resposta parcialmente correta. Isso só funcionará se a visão targedet não existir no layout (a hierarquia da visão não contém esta visão.) No entanto, essa afirmação falhará se a visão direcionada realmente existir na hierarquia de visão do layout, mas seu estado de visibilidade for IDO ou INVISÍVEL. Nesse caso, a mensagem de falha de declaração indicará:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid
Correto, então acho que você pode verificar a mensagem de erro com a hierarquia de visualização detalhada.
Olivia Liao
8

Se você quiser verificar se Viewé ou não visível ou não existe .

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

Uso:

onView(withId(R.id.someView)).check(isNotDisplayed());
Jimmy0251
fonte
Obrigado por isso - IMHO esta é a melhor solução para uma "verificação generalizada se a visão sumiu da tela". Uma correção, porém: IME, o uso éonView(withId(R.id.someView)).check(isNotDisplayed());
String
4

Você pode tentar esta opção se verificar a visibilidade da vista "withEffectiveVisibility"

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Pabel
fonte