J'ai onView(withId(R.id.check_box)).perform(click())
, mais je ne veux le faire que si la case à cocher n'est pas déjà cochée. Comment puis-je faire cela dans un expresso?
Je voulais aussi activer/désactiver une case à cocher/changer en fonction de son état précédent. Au début, j’essayais d’activer une case à cocher qui était désactivée:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
... et ceci pour désactiver une case à cocher qui était activée:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
Toutefois, cela ne fonctionne pas, car Espresso recherchera un état de basculement spécifique avant d'effectuer l'action. Parfois, vous ne savez pas s’il est allumé ou éteint auparavant.
Ma solution consiste à utiliser une ViewAction personnalisée pour activer/désactiver tout objet vérifiable (commutateur, case à cocher, etc.) qui ne dépend pas de l'état précédent. Donc, s'il est déjà allumé, il restera allumé. Si c'est OFF, ça va basculer sur ON. Voici le 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);
}
};
}
Et voici comment vous l'utilisez (dans cet exemple, lorsque vous souhaitez basculer sur ON):
onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));
Cela semble faire partie de votre test, la case à cocher doit être cochée.
Vous pouvez vérifier cela par:
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
Si cela échoue, votre test échouera, ce qui peut être bon dans votre cas. Ensuite, vous pouvez effectuer le clic souhaité après la mise en correspondance de ce cas.
Si ce n'est pas la situation que vous souhaitez, pouvez-vous expliquer davantage ce que vous essayez de faire dans ce test d'espresso?
J'ai eu le même problème et a écrit son propre ViewAction qui décoche toujours mon 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);
}
}
et utilisé comme ça:
onView(withId(R.id.check_box)).perform(new UncheckViewAction())
maintenant, je peux être sûr que le commutateur trouvé est toujours décoché, peu importe s'il a été coché ou décoché auparavant.
Vous avez quelque chose comme ça dans votre code:
@Rule
public ActivityTestRule<ActivityMain> ActivityMainRule = new ActivityTestRule<>(ActivityMain.class);
Essayer
if (!ActivityMainRule.getActivity().findViewById(R.id.check_box).isChecked()) {
onView(withId(R.id.check_box)).perform(click())
}