web-dev-qa-db-ja.com

Android Espresso-チェックされていない場合はチェックボックスをクリックします

私はonView(withId(R.id.check_box)).perform(click())を持っていますが、チェックボックスがまだオンになっていない場合にのみ、これを実行します。エスプレッソでこれを行うにはどうすればよいですか?

20
kyrax

また、以前の状態に応じてチェックボックス/スイッチを切り替えたいと思っていました。最初に、私はこれをオフにしていたチェックボックスをオンに切り替えようとしました:

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

...そしてこれは、オンになっていたチェックボックスをオフに切り替えるには:

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

ただし、Espressoはアクションを実行する前に特定のトグル状態を探しているため、これは機能しません。事前にONかOFFかわからない場合があります。

私の解決策は、カスタム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));
30
FrostRocket

同じ問題があり、SwitchCompatを常にオフにする独自のViewActionを作成しました

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

これで、以前にチェックしたかどうかに関係なく、見つかったスイッチが常にオフになっていることを確認できます。

0
richard

あなたのコードには次のようなものがあります:

@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())    
}
0
user35603

これはテストの一部のようです。チェックボックスをオンにする必要があります。

これは次の方法で確認できます。

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

これが失敗すると、テストは失敗します。次に、このケースが一致した後、必要なクリックを実行できます。

これがあなたが望む状況ではない場合、このエスプレッソテストで何をしようとしているのかもっと説明できますか?

0
Sahith Reddy

@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
    }
}
0
Achraf Amil