android - tutorial - Haga clic en la imagen no totalmente visibleBotón con espresso
test ui android (5)
El clic predeterminado de Espresso requiere visibilidad de vista > 90%
. ¿Qué piensas sobre la creación de un propio click
ViewAction? Me gusta esto...
public final class MyViewActions {
public static ViewAction click() {
return new GeneralClickAction(SafeTap.SINGLE, GeneralLocation.CENTER, Press.FINGER);
}
}
Este clic hará clic en el centro de su vista.
Luego, podría ejecutar un clic como este: onView(withId(....)).perform(MyViewActions.click());
Espero que funcione.
Tengo un ImageButton
personalizado que no es completamente visible, por diseño, por lo que cuando realizo una acción de clic, aparece este error:
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)
Una pequeña parte del botón está fuera de la pantalla (es decir, está recortada en la parte superior), tal vez el 12% del botón esté fuera de la pantalla. Esto es por diseño y no es posible desplazarse ni realizar ninguna acción de vista para hacerlo visible. ¿Alguien sabe cómo superar esta restricción del 90%?
Solución: Creé mi propia acción de clic como se sugiere, y funcionó perfectamente. Copié la clase de Google Espresso y cambié de 90 a 75 en este método:
@Override
@SuppressWarnings("unchecked")
public Matcher<View> getConstraints() {
Matcher<View> standardConstraint = isDisplayingAtLeast(75);
if (rollbackAction.isPresent()) {
return allOf(standardConstraint, rollbackAction.get().getConstraints());
} else {
return standardConstraint;
}
}
Esto me ayudó a resolver la visibilidad del botón mientras ejecutaba mis pruebas.
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)));
}
Nada de lo anterior funcionó para mí. Aquí hay un emparejador personalizado que elimina por completo esa restricción y le permite hacer clic en la vista
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();
}
}
);
No creo que haya una solución fácil y elegante para esto. La restricción del 90% está codificada en forma general en GeneralClickAction
, y la clase es definitiva, por lo que no podemos anular getConstraints
.
Yo escribiría su propia ViewAction basada en el código de GeneralClickAction
, omitiendo la verificación isDisplayingAtLeast
.
Tienes que desplazarte hasta el botón antes:
onView(withId(R.id.button_id)).perform(scrollTo(), click());