2015-01-29 4 views

risposta

4

Penso che si potrebbe fare scrivendo complesso ViewActions eseguendo lo scorrimento.

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

dove MySwipeAction potrebbe essere qualcosa di simile:

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

Spero che questo potrebbe aiutare.

+2

troppi commenti e punti ... se si dispone di un esempio "completo" del codice, si prega di mostrare.Molte persone non sanno cosa possono inserire nel tuo '...' – Morozov

+0

Sono d'accordo. È fuorviante escludere le definizioni e le assegnazioni di variabili utilizzate nel codice. Non vale la pena salvare alcune righe se rende il codice più difficile da leggere. – Project

9

Hai provato un GeneralSwipeAction così?

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

Forse è necessario fornire un'implementazione personalizzata per il secondo e/o terzo parametro, come Anna già accennato:

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

@testsingh Penso che ci sia nessun metodo out-off-box a fare il "swipeTop" o "swipeBottom" seguente loop forse il modo più semplice (stupida) che ha funzionato per me XDDD

// swipeUp 100 volte, viceversa per swipeDown

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

Ad esempio se si utilizza recyclerView in applicazione tua, si può usare qualcosa di simile:

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

o

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

So di essere in ritardo alla festa, ma dopo un po ' di finirla ho finalmente trovato qualcosa che può scorrere da cima a fondo, da sinistra a destra, ecc. - senza bisogno di alcun ID di risorsa.

Il motivo per cui avevo bisogno era per una vista popolata dinamicamente in cui tutto era completamente ambiguo. Con il metodo qui sotto, posso scorrere fino in fondo e persino modificare il ritardo per scorrere verso il basso di una singola pagina.

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 
} 

non ho bisogno sinistra a destra, ecc così ho hardcoded la 500 in là (500 essendo l'asse x).

e chiamarli l'ho fatto ho fatto questo -

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

Spero che questo aiuta tutti coloro che inciampa su questo.

+0

non sono sicuro del motivo per cui ho downvoted - questo funziona piuttosto bene – Nefariis

+0

sfortunatamente su targetSdk 26, in esecuzione su Android 7 questo genera: java.lang.SecurityException: l'inserimento in un'altra applicazione richiede l'autorizzazione INJECT_EVENTS, che è concessa solo alle app di sistema. – cV2

Problemi correlati