Щелкните по границам/координатам
Я знаю, что Espresso может щелкнуть по пути UiAutomator. (координаты x и y) Я прочитал документацию, но я не могу ее найти. Любая помощь приветствуется. Благодаря
Edit
Я нашел эту ссылку, но нет примеров того, как ее использовать. Моей главной заботой в этом является UiController
или как ее использовать.
Ответы
Ответ 1
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 является открытым исходным кодом, а сам исходный код имеет действительно хорошее качество.
Ответ 2
@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);
}
Я думал, что поделюсь этим, чтобы другие могли выиграть.
Ответ 3
Действительный ответ мне помог, хотя этот метод устарел.
Теперь вам нужно указать 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)
}
}