30

我知道 Espresso 可以像UiAutomator 那样点击边界。(x 和 y 坐标)我已通读文档,但似乎找不到。任何帮助表示赞赏。谢谢

编辑
我找到了这个链接,但没有示例如何使用它,我主要关心的是它UiController是或如何使用它。

4

3 回答 3

59

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

于 2014-04-01T22:19:58.090 回答
13

尽管该方法已被弃用,但有效的答案对我有所帮助。现在您必须指定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)
    }
}
于 2018-01-25T15:39:10.273 回答
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 回答