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;
}
}
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 GeneralClickAction
s Code , wobei die isDisplayingAtLeast
-Prüfung übersprungen wird.
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();
}
}
);
Sie müssen vor der Schaltfläche zum Button blättern:
onView(withId(R.id.button_id)).perform(scrollTo(), click());
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.
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)));
}
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()));