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;
}
}
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
.
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();
}
}
);
Vous devez faire défiler le bouton avant:
onView(withId(R.id.button_id)).perform(scrollTo(), click());
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.
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)));
}
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()));