我自横刀向天笑,去留肝胆两昆仑。这篇文章主要讲述Android Espresso - 如果未选中则单击复选框相关的知识,希望能为你提供帮助。
我有onView(withId(R.id.check_box)).perform(click())
,但我只想在没有选中复选框的情况下这样做。我怎么能在浓缩咖啡中做到这一点?
答案我还想根据它的先前状态切换一个复选框/开关。首先,我试着在一个关闭的复选框上切换:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...这样可以关闭一个ON的复选框:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
但是,这不起作用,因为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);
}
};
}
以下是您如何使用它(在此示例中,当您要切换到ON时):
onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));
另一答案你的代码中有这样的东西:
@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())
}
另一答案我有同样的问题,写了一个自己的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())
现在我可以确定找到的开关总是未选中,无论之前是否已选中或未选中。
另一答案这似乎是您测试的一部分,需要检查复选框。
你可以通过以下方式检查:
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
如果失败,您的测试将失败,这可能对您的情况有利。然后,您可以在此案例匹配后执行所需的单击。
【Android Espresso - 如果未选中则单击复选框】如果这不是你想要的情况,你能解释一下你在Espresso测试中想要做些什么吗?
推荐阅读
- android动态添加复选框
- 获取请求在Angular 5 app中抛出404错误
- Android(请求关注通过WindowManager添加的视图(WebView))
- 将c#console app转换为c#windows form app
- Websphere Application Server异常ADMC0016E(系统无法创建SOAP连接器以连接到主机端口)
- 程序类型已存在(android.support.v7.util.AsyncListUtil $ 1)
- 在运行时更改Android Camera 2的Flash设置
- InApp订阅已过期,如何检查服务器端
- 使用AWS Android SDK发送JWT令牌