Подтвердить что ты не робот

Нажмите на не полностью видимое изображениеБуттон с эспрессо

У меня есть пользовательский ImageButton, который не полностью виден, по дизайну, поэтому, когда я выполняю действие click, я получаю эту ошибку:

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

Маленькая часть кнопки находится за пределами экрана (т.е. она обрезается сверху), возможно, 12% кнопки находится за пределами экрана. Это по дизайну, и нет возможности прокручивать или выполнять любое действие вида, чтобы сделать его видимым. Кто-нибудь знает, как преодолеть это ограничение на 90%?

Решение: Я создал собственное действие click, как было предложено, и он отлично работал. Я скопировал класс из Google Espresso и изменил его с 90 до 75 в этом методе:

    @Override
    @SuppressWarnings("unchecked")
    public Matcher<View> getConstraints() {
        Matcher<View> standardConstraint = isDisplayingAtLeast(75);
        if (rollbackAction.isPresent()) {
            return allOf(standardConstraint, rollbackAction.get().getConstraints());
        } else {
            return standardConstraint;
        }
    }
4b9b3361

Ответ 1

Я не думаю, что это простое, элегантное решение. Ограничение 90% жестко закодировано в GeneralClickAction, и класс является окончательным, поэтому мы не можем переопределить getConstraints.

Я бы написал собственный ViewAction на основе GeneralClickAction code, пропустив проверку isDisplayingAtLeast.

Ответ 2

Ничто из этого не помогло мне. Вот пользовательский соединитель, который полностью удаляет это ограничение и позволяет вам щелкнуть по виду

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

Ответ 3

Вам нужно прокрутить до кнопки:

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

Ответ 4

По умолчанию для эспрессо требуется видимость вида > 90%. Что вы думаете о создании собственного click ViewAction? Как это...

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

Этот клик щелкнет по центру вашего представления.

Затем вы можете выполнить щелчок следующим образом: onView(withId(....)).perform(MyViewActions.click());

Я надеюсь, что это сработает.

Ответ 5

Это помогло мне разрешить видимость кнопок при выполнении моих тестов

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