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())
Теперь я могу быть уверен, что найденный переключатель всегда не проверен, независимо от того, был ли он проверен или не проверен ранее.