Эспрессо: как сделать пользовательское смахивание, например. проведите сверху или снизу

Пока что мы можем сделать:

  • проведите пальцем влево
  • проведите вправо
  • проведите вверх
  • проведите вниз

Как мы можем swipeTop (вплоть до верха) или swipeBottom (вплоть до самого низа) — это экспрессо. Пожалуйста, приведите пример, если эти методы уже существуют.


person testsingh    schedule 29.01.2015    source источник


Ответы (6)


Вы пробовали GeneralSwipeAction подобное?

private static ViewAction swipeFromTopToBottom() {
    return new GeneralSwipeAction(Swipe.FAST, GeneralLocation.TOP_CENTER,
            GeneralLocation.BOTTOM_CENTER, Press.FINGER);
}

Возможно, вам нужно предоставить собственную реализацию для второго и/или третьего параметра, как уже упоминала Анна:

new CoordinatesProvider() {
    @Override
    public float[] calculateCoordinates(View view) {
        float[] coordinates =  GeneralLocation.CENTER.calculateCoordinates(view);
        coordinates[1] = 0;
        return coordinates;
    }
}
person Alexander Pacha    schedule 04.10.2015

Например, если вы используете recyclerView в своем приложении, вы можете использовать что-то вроде этого:

Espresso.onView(ViewMatchers.withId(R.id.recyclerView)).perform(ViewActions.swipeUp())

or

Espresso.onView(ViewMatchers.withId(R.id.recyclerView)).perform(ViewActions.swipeDown())
person Morozov    schedule 22.02.2017

Я знаю, что опаздываю на вечеринку, но после долгих поисков я наконец нашел что-то, что может смахивать сверху вниз, слева направо и т. д. — без необходимости в идентификаторах ресурсов.

Причина, по которой мне это было нужно, заключалась в динамически заполняемом представлении, где все было совершенно неоднозначно. С помощью приведенного ниже метода я могу прокручивать страницу до конца и даже изменять задержку, чтобы прокручивать вниз только одну страницу.

static void swiper(int start, int end, int delay) {
    long downTime = SystemClock.uptimeMillis();
    long eventTime = SystemClock.uptimeMillis();
    Instrumentation inst = getInstrumentation();

    MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, 500, start, 0);
    inst.sendPointerSync(event);
    eventTime = SystemClock.uptimeMillis() + delay;
    event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, 500, end, 0);
    inst.sendPointerSync(event);
    event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, 500, end, 0);
    inst.sendPointerSync(event);
    SystemClock.sleep(2000); //The wait is important to scroll
}

Мне не нужно слева направо и т. д., поэтому я жестко закодировал там 500 (500 — это ось x).

и чтобы позвонить им я сделал это я сделал это -

 // This swipes all the way to the bottom of the screen
public static void swipeToBottom(){
    swiper(1000, 100, 0);
}

// This scrolls down one page at a time
public static void scrollSlowlyDown(){
    swiper(775, 100, 100);
}

// This swipes to the top
public static void swipeToTop(){
    swiper(100, 1000, 0);
}

// This scrolls up one page at a time
public static void scrollSlowlyUp(){
    swiper(100, 775, 100);
}

Я надеюсь, что это поможет любому, кто спотыкается об этом.

person Nefariis    schedule 22.02.2017
comment
не уверен, почему меня минусуют - это работает довольно хорошо - person Nefariis; 09.11.2017
comment
к сожалению, в targetSdk 26, работающем на Android 7, выдается: java.lang.SecurityException: для внедрения в другое приложение требуется разрешение INJECT_EVENTS, которое предоставляется только системным приложениям. - person cV2; 14.11.2017

@testsingh я думаю, что нет готового метода для выполнения «swipeTop» или «swipeBottom» после зацикливания, возможно, самый простой способ (самый глупый), который сработал для меня XDDD

//свайп вверх 100 раз, наоборот для свайпа вниз

for(int i=0;i<=100;i++){
  onView(withText("label")).perform(swipeUp());
}
person yitelu    schedule 16.05.2016

Я думаю, это можно сделать, написав сложный ViewActions, выполнив свайп.

public static ViewAction swipeToTop() {
    return new MySwipeAction(Swipe.FAST,
        GeneralLocation.CENTER,
        new CoordinatesProvider() {
            @Override
            public float[] calculateCoordinates(View view) {
                float[] coordinates =  GeneralLocation.CENTER.calculateCoordinates(view);
                coordinates[1] = 0;
                return coordinates;
            }
    }, Press.FINGER);
}


public static ViewAction swipeToBottom() {
    return new MySwipeAction(Swipe.FAST,
        GeneralLocation.CENTER,
        new CoordinatesProvider() {
            @Override
            public float[] calculateCoordinates(View view) {
                float[] coordinates = GeneralLocation.CENTER.calculateCoordinates(view);
                coordinates[1] = view.getContext().getResources().getDisplayMetrics().heightPixels;
                return coordinates;
            }
    }, Press.FINGER);
}

где MySwipeAction может быть примерно таким:

public class MySwipeAction implements ViewAction {
    public MySwipeAction(Swiper swiper, CoordinatesProvider startCoordProvide, CoordinatesProvider endCoordProvide, PrecisionDescriber precDesc) { 
           // store here in class variables to use in perform
           ...
    }

    @Override public Matcher<View> getConstraints() {...}

    @Override public String getDescription() {...}

    @Override
    public void perform(UiController uiController, View view) {
        ...
        float[] startCoord = startCoordProvide.calculateCoordinates(view);
        float[] finalCoord = endCoordProvide.calculateCoordinates(view);
        float[] precision =  precDesc.describePrecision();

        Swiper.Status status = Swiper.Status.FAILURE;

        // you could try this for several times until Swiper.Status is achieved or try count is reached
        try {
            status = m_swiper.sendSwipe(uiController, startCoord, finalCoord, precision);
        } catch (RuntimeException re) {
            ...
        }

        // ensures that the swipe has been run.
        uiController.loopMainThreadForAtLeast(ViewConfiguration.getPressedStateDuration());
    }
}

Я надеюсь, что это может помочь вам.

person Anna    schedule 02.02.2015
comment
слишком много комментариев и точек... если у вас есть полный пример вашего кода, пожалуйста, покажите. Многие люди не знают, что они могут ввести в ваше «...» - person Morozov; 22.02.2017
comment
Я согласен. Исключение определений и назначений переменных, которые используются в вашем коде, сбивает с толку. Не стоит экономить несколько строк, если это затрудняет чтение кода. - person Robert Liberatore; 24.02.2017

// проведите вверх

for(int i=0;i<=3;i++){
    onView(allOf(withId(R.id.recycler_view),isDisplayed())).perform(actionOnItemAtPosition(4, swipeUp()));
}

//проведите вниз

for(int i=0;i<=3;i++){
     onView(allOf(withId(R.id.recycler_view),isDisplayed())).perform(actionOnItemAtPosition(7, swipeDown()));
}
person Max    schedule 12.06.2020