真机上运行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-8
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
import os
device=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)

这里又出幺蛾子了。。。拍照的时候,报错如下

真机上运行monkeyrunner python脚本踩坑系列一_第1张图片

这个错误不固定,有时候成功,有时候报错,有时候截图是全黑。

而且上面这种方式,sleep也是一个很重要的函数,如果页面还没跳转或是未加载完成,那么就很可能出错。

这里还有一种方法,不过我没尝试过,有兴趣的同学可以看看:http://blog.csdn.net/tzh2009/article/details/8152382

各位大佬如果知道我的错误,或是有其他更好的办法,求指点啊!

 
  
 
  
 
  
 
 

你可能感兴趣的:(android)