Android Espresso выполняет longClick вместо клика

onData(anything()).inAdapterView(withId(R.id.ScheduleOrderListViewListView))
                .atPosition(0).perform(click());

выполняет 50% времени длинное касание - есть ли хороший обходной путь?


person PKAP    schedule 01.09.2015    source источник
comment
ye - Я не хочу, чтобы он делал лонгклик   -  person PKAP    schedule 01.09.2015
comment
Из реализации GeneralClickAction видно, что использование перегруженной версии click(ViewAction rollbackAction) вместо стандартной реализации click() может помочь отследить, когда произошел длинный щелчок. Если указано rollbackAction, то оно будет выполнено, если короткий щелчок трансформировался в длинный.   -  person Anatolii    schedule 08.02.2016


Ответы (4)


Это неприятный побочный эффект того, как события касания передаются из вашего тестового кода через RPC в тестируемое приложение Android. Лучшее описание того, почему клики иногда выполняются как длинные клики, можно найти в Исходный код эспрессо.

Вряд ли эта проблема будет решена в ближайшее время. Лучший способ избежать этой проблемы — запустить тесты на устройствах с более высокими характеристиками. Это связано с тем, что вероятность возникновения проблемы зависит от загрузки системы.

person Charles Harley    schedule 07.02.2016
comment
В качестве дополнительного обходного пути попробуйте увеличить значения задержки при длительном нажатии на тестовых устройствах/эмуляторах в разделе Настройки > Специальные возможности > Задержка при касании и удержании. - person Nick Korostelev; 09.05.2016
comment
Увеличение касания и удержания не помогает на Android SDK 26. Я даже пытался установить его на 15 секунд: в настройках оболочки adb установлено значение secure long_press_timeout 15000. Он просто ждет 15 секунд и выполняет длинный щелчок. - person sasha_trn; 18.09.2017
comment
Кажется, это ужасно сломано. Эта проблема уже решена? - person Mike76; 07.10.2019

В дополнение к тому, что сказал Чарльз, я нашел здесь 3 обходных пути: https://github.com/misyobun/android-test-kit/issues/45

Обходной путь 1: (и, возможно, лучший) — передать действие отката в случае, если щелчок превращается в долгий щелчок. В этом случае длинный щелчок будет «отменен», и эспрессо попытается повторить щелчок.

/**
   * Returns an action that performs a single click on the view.
   *
   * If the click takes longer than the 'long press' duration (which is possible) the provided
   * rollback action is invoked on the view and a click is attempted again.
   *
   * This is only necessary if the view being clicked on has some different behaviour for long press
   * versus a normal tap.
   *
   * For example - if a long press on a particular view element opens a popup menu -
   * ViewActions.pressBack() may be an acceptable rollback action.
   *
   * <br>
   * View constraints:
   * <ul>
   * <li>must be displayed on screen</li>
   * <li>any constraints of the rollbackAction</li>
   * <ul>
   */
  public static ViewAction click(ViewAction rollbackAction) {
    checkNotNull(rollbackAction);
    return new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER, Press.FINGER,
        rollbackAction);
  }

Обходной путь 2: это не "способ эспрессо", но он может подойти для некоторых сценариев:

public class CallOnClickAction implements ViewAction {
    @Override
    public Matcher<View> getConstraints() {
        return allOf(isClickable(), isDisplayed());
    }

    @Override
    public String getDescription() {
        return "CallOnClick";
    }

    @Override
    public void perform(UiController uiController, View view) {
        view.callOnClick();

    }
 }

Временное решение 3: если вы не используете двойной щелчок в этом представлении, в этом случае это может быть полезно.

person Yair Kukielka    schedule 09.05.2016

Еще один дополнительный обходной путь — запустить следующую команду на уровне API > 16.

adb shell settings put secure long_press_timeout 1500
person Nick Korostelev    schedule 22.03.2017

У меня был этот эффект, когда анимация была включена. Анимация должна быть отключена для эспрессо

person ligi    schedule 25.09.2016