Ответ 1
Я также хотел переключить флажок/переключатель в зависимости от предыдущего состояния. Сначала я попытался включить переключатель ON, который был выключен:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
... и это, чтобы отключить флажок, который был включен:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
Однако это не работает, поскольку Espresso будет искать конкретное состояние переключения до того, как оно выполнит действие. Иногда вы не знаете, включено ли оно или выключено заранее.
Мое решение - использовать пользовательский ViewAction, чтобы отключить/включить любой проверяемый объект (Switch, Checkbox и т.д.), который не зависит от предыдущего состояния. Итак, если он уже включен, он останется включенным. Если он выключен, он переключится. Здесь ViewAction:
public static ViewAction setChecked(final boolean checked) {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return new Matcher<View>() {
@Override
public boolean matches(Object item) {
return isA(Checkable.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) {
Checkable checkableView = (Checkable) view;
checkableView.setChecked(checked);
}
};
}
И вот как вы его используете (в этом примере, когда вы хотите переключиться на ON):
onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));