Эспрессо: как сделать пользовательский салфетки, например. swipeTop или swipeBottom

До сих пор мы можем сделать:

  • swipeLeft
  • swipeRight
  • swipeUp
  • swipeDown

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

Ответ 1

Пробовали ли вы 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;
    }
}

Ответ 2

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

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

или

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

Ответ 3

Я думаю, что это можно сделать, написав сложный 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());
    }
}

Надеюсь, это поможет вам.

Ответ 4

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

//swipeUp 100 раз, наоборот для swipeDown

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

Ответ 5

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

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

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 - это ось х).

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

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

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