点击边界/坐标

我知道Espresso可以通过UiAutomator的方式点击 。 (x和y坐标)我已经通过文档阅读,但我似乎无法find它。 任何帮助表示赞赏。 谢谢

编辑
我发现这个链接 ,但没有例子如何使用它,我主要关心的是UiController是或如何使用它。

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

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

我以为我会在这里分享,让别人可以受益。

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