30

私は、Espresso がUiAutomator のように限界までクリックできることを知っています。(x 座標と y 座標) ドキュメントを読みましたが、見つからないようです。どんな助けでも大歓迎です。ありがとう

編集このリンク
を見つけましたが、使用方法の例はありません。これに関する私の主な関心事は、それまたは使用方法です。UiController

4

3 に答える 3

59

Espresso には がありGeneralClickAction、これは ViewActions click()doubleClick()、およびの基本的な実装ですlongClick()

GeneralClickActionコンストラクターは、CoordinatesProvider2 番目の引数として a を取ります。したがって、基本的な考え方はViewAction、カスタムを提供する静的ゲッターを作成することCoordinatesProviderです。このようなもの:

public static ViewAction clickXY(final int x, final int y){
    return new GeneralClickAction(
        Tap.SINGLE,
        new CoordinatesProvider() {
            @Override
            public float[] calculateCoordinates(View view) {

               final int[] screenPos = new int[2];
               view.getLocationOnScreen(screenPos);

               final float screenX = screenPos[0] + x;
               final float screenY = screenPos[1] + y;
               float[] coordinates = {screenX, screenY};

               return coordinates;
            }
        },
        Press.FINGER);
}

Espresso に関する一般的なアドバイス: ドキュメント (事実上何もない) を探す代わりに、ソース コードを調べてください。Espresso はオープン ソースであり、ソース コード自体は非常に高品質です。

于 2014-04-01T22:19:58.090 に答える
11

@haffaxの答えは素晴らしく、うまく機能します。

ただし、画面ごとに変化する可能性のあるビューの特定の部分をクリックする場合は、dp 値でさえすべての画面で安定していない可能性があるため、パーセント (または比率) に基づいてクリックすると便利な場合があります。だから、私はそれに簡単な変更を加えました:

    public static ViewAction clickPercent(final float pctX, final float pctY){
    return new GeneralClickAction(
            Tap.SINGLE,
            new CoordinatesProvider() {
                @Override
                public float[] calculateCoordinates(View view) {

                    final int[] screenPos = new int[2];
                    view.getLocationOnScreen(screenPos);
                    int w = view.getWidth();
                    int h = view.getHeight();

                    float x = w * pctX;
                    float y = h * pctY;

                    final float screenX = screenPos[0] + x;
                    final float screenY = screenPos[1] + y;
                    float[] coordinates = {screenX, screenY};

                    return coordinates;
                }
            },
            Press.FINGER);
}

他の人が利益を得ることができるように、ここで共有すると思いました。

于 2016-06-02T15:31:39.763 に答える