ADB를 사용하여 sendevent 명령을 사용하여 장치에 터치 이벤트를 보내는 방법은 무엇입니까?


88

UI 테스트를위한 몇 가지 기본 자동화를 수행 할 수 있도록 AndroidDebugBridge를 사용하여 기기에 터치 이벤트를 보내려고합니다. 나는 LINK 에서 토론을 따랐다 . sendevent를 사용하여 에뮬레이터에서 터치를 시뮬레이션 할 수 있지만 장치에서는 동일하게 수행 할 수 없습니다.

위의 링크에서와 같이 에뮬레이터는 각 터치에 대해 6 개의 이벤트 (xcoord, ycoord, 2는 보도, 2는 릴리스)를 보내는 것으로 보이며이 정보를 사용하여 이벤트를 보내는 것은 쉬웠지만 장치의 터치 스크린에 대한 getevent는 다음과 같은 것 같습니다. 너무 많은 이벤트를 생성합니다.

누군가 ADB에서 장치로 터치를 보낼 수 있습니까? 해결책을 공유해 주시겠습니까?


장치에서 이벤트를 적절한 "입력 장치"로 전달하고 있는지 확인 했습니까? 즉. 터치 드라이버로 등록 된 입력 장치
TheCodeArtist 2011 년

답변:


135

Android에는 input기타 입력 이벤트를 시뮬레이션 할 수 있는 명령 줄 도구 가 함께 제공됩니다 . 두드리기를 시뮬레이션하려면 다음과 같습니다.

input tap x y

adb 셸 (> 2.3.5)을 사용하여 명령을 원격으로 실행할 수 있습니다.

adb shell input tap x y

2
nox_adb.exe를 사용하여 Nox 앱에서 완벽하게 작동합니다. 감사합니다!
Smeterlink

2
두 번 탭하기 위해 나는 다음과 같은 루프 클릭을 작성했습니다. i = 0; while [$ (($ i)) -le 2]; do i = $ (($ i + 1)); 입력 탭 500800; 끝난; 그러나 그것은 1 초마다 장소를 클릭합니다. 터미널을 사용하여 더 빨리 할 수 ​​있습니까?
Vignesh KM

66

특정 작업 (예 : 웹 브라우저 열기)을 수행하려면 먼저 탭할 위치를 파악해야합니다. 이를 위해 먼저 다음을 실행할 수 있습니다.

adb shell getevent -l

원하는 위치에서 장치를 누르면 다음 출력이 표시됩니다.

<...>
/dev/input/event3: EV_KEY       BTN_TOUCH            DOWN
/dev/input/event3: EV_ABS       ABS_MT_POSITION_X    000002f5
/dev/input/event3: EV_ABS       ABS_MT_POSITION_Y    0000069e

adb는 십진수로 757 및 1694 인 16 진수 위치 2f5, 69e에서 키를 눌렀 음을 알려줍니다 (버튼 누름).

이제 동일한 이벤트를 생성하려는 경우 동일한 위치에서 입력 탭 명령을 사용할 수 있습니다.

adb shell input tap 757 1694

자세한 정보는 다음에서 찾을 수 있습니다.

https://source.android.com/devices/input/touch-devices.html http://source.android.com/devices/input/getevent.html


11
터치 좌표를 찾으려면 개발자 옵션-> 터치 위치 표시를 사용하는 것이 좋습니다. 또한 십진수로 값을 제공합니다.
Praveen

3
16 진수를 10 진수로 변환 할 필요가 없다면 쉘이하도록 할 수 있습니다 adb shell input tap $((16#2f5)) $((16#69e)).. 또한, 현학적으로 말하자면, 0x2F5와 0x69E는 각각 757과 1694입니다. 염기를 변환하기 위해 무엇을 사용 했습니까?
ghoti

감사합니다 @ghoti 내가 그것을 다른 지점이나 그와 비슷한 것에서 복사 했음이 확실하지 않습니다 ...
Tomas

이를 바탕으로 adb shell getevent -l | grep ABS_MT_POSITION --line-buffered | awk '{a = substr($0,54,8); sub(/^0+/, "", a); b = sprintf("0x%s",a); printf("%d\n",strtonum(b))}'탭 위치를 정수로 가져 오는 명령 을 빌드했습니다.
kyczawon

12

2.3.5는 없었 input tap습니다. input keyevent그리고 input text 당신은 그것을 위해 monkeyrunner를 사용할 수 있습니다 : (이것은 https://stackoverflow.com/a/18959385/1587329 에있는 대답의 복사본입니다 ) :

다음 과 같이 monkeyrunner 를 사용할 수 있습니다 .

$ monkeyrunner
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)

드래그를하거나 활동을 시작하는 등의 작업을 할 수도 있습니다 . MonkeyDevice 용 API를 살펴보세요 .



4

adb shell uiautomator [...]와 함께 Android의 uiautomator를 사용하거나 SDK와 함께 제공되는 .jar를 직접 사용하는 것이 좋습니다.


BTW, Android의 자동화 테스트를 훨씬 쉽게 할 수있는 몇 가지 도구가 시장에 나와 있습니다.
Elist 2013-06-16

4

Tomas의 답변을 바탕으로 이것이 내가 찾은 정수로 위치 탭 위치를 찾는 가장 좋은 방법입니다.

adb shell getevent -l | grep ABS_MT_POSITION --line-buffered | awk '{a = substr($0,54,8); sub(/^0+/, "", a); b = sprintf("0x%s",a); printf("%d\n",strtonum(b))}'

사용은 adb shell getevent -l이벤트 목록을 얻을 수에 대한 사용 그렙은 ABS_MT_POSITION마지막으로하고, 관련 16 진수 값을 얻을 수 AWK 사용하는 정수로 0과 1의 변환 진수 그들을 제거 (터치 진수의 이벤트와 라인을 얻는다). 이것은 장치를 눌렀을 때만 터미널의 x 및 y 좌표를 계속 인쇄합니다.

그런 다음이 adb 셸 명령을 사용하여 명령을 보낼 수 있습니다.

adb shell input tap x y
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.