を持っていますonView(withId(R.id.check_box)).perform(click())
が、チェックボックスがまだチェックされていない場合にのみこれを実行したいです。Espresso でこれを実行するにはどうすればよいですか?
ベストアンサー1
また、チェックボックス/スイッチを以前の状態に応じて切り替えたいと考えました。最初は、オフになっているチェックボックスをオンに切り替えるためにこれを試しました。
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...そして、オンになっていたチェックボックスをオフにするには、次のようにします。
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));