Android Espresso - Click checkbox if not checked

前端 未结 5 1030
长情又很酷
长情又很酷 2021-02-18 13:58

I have onView(withId(R.id.check_box)).perform(click()), but i only want to do this if the check box is not already checked. How can I do this in espresso?

5条回答
  •  猫巷女王i
    2021-02-18 14:18

    I also wanted to toggle a checkbox/switch depending on it's previous state. At first, I tried this to toggle ON a checkbox that was OFF:

    onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
    

    ...and this to toggle OFF a checkbox that was ON:

    onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
    

    However, this doesn't work, since Espresso will be looking for a specific toggle state before it performs the action. Sometimes, you don't know whether it's ON or OFF beforehand.

    My solution is to use a custom ViewAction to turn OFF/ON any checkable object (Switch, Checkbox, etc.) that isn't dependent on previous state. So, if it's already ON, it'll stay ON. If it's OFF, it'll toggle ON. Here's the ViewAction:

    public static ViewAction setChecked(final boolean checked) {
        return new ViewAction() {
            @Override
            public BaseMatcher getConstraints() {
                return new BaseMatcher() {
                    @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);
            }
        };
    }
    

    And here's how you use it (in this example, when you want to toggle to ON):

    onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));
    

提交回复
热议问题