Щелкните по границам/координатам

Я знаю, что Espresso может щелкнуть по пути UiAutomator. (координаты x и y) Я прочитал документацию, но я не могу ее найти. Любая помощь приветствуется. Благодаря

Edit
Я нашел эту ссылку, но нет примеров того, как ее использовать. Моей главной заботой в этом является UiController или как ее использовать.

Ответ 1

Espresso имеет GeneralClickAction, это базовая реализация ViewActions click(), doubleClick() и longClick().

Конструктор GeneralClickAction принимает второй аргумент CoordinatesProvider. Итак, основная идея - создать статический ViewAction getter, который предоставляет пользовательский 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 является открытым исходным кодом, а сам исходный код имеет действительно хорошее качество.

Ответ 2

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

Я думал, что поделюсь этим, чтобы другие могли выиграть.

Ответ 3

Действительный ответ мне помог, хотя этот метод устарел. Теперь вам нужно указать 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)
    }
}