Android Espresso – 点击checkbox,如果不选中

我有onView(withId(R.id.check_box)).perform(click()) ,但我只想这样做,如果checkbox尚未检查。 我怎样才能做到这一点咖啡?

Related of "Android Espresso – 点击checkbox,如果不选中"

我也想切换一个checkbox/开关取决于它的以前的状态。 起初,我试图切换一个closures的checkbox:

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

…这是closures一个checkbox是ON:

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

然而,这是行不通的,因为Espresso会在执行操作之前寻找特定的切换状态。 有时候,你不知道事先是开还是关。

我的解决scheme是使用自定义的ViewAction来closures/开启任何不依赖于以前状态的可检查对象(开关,checkbox等)。 所以,如果它已经打开,它将保持开启。 如果它closures,它会打开。 这是ViewAction:

 public static ViewAction setChecked(final boolean checked) { return new ViewAction() { @Override public Matcher<View> getConstraints() { return new Matcher<View>() { @Override public boolean matches(Object item) { return isA(Checkable.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) { Checkable checkableView = (Checkable) view; checkableView.setChecked(checked); } }; } 

这里是你如何使用它(在这个例子中,当你想切换到ON):

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

这似乎是你的testing的一部分,checkbox需要检查。

你可以检查这个:

 onView(withId(R.id.checkbox)).check(matches(not(isChecked()))); 

如果失败了,你的testing将会失败,这对你的情况可能是好的。 然后,你可以在这个案例匹配后执行你想要的点击。

如果这不是你想要的情况,你能解释一下你想在这个咖啡testing中做什么吗?

你的代码中有这样的东西:

 @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()) 

现在我可以确定find的开关总是未被检查,不pipe它是否被选中或未被选中。