真机上运行monkeyrunner python脚本踩坑系列一
monkeyrunner工具提供了一个API,可以控制Android设备和模拟器。通过monkeyrunner,可以写python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图传送回来。
使用monkeyrunner命令运行脚本时,脚本最好也建在tools目录下。
MonkeyDevice目前操作是根据坐标,EasyMonkeyDevice可以通过控件ID来操作,其实就是在MonkeyDevice和HierarchyViewer的基础上加了一层Wrapper,其实最终它们都会转换成坐标点或ViewNode进行操作。
但如果这个时候你的python脚本里调用 EasyMonkeyDevice,会报以下错误。
java.lang.RuntimeException: Could not connect to the view server
这是因为EasyMonkeyDevice需要用Hiararchy Viewer获取当前手机实时的UI信息,提供了根据ID找到viewnode,对viewnode的一些操作。它在连接手机时,手机上必须启动一个叫View Server的客户端与其进行socket通信。而在商业手机上,是无法开启view server的
也就是说,EasyMonkeyDevice这个模块,只能运行在虚拟机或者开发机中,当然,商业机也是可以跑的,但是需要root之后再刷机,这个就很坑了。。。
http://stackoverflow.com/questions/27147772/easymonkeydevice-not-found-error-while-running-monkeyrunner-python-script 这里面有提到,可以使用AndroidViewClient来根据控件ID操作手机,https://github.com/dtmilano/AndroidViewClient/wiki上讲了安装的几种方式,同时还需要导入环境变量。
在尝试这种方式的时候,遇到了两个问题,第一个就是找不到module,解决办法在这里:http://stackoverflow.com/questions/12351918/importerror-no-module-named-dtmilano,导入环境变量,然后更改下导包顺序就好了。第二个问题是,里面的方法报错,这个时候我已经头大了,尝试了官网上的所有安装方法,都报相同的错。无奈下选择放弃。
最后,我直接使用坐标来点击屏幕。还有网上有很多monkey_recorder.py脚本,可以直接使用,能够实时记录你点击手机的坐标。
对于不固定的坐标,我在访问那个页面的时候,直接下载布局文件,然后解析该文件,根据关键词获得坐标。(感觉这个方法蠢得不行了。。。)
#coding: UTF-8from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImageimport osdevice=MonkeyRunner.waitForConnection()device.startActivity(component="***") #component内容是要启动的类,包括包名和类名,如果对于一个apk不知道其启动类的话,可以先启动该app,然后用adb查看当前运行的最上层的类MonkeyRunner.sleep(5)os.popen("adb shell uiautomator dump & adb pull /sdcard/window_dump.xml F:\\") #下载当前布局,并回传到本机的F盘根目录,这个时候就可以查看布局坐标了device.touch(909,1620,u'DOWN_AND_UP')MonkeyRunner.sleep(10)result = device.takeSnapshot()MonkeyRunner.sleep(2)result.writeToFile('F:\\a.png','png')print("Image success!!")MonkeyRunner.sleep(20)
这里又出幺蛾子了。。。拍照的时候,报错如下
这个错误不固定,有时候成功,有时候报错,有时候截图是全黑。
而且上面这种方式,sleep也是一个很重要的函数,如果页面还没跳转或是未加载完成,那么就很可能出错。
这里还有一种方法,不过我没尝试过,有兴趣的同学可以看看:http://blog.csdn.net/tzh2009/article/details/8152382
各位大佬如果知道我的错误,或是有其他更好的办法,求指点啊!
更多相关文章
- android 预装第三方apk的方法(非system priv-app)
- Android(安卓)定时任务过程详解
- Android(安卓)Studio如何设置自动import价包
- StatusBar (状态栏)的架构(Android(安卓)2.3)
- Android中LocationManager的简单使用01
- 百度也出手机操作系统
- 如何编译Android(安卓)ASE
- Android――ContentProvider (一)创建contentProvider
- Android(安卓)TextView drawText BaseLine理解,设置内容垂直、水