web-dev-qa-db-fra.com

Android Espresso - Cochez la case si non cochée

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?

12
kyrax

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));
21
FrostRocket

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?

1
Sahith Reddy

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.

0
richard

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())    
}
0
user35603