Android 模拟用户点击¶
更新日期: 2021-12-2
- 2021-12-2 更新内容
- 2018-02-05 创建文档
Android模拟用户点击。在自动化测试中可使用的工具。可以利用adb命令,也可以使用Android SDK中的monkeyrunner
工具。
使用adb命令¶
主要使用input命令
# win7
usage: input ...
input text <string>
input keyevent <key code number or name>
input tap <x> <y>
input swipe <x1> <y1> <x2> <y2>
tap是touch屏幕的事件,只需给出x、y坐标即可
swipe模拟滑动的事件,给出起点和终点的坐标即可
# 模拟点击位置 (100,100)
adb shell input tap 100 100
# 模拟滑动 从(650, 250)到(200,300)
adb shell input swipe 650 250 200 300
win7下,编写一个bat脚本,模拟用户滑动
@echo off
echo --------- Mock start ----------
:tag_start
echo running...
adb shell input swipe 650 250 200 666
@ping 127.0.0.1 -n 8 >nul
goto tag_start
echo --------- Mock finish ---------
pause
死循环发送滑动命令,延时语句
requires INJECT_EVENTS permission¶
在红米9(Android 10)上尝试使用adb,报SecurityException异常
requires INJECT_EVENTS permission
~ $ adb shell input swipe 650 250 200 666
java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission
at android.os.Parcel.createException(Parcel.java:2074)
at android.os.Parcel.readException(Parcel.java:2042)
at android.os.Parcel.readException(Parcel.java:1990)
at android.hardware.input.IInputManager$Stub$Proxy.injectInputEvent(IInputManager.java:925)
at android.hardware.input.InputManager.injectInputEvent(InputManager.java:886)
at com.android.commands.input.Input.injectMotionEvent(Input.java:428)
at com.android.commands.input.Input.access$200(Input.java:41)
at com.android.commands.input.Input$InputSwipe.sendSwipe(Input.java:258)
at com.android.commands.input.Input$InputSwipe.run(Input.java:242)
at com.android.commands.input.Input.onRun(Input.java:108)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:56)
at com.android.commands.input.Input.main(Input.java:71)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:380)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.input.InputManagerService.injectInputEventInternal(InputManagerService.java:735)
at com.android.server.input.InputManagerService.injectInputEvent(InputManagerService.java:709)
at android.hardware.input.IInputManager$Stub.onTransact(IInputManager.java:422)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
在开发者选项里,打开「USB调试(安全设置)」选项
monkeyrunner¶
环境配置,配置好Java与Android SDK的环境变量。手机连接到电脑。
系统变量中加入ANDROID_SWT
,此例中路径为G:\SDK\tools\lib\x86_64
修改后的脚本rustmonkeyrunner.bat
,Windows环境下需要在gitbash或CMD里运行
来自unable-to-access-jarfile-framework-monkeyrunner-25-3-2-jar
@echo off
rem Copyright (C) 2010 The Android Open Source Project
rem
rem Licensed under the Apache License, Version 2.0 (the "License");
rem you may not use this file except in compliance with the License.
rem You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.
rem don't modify the caller's environment
setlocal
rem Set up prog to be the path of this script, including following symlinks,
rem and set up progdir to be the fully-qualified pathname of its directory.
set prog=%~f0
rem Change current directory and drive to where the script is, to avoid
rem issues with directories containing whitespaces.
cd /d %~dp0
rem Check we have a valid Java.exe in the path.
set java_exe=
call ..\lib\find_java.bat
if not defined java_exe goto :EOF
for /f %%a in ("%APP_HOME%\lib\monkeyrunner-25.3.2.jar") do set jarfile=%%~nxa
set frameworkdir=.
set libdir=
if exist %frameworkdir%\%jarfile% goto JarFileOk
set frameworkdir=..\lib
if exist %frameworkdir%\%jarfile% goto JarFileOk
set frameworkdir=..\framework
:JarFileOk
set jarpath=%frameworkdir%\%jarfile%
if not defined ANDROID_SWT goto QueryArch
set swt_path=%ANDROID_SWT%
goto SwtDone
:QueryArch
for /f "delims=" %%a in ('%frameworkdir%\..\bin\archquery') do set swt_path=%frameworkdir%\%%a
:SwtDone
if exist "%swt_path%" goto SetPath
echo SWT folder '%swt_path%' does not exist.
echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
exit /B
:SetPath
call "%java_exe%" -Xmx512m "-Djava.ext.dirs=%frameworkdir%;%swt_path%" -Dcom.android.monkeyrunner.bindir=..\..\platform-tools -jar %jarpath% %*
运行脚本
Administrator@rust-PC ~
$ /cygdrive/g/SDK/tools/bin/rustmonkeyrunner.bat
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:54:35)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_77
首次运行时import模块迟迟没有反应
尝试运行脚本an_test2.py
import os
print("importing module...")
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
print("waiting for connection...")
device = MonkeyRunner.waitForConnection()
print("device found!")
s_wid = int(device.getProperty("display.width")) # 获取屏幕宽度像素
s_height = int(device.getProperty("display.height")) # 获取屏幕高度像素
print("build.version.sdk " + str(device.getProperty("build.version.sdk")))
print("display.width " + str(s_wid))
print("display.height " + str(s_height))
drag_point_left_x = 20
drag_point_right_x = s_wid - 20
drag_point_y = s_height / 2
for i in range(0, 10):
print("current loop is " + str(i))
device.drag((drag_point_right_x, drag_point_y), (drag_point_left_x, drag_point_y), 1.0, 50)
print("waiting...")
MonkeyRunner.sleep(1)
print("continue")
device.drag((drag_point_left_x, drag_point_y), (drag_point_right_x, drag_point_y), 0.5, 3)
MonkeyRunner.sleep(3)
print("-------- finish --------")
命令行直接执行,可以看到执行结果和相应的报错信息
C:\Users\Administrator>G:\SDK\tools\bin\rustmonkeyrunner.bat H:\fisher_p\py_ws\an_test2.py
importing module...
waiting for connection...
device found!
build.version.sdk 23
display.width 1440
display.height 2560
current loop is 0
waiting...
continue
current loop is 1
# .....
-------- finish --------
参考¶
本站说明
一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~