unit tutorial test support studio library androidtestimplementation android testing android-espresso ui-testing

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());