соответствует (not (isDisplayed ())) не выполняется с NoMatchingViewException

87

Я пытаюсь проверить отсутствие представления пользовательского интерфейса. Селектор представления выглядит следующим образом:

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 {...}

Это странно. Я проверяю отсутствие пользовательского интерфейса и ожидаю, что это представление не будет найдено. Тогда почему эспрессо выдает ошибку? Пожалуйста, подскажите, что здесь может быть не так.

Спасибо, удивлен!

user846316
источник

Ответы:

166

doesNotExist()Вместо этого нужно использовать . Нашел здесь .

Если представление находится в иерархии представлений, но в невидимом состоянии (для видимости установлено значение «НЕВИДИМЫЙ»), используйте not(isDisplayed). Однако, если представление отсутствует в иерархии представлений (например, для видимости установлено значение «GONE»), doesNotExist()используется.

user846316
источник
17
У меня это не работает, но onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));сработало.
Ситху
37
@Sithu - Это зависит от приложения. Если представление, которое вы ищете, присутствует в иерархии представлений, но невидимо, вам нужно использовать not (isDisplayed). Однако, если представления нет в иерархии представлений, вам необходимо использовать doesNotExist ().
user846316
1
У меня есть кнопки в макете, но установить видимость View.GONEв onCreateна роли пользователя. Итак, означает ли это, что он находится в иерархии представлений и невидим?
Ситу,
Да уж! Спасибо за это, супер решил мою проблему и сделал мое утро намного лучше (с этой проблемой лег спать).
Booger
Если представление ушло из иерархии представлений - что может произойти, когда действие вызвало переход к другому действию - вы должны использовать 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...
Simon-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());
jimmy0251
источник
Спасибо за это - ИМХО, это лучшее решение для обобщенной "проверки, не пропал ли вид с экрана". Одно исправление: IME, использованиеonView(withId(R.id.someView)).check(isNotDisplayed());
String
4

Вы можете попробовать эту опцию, если проверите видимость представления "withEffectiveVisibility"

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Пабель
источник