У меня есть onView(withId(R.id.check_box)).perform(click())
, но я хочу сделать это только в том случае, если флажок еще не установлен. Как я могу сделать это в эспрессо?Android Espresso - установите флажок, если не отмечен
ответ
Я также хотел переключить флажок/переключатель в зависимости от предыдущего состояния. Сначала я попробовал это для переключения ON флажка, который был OFF:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
... и это для переключения OFF флажка, который был на:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
Однако, это не работает , поскольку Espresso будет искать конкретное состояние переключения до того, как оно выполнит действие. Иногда вы не знаете, включен ли он или нет.
Мое решение заключается в использовании пользовательского ViewAction для выключения/включения любого проверяемого объекта (Switch, Checkbox и т. Д.), Который не зависит от предыдущего состояния. Итак, если он уже включен, он останется включенным. Если он выключен, он переключится на ON. Вот 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));
У вас есть что-то вроде этого в коде:
@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())
}
Это не рекомендуется в соответствии с Google это идет вразрез как Espresso работ и очень опасно https://youtu.be/isihPOY2vS4?t=4m12s –
Это, кажется, часть теста, что флажок должен быть проверен.
Вы можете проверить это:
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
Если это не удается, ваш тест потерпит неудачу, что может быть хорошо в вашем случае. Затем вы можете выполнить требуемый щелчок после совпадения этого случая.
Если вы не хотите, можете ли вы подробнее объяснить, что вы пытаетесь сделать в этом Тесте Эспрессо?
Я хочу убедиться, что флажок установлен, прежде чем я сделаю свой тест. Причина, по которой он может быть снят, заключается в том, что другой тест оставил его непроверенным. – kyrax
Эспрессо не должен устанавливать любое состояние просмотров или манипулировать представлениями в любом случае. Если нет другого способа структурировать ваши тесты, чем предыдущий ответ будет работать, но снова идет против эспрессо-конвенций. Я бы рекомендовал структурировать ваши тесты таким образом, чтобы сделать их более модульными, поэтому им не нужно манипулировать никакими представлениями[email protected] –
@kyrax Можете ли вы принять мой ответ в качестве принятого, потому что должно быть известно, что использование активности в тестах эспрессо очень плохое. –
У меня была та же проблема, написал собственный 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())
теперь я могу быть уверен, что найденный переключатель всегда неконтролируемый, независимо от того, был ли он проверен или не установлен ранее.
- 1. Установите флажок в поле Не отмечен
- 2. Сделать флажок HTML по-прежнему отмечен, если не отмечен
- 3. Измените флажок, если отмечен
- 4. Скрыть содержимое, если флажок отмечен
- 5. Флажок не отмечен
- 6. Установите флажок, если
- 7. Радио-кнопка «да», если флажок установлен, «нет», если не отмечен
- 8. onclick функция, если флажок отмечен событие
- 9. флажок отмечен, если щелкнуть связанный ярлык
- 10. Если отмечен флажок с ярлыком, отправьте форму
- 11. Как удалить отмечен флажок, если все флажки не отмечены?
- 12. drupal проверить, если флажок поля отмечен
- 13. если флажок отмечен активным текстовым полем PHP
- 14. Установите флажок флажка, если флажок установлен.
- 15. Adobe LiveCycle - отмечен флажок, не скрывающий подформы
- 16. Установите флажок, если он установлен
- 17. Установите флажок, если щелкнете в textarea (JavaScript?)
- 18. Javascript, флажок отмечен флажком
- 19. Флажок Struts2 не отображается в JSON, если не отмечен
- 20. Проверка javascript, если флажок не отмечен, не скрывается div onload
- 21. Предпочитаемый флажок остается верным, даже если не отмечен
- 22. Установите флажок, если popup = yes
- 23. Если форма отправлена, установите флажок
- 24. Установите флажок, если выберете изменения
- 25. Установите флажок, если он отображается
- 26. JQuery отмечен флажок
- 27. Указывать флажок отмечен угловым
- 28. C# Элемент в checkedListBox выбирается, даже если флажок не отмечен
- 29. Сделать флажок в массиве $ _POST, даже если не отмечен
- 30. JQuery - как сделать checkall не отмечен, если флажок снят?
Это должно быть принято! – jakubbialkowski
Отлично, спасибо @FrostRocket Единственное, что мне пришлось изменить, это удалить «scrollTo()» ViewAction, потому что я получил сообщение об ошибке, что scrollTo не поддерживается для моего флажка: 'onView (withId (R.id. global_search)). выполнить (setChecked (globalSearch)); ' Как вы видите, я хотел установить флажок в значение предоставленного« globalSearch »var – yvolk
Я обновил ответ, добавив проверку текущего состояния флажка и его изменение if (checkableView.isChecked()! = checked) { checkableView.setChecked (checked); } ' – yvolk