До сих пор мы можем сделать:
- swipeLeft
- swipeRight
- swipeUp
- swipeDown
Как мы можем использовать swipeTop (вплоть до Top) или swipeBottom (вплоть до дна), является выражением. Пожалуйста, дайте мне пример, если эти методы уже существуют.
До сих пор мы можем сделать:
Как мы можем использовать swipeTop (вплоть до Top) или swipeBottom (вплоть до дна), является выражением. Пожалуйста, дайте мне пример, если эти методы уже существуют.
Пробовали ли вы 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;
}
}
Например, если вы используете recyclerView в своем приложении, вы можете использовать что-то вроде этого:
Espresso.onView(ViewMatchers.withId(R.id.recyclerView)).perform(ViewActions.swipeUp())
или
Espresso.onView(ViewMatchers.withId(R.id.recyclerView)).perform(ViewActions.swipeDown())
Я думаю, что это можно сделать, написав сложный 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());
}
}
Надеюсь, это поможет вам.
@testsingh я думаю, что нет метода вне коробки, чтобы сделать "swipeTop" или "swipeBottom", следующий цикл может быть самым простым способом (тупой), который работал на меня XDDD
//swipeUp 100 раз, наоборот для swipeDown
for(int i=0;i<=100;i++){
onView(withText("label")).perform(swipeUp());
}
Я знаю, что опаздываю на вечеринку, но после довольно долгих размышлений я наконец-то нашел что-то, что может смахивать сверху вниз, слева направо и т.д. - без необходимости идентификаторов ресурсов.
Причина, по которой я нуждался в этом, была для динамически населенного представления, где все было совершенно неоднозначным. С помощью метода, приведенного ниже, я могу прокрутить до самого конца и даже изменить задержку, чтобы прокрутить вниз только одну страницу.
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);
}
Я надеюсь, что это поможет любому, кто запутается в этом.