Android Espresso - 如果未选中,请单击复选框
Android Espresso - Click checkbox if not checked
我有 onView(withId(R.id.check_box)).perform(click())
,但我只想在复选框尚未选中时执行此操作。我怎样才能在浓缩咖啡中做到这一点?
您的代码中有这样的内容:
@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())
}
这似乎是您测试的一部分,需要选中该复选框。
您可以通过以下方式查看:
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
如果失败,您的测试将失败,这对您来说可能是件好事。然后,你就可以在这个case匹配后进行你想要的点击了。
如果这不是您想要的情况,您能否详细解释一下您在此 Espresso 测试中尝试做什么?
我有同样的问题写了一个自己的 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())
现在我可以确定找到的开关始终未选中,无论之前是否选中。
我还想根据之前的状态切换 checkbox/switch。起初,我试过这个来打开一个关闭的复选框:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...这将关闭已打开的复选框:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
但是,这不起作用,因为 Espresso 会在执行操作之前寻找特定的切换状态。有时候,你事先并不知道它是开还是关。
我的解决方案是使用自定义 ViewAction 来 OFF/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));
正如@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
}
}
这个简单的解决方案可能对您有所帮助
onView(withId(R.id.checkBox_tea)).check(matches(isNotChecked())).perform(click()).check(matches(isChecked()));
非常适合我。
我有 onView(withId(R.id.check_box)).perform(click())
,但我只想在复选框尚未选中时执行此操作。我怎样才能在浓缩咖啡中做到这一点?
您的代码中有这样的内容:
@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())
}
这似乎是您测试的一部分,需要选中该复选框。
您可以通过以下方式查看:
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
如果失败,您的测试将失败,这对您来说可能是件好事。然后,你就可以在这个case匹配后进行你想要的点击了。
如果这不是您想要的情况,您能否详细解释一下您在此 Espresso 测试中尝试做什么?
我有同样的问题写了一个自己的 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())
现在我可以确定找到的开关始终未选中,无论之前是否选中。
我还想根据之前的状态切换 checkbox/switch。起初,我试过这个来打开一个关闭的复选框:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...这将关闭已打开的复选框:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
但是,这不起作用,因为 Espresso 会在执行操作之前寻找特定的切换状态。有时候,你事先并不知道它是开还是关。
我的解决方案是使用自定义 ViewAction 来 OFF/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));
正如@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
}
}
这个简单的解决方案可能对您有所帮助
onView(withId(R.id.checkBox_tea)).check(matches(isNotChecked())).perform(click()).check(matches(isChecked()));
非常适合我。