web-dev-qa-db-fra.com

Cliquez sur l'image non entièrement visibleBouton avec Espresso

J'ai une personnalisation ImageButton qui n'est pas entièrement visible, de par sa conception. Ainsi, lorsque j'exécute une action de clic, j'obtiens cette erreur:

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)

Une petite partie du bouton est en dehors de l’écran (c’est-à-dire qu’elle est tronquée en haut), peut-être 12% du bouton est en dehors de l’écran. Ceci est voulu par la conception, et il n’est pas possible de faire défiler ou d’effectuer une action de vue pour la rendre visible .. Quelqu'un sait-il comment surmonter cette contrainte de 90%?

Solution: J'ai créé ma propre action de clic comme suggéré et cela a parfaitement fonctionné . J'ai copié la classe de Google Espresso et est passée de 90 à 75 dans cette méthode:

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

Je ne pense pas qu'il existe une solution simple et élégante à cela. La contrainte de 90% est codée en dur dans GeneralClickAction et la classe est finale. Nous ne pouvons donc pas remplacer getConstraints.

J'écrirais votre propre ViewAction en fonction du code de GeneralClickAction , en sautant la vérification isDisplayingAtLeast.

9
Daniel Lubarov

Aucun de ce qui précède n'a fonctionné pour moi. Voici un matcher personnalisé qui supprime complètement cette contrainte et vous permet de cliquer sur la vue.

 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();
                }
            }
    );
47
gorbysbm

Vous devez faire défiler le bouton avant:

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

Le clic par défaut d’Espresso requiert la visibilité de la vue > 90%. Que pensez-vous de la création de votre propre click ViewAction? Comme ça ...

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

Ce clic va cliquer au centre de votre vue.

Ensuite, vous pouvez exécuter un clic comme ceci: onView(withId(....)).perform(MyViewActions.click());

J'espère que ça pourrait marcher.

6
Anna

Cela m'a aidé à résoudre la visibilité des boutons lors de l'exécution de mes tests

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)));
}
5
Shibu

Pour la même erreur sur une vue texte, j'ai fini par faire comme ci-dessous, les réponses affichées ci-dessus et d'autres SO questions nous ont beaucoup aidés. J'ai essayé la méthode scrollTo, mais pour une raison quelconque, l'erreur a persisté. J'espère que ça aide quelqu'un.

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