单击边界/坐标

时间:2014-03-04 16:33:11

标签: android android-testing android-espresso

我知道Espresso可以按UiAutomator does的方式点击界限。 (x和y坐标)我已经阅读了文档,但我似乎无法找到它。任何帮助表示赞赏。感谢

修改
我找到this link,但没有示例如何使用它,我主要关心的是UiController是或如何使用它。

3 个答案:

答案 0 :(得分:49)

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是开源的,源代码本身质量非常好。

答案 1 :(得分: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);
}

我以为我会在这里分享,以便其他人可以受益。

答案 2 :(得分:2)

虽然该方法已被弃用,但有效的答案对我有所帮助。 现在,您必须指定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)
    }
}