私は、Espressoが方法で境界をクリックすることが可能であることを知っています iAutomatorはそうします 。 (x座標とy座標)ドキュメントを読みましたが、見つからないようです。どんな助けでも大歓迎です。ありがとう
編集
私は このリンク を見つけましたが、それを使用する方法の例はありません。これに関する私の主な関心事は、UiController
またはそれを使用する方法です。
Espressoには GeneralClickAction
があります。これは、ViewActions click()
、doubleClick()
、およびlongClick()
の基本的な実装です。
GeneralClickAction
のコンストラクターは、2番目の引数としてCoordinatesProvider
を取ります。したがって、基本的な考え方は、カスタムViewAction
を提供する静的な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)
}
}