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

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

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

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



답변

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

input tap x y

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

adb shell input tap x y


답변

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

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


답변

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를 살펴보세요 .


답변

사용할 필요가 없습니다

adb 쉘 getevent -l

명령을 실행하려면 장치의 개발자 옵션에서 [터치 데이터 표시]를 활성화하면 X와 Y를 얻을 수 있습니다.

더 많은 정보는 여기 내 기사에서 찾을 수 있습니다 : https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/


답변

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


답변

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


답변