webentwicklung-frage-antwort-db.com.de

Klicken Sie auf nicht vollständig sichtbares BildButton mit Espresso

Ich habe eine benutzerdefinierte ImageButton, die von Entwurf nicht vollständig sichtbar ist. Wenn ich eine Klickaktion durchführe, erhalte ich diesen Fehler:

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)

Ein kleiner Teil der Schaltfläche befindet sich außerhalb des Bildschirms (d. H. Er wird oben abgeschnitten), möglicherweise befinden sich 12% der Schaltfläche außerhalb des Bildschirms. Dies ist beabsichtigt, und es ist nicht möglich, einen Bildlauf durchzuführen oder eine Ansichtsaktion auszuführen, um sie sichtbar zu machen. Jemand weiß, wie man diese 90% -Konzentration überwindet.

Lösung: Ich habe, wie vorgeschlagen, eine eigene Klickaktion erstellt, und es hat perfekt geklappt . Ich habe die Klasse von Google Espresso kopiert und in dieser Methode von 90 auf 75 geändert:

    @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

Ich glaube nicht, dass es dafür eine einfache, elegante Lösung gibt. Die Einschränkung von 90% ist in GeneralClickAction fest codiert, und die Klasse ist final, so dass wir getConstraints nicht überschreiben können.

Ich würde Ihre eigene ViewAction schreiben, basierend auf GeneralClickActions Code , wobei die isDisplayingAtLeast-Prüfung übersprungen wird.

9
Daniel Lubarov

Keines der oben genannten Dinge funktionierte für mich. Hier ist ein benutzerdefinierter Matcher, der diese Einschränkung vollständig entfernt und Ihnen das Klicken auf die Ansicht ermöglicht

 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

Sie müssen vor der Schaltfläche zum Button blättern:

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

Der Standardklick von Espresso erfordert Sichtbarkeit der Ansicht > 90%. Was halten Sie davon, eine eigene click ViewAction zu erstellen? So ...

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

Dieser Klick wird in die Mitte Ihrer Ansicht klicken.

Dann könnten Sie einen Klick wie folgt ausführen: onView(withId(....)).perform(MyViewActions.click());

Ich hoffe es könnte klappen.

6
Anna

Dies hat mir dabei geholfen, die Sichtbarkeit der Tasten während des Tests zu verbessern

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

Für den gleichen Fehler in einer Textansicht, die ich wie folgt durchführte, waren die oben geposteten Antworten und andere SO - Fragen eine große Hilfe. Ich habe die Methode scrollTo ausprobiert, aber aus irgendeinem Grund blieb der Fehler bestehen. Hoffe das hilft jemandem.

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