sendeventコマンドを使用してADBを使用してタッチイベントをデバイスに送信するにはどうすればよいですか?


91

AndroidDebugBridgeを使用してタッチイベントをデバイスに送信しようとしています。これにより、UIテストの基本的な自動化を行うことができます。LINKでの議論をフォローしました。sendeventを使用してエミュレーターのタッチをシミュレートすることはできますが、デバイスで同じことを行うことはできません。

上記のリンクのように、エミュレーターはタッチごとに6つのイベント(xcoord、ycoord、プレス用に2、リリース用に2)を送信するようで、この情報を使用してイベントを送信するのは簡単でしたが、デバイスのタッチスクリーンのgeteventは生成するイベントが多すぎます。

誰かがADBからデバイスにタッチを送信することに成功しましたか?ソリューションを共有していただけませんか。


デバイスで、イベントを適切な「入力デバイス」に渡しているかどうかを確認しましたか?すなわち。タッチドライバーとして登録されている入力デバイス?
TheCodeArtist 2011年

回答:


138

Androidには、inputさまざまな入力イベントをシミュレートできるコマンドラインツールが付属しています。タッピングをシミュレートするには、次のようにします。

input tap x y

adbシェル(> 2.3.5)を使用して、コマンドをリモートで実行できます。

adb shell input tap x y

2
nox_adb.exeを使用してNoxアプリで完全に動作しますありがとうございます!
Smeterlink 2015年

2
ダブルタップをテストするために、私はこのi = 0のようなループクリックを書きました。while [$(($ i))-le 2]; do i = $(($ i + 1)); 入力タップ500800; 完了。しかし、それは1秒ごとに場所をクリックしています。ターミナルを使用してより速く行うことはできますか?
Vignesh KM 2017

67

特定のアクション(たとえば、Webブラウザーを開く)を実行するには、最初にどこをタップするかを理解する必要があります。これを行うには、最初に次を実行できます。

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は、位置2f5、16進数で69e、10進数で757および1694でキーが押された(ボタンを押した)ことを通知しています。

同じイベントを生成したい場合は、同じ位置でinputtapコマンドを使用できます。

adb shell input tap 757 1694

詳細については、次を参照してください。

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


12
タッチ座標を見つけるには、[開発者向けオプション]-> [タッチ位置の表示]を使用することをお勧めします。また、値を10進数で示します。
Praveen 2016年

3
16進数を10進数に変換する必要がない場合は、シェルに変換させることができますadb shell input tap $((16#2f5)) $((16#69e))。また、衒学的に言うと、0x2F5と0x69Eはそれぞれ757と1694です...ベース間で変換するために何を使用しましたか?
ghoti 2016年

おかげで確か私が...そのような別のポイントか何かオフにそれをコピーしている必要がありません@ghoti
トマス・

このIの上に構築することは、組み込みコマンド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をご覧ください



5

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してイベントのリストを取得し、grep forを使用してABS_MT_POSITION(タッチイベントの行を16進数で取得)、最後にawkを使用して関連する16進数値を取得し、ゼロを取り除き、16進数を整数に変換します。これにより、デバイスを押した場合にのみ、端末のx座標とy座標が継続的に出力されます。

次に、このadbシェルコマンドを使用して、次のコマンドを送信できます。

adb shell input tap x y

4

Androidのuiautomatorをadbshel​​l uiautomator [...]とともに使用するか、SDKに付属の.jarを直接使用することを検討してください。


ところで、Androidの自動化テストを非常に簡単にするツールがいくつか市場に出回っています。
elist 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.