2015-01-29 5 views
9

До сих пор мы можем сделать:Эспрессо: как сделать обычай салфетки, например. swipeTop или swipeBottom

  • swipeLeft
  • swipeRight
  • swipeUp
  • swipeDown

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

ответ

4

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

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

+2

слишком много комментариев и точек ... если у вас есть «полный» пример вашего кода, пожалуйста, покажите.Многие люди не знают, что они могут внести в ваш «...» – Morozov

+0

Согласен. Неверно исключать определения переменных и назначения, которые используются в вашем коде. Не стоит экономить несколько строк, если это затрудняет чтение кода. – Project

9

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

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

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

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

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

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

или

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

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

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

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

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

+0

не уверен, почему я получил downvoted - это работает довольно хорошо – Nefariis

+0

, к сожалению, в targetSdk 26, работающем на Android 7, это бросает a: java.lang.SecurityException: для ввода в другое приложение требуется разрешение INJECT_EVENTS, которое предоставляется только системным приложениям. – cV2