web-dev-qa-db-ja.com

Espressoで完全に表示されていないimageButtonをクリックします

設計上、完全には表示されないカスタムImageButtonがあるため、クリックアクションを実行するとこのエラーが発生します。

Android.support.test.espresso.PerformException: Error performing 'single click' on view 'with id: test.com.myproject.app:id/navigationButtonProfile'.
Caused by: Java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
at least 90 percent of the view's area is displayed to the user.
at Android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.Java:138)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:422)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
at Android.os.Handler.handleCallback(Handler.Java:733)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:157)
at Android.app.ActivityThread.main(ActivityThread.Java:5356)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1265)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1081)
at dalvik.system.NativeStart.main(Native Method)

ボタンのごく一部は画面の外側にあります(つまり、上部でトリミングされています)。ボタンの12%が画面の外側にある可能性があります。これは仕様によるものであり、スクロールしたり表示アクションを実行して表示することはできません。この90%の制約を乗り越える方法を知っている人はいますか?

解決策:提案されたとおりに独自のクリックアクションを作成し、完全に機能しました。 Google Espresso からクラスをコピーし、このメソッドで90から75に変更しました。

    @Override
    @SuppressWarnings("unchecked")
    public Matcher<View> getConstraints() {
        Matcher<View> standardConstraint = isDisplayingAtLeast(75);
        if (rollbackAction.isPresent()) {
            return allOf(standardConstraint, rollbackAction.get().getConstraints());
        } else {
            return standardConstraint;
        }
    }
30
HowieH

これに対する簡単でエレガントな解決策はないと思います。 90%の制約はGeneralClickActionにハードコーディングされており、クラスはfinalであるため、getConstraintsをオーバーライドできません。

GeneralClickAction 's code に基づいて独自のViewActionを記述し、isDisplayingAtLeastチェックをスキップします。

10
Daniel Lubarov

上記のどれも私にとってはうまくいきませんでした。以下は、その制約を完全に削除し、ビューをクリックできるカスタムマッチャーです。

 onView(withId(yourID)).check(matches(allOf( isEnabled(), isClickable()))).perform(
            new ViewAction() {
                @Override
                public Matcher<View> getConstraints() {
                    return ViewMatchers.isEnabled(); // no constraints, they are checked above
                }

                @Override
                public String getDescription() {
                    return "click plus button";
                }

                @Override
                public void perform(UiController uiController, View view) {
                    view.performClick();
                }
            }
    );
52
gorbysbm

次の前にボタンまでスクロールする必要があります。

onView(withId(R.id.button_id)).perform(scrollTo(), click());
11
denys

これは、テストの実行中にボタンの可視性を解決するのに役立ちました

public static ViewAction handleConstraints(final ViewAction action, final Matcher<View> constraints)
{
    return new ViewAction()
    {
        @Override
        public Matcher<View> getConstraints()
        {
            return constraints;
        }

        @Override
        public String getDescription()
        {
            return action.getDescription();
        }

        @Override
        public void perform(UiController uiController, View view)
        {
            action.perform(uiController, view);
        }
    };
}

public void clickbutton()
{
    onView(withId(r.id.button)).perform(handleConstraints(click(), isDisplayingAtLeast(65)));
}
7
Shibu

Espressoのデフォルトのクリックでは、ビュー_> 90%_の可視性が必要です。独自のclick ViewActionの作成についてどう思いますか?このような...

_public final class MyViewActions {
   public static ViewAction click() {
      return new GeneralClickAction(SafeTap.SINGLE, GeneralLocation.CENTER, Press.FINGER);
    }
}
_

このクリックは、ビューの中央をクリックします。

次に、次のようにクリックを実行できます:onView(withId(....)).perform(MyViewActions.click());

うまくいくことを願っています。

6
Anna

テキストビューで同じエラーが発生したため、上記の回答と他のSOの質問が非常に役立ちました。私はscrollToメソッドを試しましたが、何らかの理由でエラーが解決しませんでした。

        onView(allOf(withId(R.id.recycler_view), isDisplayed())).perform(RecyclerViewActions
                .actionOnItem(hasDescendant(withText("my text")), click()));
0
user2984447