web-dev-qa-db-ja.com

エスプレッソ:カスタムスワイプの方法(例: swipeTopまたはswipeBottom

これまでのところ、次のことができます。

  • 左スワイプ
  • スワイプ右
  • 上にスワイプする
  • スワイプダウン

スワイプトップ(一番上まで)またはスワイプボトム(一番下まで)はどのようにエスプレッソです。これらのメソッドがすでに存在する場合の例を教えてください。

14
testsingh

そのようなGeneralSwipeActionを試しましたか?

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

アンナがすでに述べたように、2番目または3番目のパラメータのカスタム実装を提供する必要があるかもしれません。

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

たとえば、アプリケーションでrecyclerViewを使用する場合は、次のようなものを使用できます。

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

または

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

パーティーに遅れていることはわかっていますが、かなりの手間をかけた後、リソースIDを必要とせずに、上から下、左から右などにスワイプできるものをようやく見つけました。

私がそれを必要とした理由は、すべてが完全に曖昧な動的に入力されたビューのためでした。以下の方法で、一番下までスクロールしたり、遅延を変更して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は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);
}

これがつまずいた人の助けになることを願っています。

4
Nefariis

スワイプを実行して複雑な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
Anna

@testsinghループに続いて、「swipeTop」または「swipeBottom」を実行するためのすぐに使える方法はないと思います。XDDDで最も簡単な方法(最も愚かな方法)かもしれません。

// swipeUpを100回、swipeDownの場合はその逆

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