【发布时间】:2014-03-04 16:33:10
【问题描述】:
我知道 Espresso 可以通过 UiAutomator does 的方式点击边界。 (x 和 y 坐标)我已通读文档,但似乎找不到。任何帮助表示赞赏。谢谢
编辑
我找到了this link,但没有示例如何使用它,我主要关心的是UiController 是或如何使用它。
【问题讨论】:
标签: android android-testing android-espresso
我知道 Espresso 可以通过 UiAutomator does 的方式点击边界。 (x 和 y 坐标)我已通读文档,但似乎找不到。任何帮助表示赞赏。谢谢
编辑
我找到了this link,但没有示例如何使用它,我主要关心的是UiController 是或如何使用它。
【问题讨论】:
标签: android android-testing android-espresso
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 是开源的,源代码本身质量非常好。
【讨论】:
onView(...) 写什么?我试过`onView(isRoot())。它失败了,没有匹配。注意:我目前正在前面显示对话框
尽管该方法已被弃用,但有效答案对我有所帮助。
现在你必须指定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);
}
我想我会在这里分享它,以便其他人受益。
【讨论】: