我有onView(withId(R.id.check_box)).perform(click())
,但我只想这样做,如果复选框尚未被选中。我如何在浓咖啡中做到这一点?Android Espresso - 点击复选框,如果没有选中
回答
我也想切换一个复选框/开关取决于它的以前的状态。起初,我想这要开启一个复选框,为OFF:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...这切换OFF一个复选框,为ON:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
然而,这不起作用,因为Espresso会在执行动作之前寻找特定的切换状态。有时候,你不知道事先是打开还是关闭。
我的解决方案是使用自定义的ViewAction来关闭/打开任何不依赖于以前状态的可检查对象(开关,复选框等)。所以,如果它已经打开,它将保持开启。如果它关闭,它会打开。这里的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())
}
根据谷歌它违背了如何咖啡作品并且是非常危险的https://youtu.be/isihPOY2vS4?t=4m12s –
这似乎是你测试的一部分,该复选框需要检查。
您可以通过检查:
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
如果失败,您的测试将失败,这可能是你的情况不错。然后,您可以在此案例匹配后执行所需的点击。
如果这不是你想要的情况,你能解释一下你在这个Espresso测试中想做什么吗?
我想确保复选框在我做测试之前被选中。它可能未被检查的原因是因为另一个测试没有被检查。 – kyrax
Espresso不应该能够以任何方式设置任何视图状态或操纵视图。如果没有其他的方式来构建你的测试,那么以前的答案将会起作用,但是又一次违背了意式咖啡的惯例。我会推荐以一种可以使它们更加模块化的方式来构建测试,以便不必操纵任何视图。@kyrax –
@kyrax你能否接受我的回答,因为应该知道在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())
现在我可以肯定的是,发现开关始终未经检查,无论它是否被选中或未被选中。
- 1. 如果没有复选框被选中
- 2. 点击复选框后没有收到复选框事件
- 3. 如果没有选中复选框,点击事件会引发JavaScript警报
- 4. 选中第一个复选框,如果没有复选框被选中
- 5. 如何点击一个复选框,点击所有复选框VBA
- 6. 单击复选框点击选择Jquery mobile中的所有复选框
- 7. 如果选中复选框,只允许点击链接
- 8. jQuery选择框没有显示,如果没有通过点击选择
- 9. Phantomjs点击复选框
- 10. Appium的Android点击复选框
- 11. 我不能点击复选框,因为没有目前该复选框
- 12. 如果所有复选框都选中,选中所有复选框
- 13. NSOutlineView:如何点击所有选中的复选框?
- 14. jQuery - 点击,选中类中的所有复选框,如果选中(这样做)如果不(那么)
- 15. 验证如果复选框被点击,选择下拉菜单
- 16. 如果没有选中复选框,如何隐藏div jQuery
- 17. 在没有点击提交按钮的复选框中如何发送选定的复选框值?
- 18. EXTJS 5:如何在点击网格中的复选框时选中复选框
- 19. 为什么复选框没有被选中,如果我点击另一个选项卡?
- 20. 启用/禁用复选框点击复选框中的另一个复选框
- 21. 测试复选框点击
- 22. 复选框点击网页?
- 23. datagrid复选框colum点击
- 24. 当复选框被点击
- 25. 通过点击复选框
- 26. WPF上点击复选框
- 27. 如何检查在android中是否没有选中复选框?
- 28. 提醒如果复选框没有被选中并提交
- 29. 显示,如果没有选中复选框的jQuery
- 30. 复选框有非常约被点击
这应该是可以接受的答案! – jakubbialkowski
完美,谢谢@FrostRocket 我不得不改变的唯一的事情是删除“scrollTo()”ViewAction,因为我的错误是我的复选框不支持scrollTo: 'onView(withId(R.id。正如你所看到的,我想将复选框设置为提供的“globalSearch”的值var – yvolk
我更新了答案,添加了对复选框当前状态的检查并将其更改仅当其状态不是必要时才能避免不必要的事件: 'if(checkableView.isChecked()!= checked){ checkableView.setChecked(checked); }' – yvolk