Android Espresso - установите флажок, если не отмечен

Я имею onView(withId(R.id.check_box)).perform(click()), но я хочу сделать это, только если флажок еще не установлен. Как я могу сделать это в эспрессо?

6 ответов

Решение

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

onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());

... и это, чтобы отключить флажок, который был включен:

onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());

Однако это не работает, так как Espresso будет искать определенное состояние переключения, прежде чем выполнит действие. Иногда вы не знаете, включен он или выключен заранее.

Мое решение состоит в том, чтобы использовать пользовательское действие ViewAction для включения / выключения любого проверяемого объекта (переключатель, флажок и т. Д.), Который не зависит от предыдущего состояния. Так что, если он уже включен, он останется включенным. Если он выключен, он будет включен. Вот ViewAction:

public static ViewAction setChecked(final boolean checked) {
    return new ViewAction() {
        @Override
        public BaseMatcher<View> getConstraints() {
            return new BaseMatcher<View>() {
                @Override
                public boolean matches(Object item) {
                    return isA(Checkable.class).matches(item);
                }

                @Override
                public void describeMismatch(Object item, Description mismatchDescription) {}

                @Override
                public void describeTo(Description description) {}
            };
        }

        @Override
        public String getDescription() {
            return null;
        }

        @Override
        public void perform(UiController uiController, View view) {
            Checkable checkableView = (Checkable) view;
            checkableView.setChecked(checked);
        }
    };
}

И вот как вы его используете (в этом примере, когда вы хотите включить ON):

onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));

Точно так же, как @FrostRocket, но написано на Kotlin.

Мы определяем настраиваемое действие, которое может выполняться только для проверяемых элементов (как указано в ограничениях). Итак, мы безопасно передаем представление в Checkable для доступа к методу setCheckable.

fun setChecked(checked: Boolean) = object : ViewAction {
    val checkableViewMatcher = object : BaseMatcher<View>() {
        override fun matches(item: Any?): Boolean = isA(Checkable::class.java).matches(item)
        override fun describeTo(description: Description?) {
            description?.appendText("is Checkable instance ")
        }
    }

    override fun getConstraints(): BaseMatcher<View> = checkableViewMatcher
    override fun getDescription(): String? = null
    override fun perform(uiController: UiController?, view: View) {
        val checkableView: Checkable = view as Checkable
        checkableView.isChecked = checked
    }
}

Похоже, это часть вашего теста, что флажок должен быть установлен.

Вы можете проверить это:

onView(withId(R.id.checkbox)).check(matches(not(isChecked())));

Если это не удастся, ваш тест не пройдёт, что может быть хорошо в вашем случае. Затем вы можете выполнить желаемый щелчок после совпадения этого случая.

Если это не та ситуация, которую вы хотите, можете ли вы объяснить больше о том, что вы пытаетесь сделать в этом тесте эспрессо?

Это простое решение может помочь вам

      onView(withId(R.id.checkBox_tea)).check(matches(isNotChecked())).perform(click()).check(matches(isChecked()));

отлично работал для меня.

У вас есть что-то вроде этого в вашем коде:

@Rule
public ActivityTestRule<ActivityMain> ActivityMainRule = new ActivityTestRule<>(ActivityMain.class);

Пытаться

if (!ActivityMainRule.getActivity().findViewById(R.id.check_box).isChecked()) {
    onView(withId(R.id.check_box)).perform(click())    
}

У меня была та же проблема, и я написал собственный ViewAction, который всегда снимает флажок моего SwitchCompat

class UncheckViewAction implements ViewAction{

    @Override
    public Matcher<View> getConstraints() {
        return new Matcher<View>() {
            @Override
            public boolean matches(Object item) {
                return isA(SwitchCompat.class).matches(item);
            }

            @Override
            public void describeMismatch(Object item, Description mismatchDescription) {

            }

            @Override
            public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {

            }

            @Override
            public void describeTo(Description description) {

            }
        };
    }

    @Override
    public String getDescription() {
        return null;
    }

    @Override
    public void perform(UiController uiController, View view) {
        SwitchCompat scView = (SwitchCompat) view;
        scView.setChecked(false);
    }
}

и использовал это так:

onView(withId(R.id.check_box)).perform(new UncheckViewAction())

Теперь я могу быть уверен, что найденный переключатель всегда не проверен, независимо от того, был ли он проверен или не проверен ранее.

Другие вопросы по тегам