我知道Espresso可以按UiAutomator does的方式点击界限。 (x和y坐标)我已经阅读了文档,但我似乎无法找到它。任何帮助表示赞赏。感谢
修改
我找到this link,但没有示例如何使用它,我主要关心的是UiController
是或如何使用它。
答案 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)
}
}