web-dev-qa-db-ja.com

境界/座標でクリック

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

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

28
Chad Bingham

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

GeneralClickActionのコンストラクターは、2番目の引数としてCoordinatesProviderを取ります。したがって、基本的な考え方は、カスタム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はオープンソースであり、ソースコード自体は非常に高品質です。

49
haffax

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

他の人が恩恵を受けることができるように、ここでそれを共有すると思いました。

11
lilbyrdie

そのメソッドは非推奨ですが、有効な答えは私を助けました。ここで、inputDeviceを指定する必要があります(たとえば、InputDevice.SOURCE_MOUSE)およびbuttonState(たとえばMotionEvent.BUTTON_PRIMARY

Kotlinの例:

companion object {
    fun clickIn(x: Int, y: Int): ViewAction {
        return GeneralClickAction(
                Tap.SINGLE,
                CoordinatesProvider { view ->
                    val screenPos = IntArray(2)
                    view?.getLocationOnScreen(screenPos)

                    val screenX = (screenPos[0] + x).toFloat()
                    val screenY = (screenPos[1] + y).toFloat()

                    floatArrayOf(screenX, screenY)
                },
                Press.FINGER,
                InputDevice.SOURCE_MOUSE,
                MotionEvent.BUTTON_PRIMARY)
    }
}
4