我知道 Espresso 可以像UiAutomator 那样点击边界。(x 和 y 坐标)我已通读文档,但似乎找不到。任何帮助表示赞赏。谢谢
编辑
我找到了这个链接,但没有示例如何使用它,我主要关心的是它UiController
是或如何使用它。
我知道 Espresso 可以像UiAutomator 那样点击边界。(x 和 y 坐标)我已通读文档,但似乎找不到。任何帮助表示赞赏。谢谢
编辑
我找到了这个链接,但没有示例如何使用它,我主要关心的是它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 是开源的,源代码本身质量非常好。
尽管该方法已被弃用,但有效的答案对我有所帮助。现在您必须指定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)
}
}
@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);
}
我想我会在这里分享它,以便其他人可以受益。