Эспрессо: проверить TextInputLayout PasswordVisibilityToggle button - PullRequest
0 голосов
/ 12 марта 2019

Добрый день, я справляюсь с эспрессо и пытаюсь проверить, видна ли кнопка PasswordVisibilityToggleEnabled TextInputLayout или нет. Я знаю, что эта кнопка - CheckableImageButton с идентификатором (R.id.text_input_password_toggle), но не знаю, как получить его в эспрессо.

Я пытался сделать это:

onView(withId(R.id.passwordTextInputLayout)).check(hasDescendant(withId(R.id.text_input_password_toggle))).check(matches(not(isDisplayed())));

Но это не работает. Я догадался, что мне, возможно, придется использовать пользовательский Matcher, основанный на нескольких вопросах о StackOverflow, но я не уверен, правильно ли я это делаю.

public static Matcher<View> getPasswordToggleView(final Matcher<View> parentMatcher, int id) {
    return new TypeSafeMatcher<View>() {
        @Override
        protected boolean matchesSafely(View view) {
            if(!(view.getParent() instanceof ViewGroup)) {
                return parentMatcher.matches(view.getParent());
            }

            ViewGroup group = (ViewGroup) view.getParent();
            return  parentMatcher.matches(view.getParent()) && view.getId() == id;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("get View with matching id");
        }
    };
}

и попробуйте использовать это, как это, но все еще не работает:

 onView(getPasswordToggleView(withId(R.id.passwordTextInputLayout), R.id.text_input_password_toggle)).check(matches(not(isDisplayed())));

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

В вашем коде:

onView(withId(R.id.passwordTextInputLayout))
    .check(hasDescendant(withId(R.id.text_input_password_toggle))) // assume you forgot matches(...)
    .check(matches(not(isDisplayed())));

Последняя проверка not(isDisplayed)) выполняется для TextInputLayout, а не для CheckableImageButton, как вы ожидали. Чтобы исправить эту ошибку, просто измените код на:

onView(withId(R.id.passwordTextInputLayout))
    .check(matches(allOf(hasDescendant(withId(R.id.text_input_password_toggle)), not(isDisplayed()))))

Так что он может выполнять проверку отображения на кнопке.

В качестве альтернативы, если вы хотите создать собственный сопоставитель для TextInputLayout, вы можете попробовать:

public static Matcher<View> isPasswordVisibilityToggleEnabled() {
    return new BoundedMatcher<View, TextInputLayout>(TextInputLayout.class) {

        @Override public void describeTo(Description description) {
            description.appendText("is password visibility toggle enabled");
        }

        @Override protected boolean matchesSafely(TextInputLayout view) {
            return view.isPasswordVisibilityToggleEnabled();
        }
    };
}

Затем вы можете изменить свой тестовый код на:

onView(withId(R.id.passwordTextInputLayout))
    .check(matches(not(isPasswordVisibilityToggleEnabled())))

Я думаю, что view.isPasswordVisibilityToggleEnabled() достаточно для простого теста в этом случае, но вы можете настроить его так, как вам нравится.

0 голосов
/ 12 марта 2019

Пока вы (по-видимому) уже в порядке, используя идентификатор кнопки переключения, вы можете сделать это onView(withId(R.id.text_input_password_toggle)).check(doesNotExist()), чтобы проверить, что кнопка переключения не отображается.Эта проверка будет успешной, если passwordToggleEnabled ложно.

doesNotExist является частью android.support.test.espresso.assertion

...