Android Espresso - 如果未选中则单击复选框

kyr*_*rax 16 testing checkbox android android-espresso

我有onView(withId(R.id.check_box)).perform(click()),但我只想在没有选中复选框的情况下这样做.我怎么能在浓缩咖啡中做到这一点?

Fro*_*ket 32

我还想根据它的先前状态切换一个复选框/开关.起初,我试过这个来切换一个OFF的复选框:

onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
Run Code Online (Sandbox Code Playgroud)

...这将关闭一个ON的复选框:

onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为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);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

以下是您如何使用它(在此示例中,当您要切换到ON时):

onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));
Run Code Online (Sandbox Code Playgroud)


Ach*_*mil 7

正如 @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
    }
}
Run Code Online (Sandbox Code Playgroud)