前一段做到手机软件的自动化,找朋友咨询了一下,答复说用的比较多的是monkeyrunner和adb工具。于是就试了试。先试了下有源码的公司项目,这个比较容易,启动的activity和控件id一类的在源码里面都有呢。于是想试试只有apk包的,就拿youni来试试吧。
Youni是盛大公司产品,可以免费发短信(对方也得是youni会员),实际使用层面,和qq不觉得有啥不同,测试了一下,倒是真的走的短信接口。咱就来试试发发短信。
后面会提到的两个工具都是sdk自带的,位置在:android-sdk\tools,至于手机是用的ZTE中兴N880S,别砸砖,哥们比较穷,所以手机比较挫,youni的程序是从豌豆荚上下载后在pc上安装到手机的。
好了,咱先写一个id引用方式操作界面的脚本,在写脚本之前,得先看看界面,分析一下操作步骤:
第一个界面:
001.png
这是主界面,进入这个界面,我们需要知道他的package和activity,进入界面后,要点击那个新消息,所以还得知道这个控件的id,点击后,就进入第二个界面:
002.png
在这个界面上,需要操作的控件有三个:发送的号码,短信内容和发送按钮。
小结一下,我们需要得到五个东西:
1. 主界面的[package和activity];
2. 主界面的[新消息] 控件id;
3. 第二个界面的[发送的号码] 控件id;
4. 第二个界面的[短信内容] 控件id;
5. 第二个界面的[发送按钮] 控件id;
来,咱来取得这个东东,先启动工具hierarchyviewer.bat(android-sdk\tools),在启动前把其他的连接手机的工具暂时关闭,避免影响,启动后看看:
003.jpg
得到了第一项:主界面的[package和activity];
Package=com.snda.youni
Activity= com.snda.youni.YouNi
哈哈,这下可以启动程序了。点击[Load View Hierarchy],进入另外一个界面,来找找那个新消息控件:
004.jpg
先设置20%缩放,这样拉动viewtree的时候比较容易看到哪个控件被选中了;然后在缩略图里面点击那个新消息的位置,光标停留在上面的时候,会显示真实的控件样子,仔细看,是不是看到了新消息几个字;选上了以后,拉动一下viewtree,被选中的控件很显眼,因为会弹出一个描述,放大放大,就是下面这个样子:
005.jpg
可以肯定了,就是这个控件了,第二项:主界面的[新消息] 控件id=new_chat,顺带看看这个控件的其他属性,比如:mLeft,mTop,mBottom,mWidth,mHeight,如果你的脚本是直接点击,就可以参考这些属性了,左面往右一点就能点击到控件了。
手机上点击控件[新消息],进入第二个界面,点击[Load View Hierarchy],找寻后三项,有点慢,别着急,等等。后面三项很容易找到了。
第二个界面的[发送的号码] 控件id= btn_send
第二个界面的[短信内容] 控件id= recipients_editor
第二个界面的[发送按钮] 控件id= edit_text
好了,我写两个版本吧,一个是用id来引用的,另外一个是绝对定位操作的,供大家参考:
第一个版本:id引用控件
优点:跟屏幕分辨率无关
缺点:超级慢
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice from com.android.monkeyrunner.easy import EasyMonkeyDevice from com.android.monkeyrunner.easy import By
package = 'com.snda.youni' activity = 'com.snda.youni.YouNi' runComponent = package + '/' + activity
device = MonkeyRunner.waitForConnection('N880_LOWCOST') device.startActivity(component=runComponent) easy_device = EasyMonkeyDevice(device) MonkeyRunner.sleep(3.0) easy_device.touch(By.id('id/new_chat'), MonkeyDevice.DOWN_AND_UP)
easy_device.touch(By.id('id/edit_text'), MonkeyDevice.DOWN_AND_UP) device.type('sms content') easy_device.touch(By.id('id/recipients_editor'), MonkeyDevice.DOWN_AND_UP) device.type('13316612345') device.press('KEYCODE_BACK', 'DOWN_AND_UP') easy_device.touch(By.id('id/btn_send'), MonkeyDevice.DOWN_AND_UP) device.press('KEYCODE_BACK', 'DOWN_AND_UP') device.press('KEYCODE_BACK', 'DOWN_AND_UP')
result = device.takeSnapshot() result.writeToFile('C:\cankao\shot1.png','png') |
第二个版本:绝对定位操作
优点:速度快
缺点:跟屏幕分辨率有关,分辨率不同代码不同,需要等比适配
#主进程进入youni发送短信,绝对定位版本(480X800) from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice from com.android.monkeyrunner.easy import EasyMonkeyDevice from com.android.monkeyrunner.easy import By
package = 'com.snda.youni' activity = 'com.snda.youni.YouNi' runComponent = package + '/' + activity
device = MonkeyRunner.waitForConnection() device.startActivity(component=runComponent) MonkeyRunner.sleep(3.0)
device.touch(160,759,'DOWN_AND_UP') MonkeyRunner.sleep(2.0)
device.touch(240,700,'DOWN_AND_UP') device.type('sms content') MonkeyRunner.sleep(1.0) device.touch(211,150,'DOWN_AND_UP') device.type('13316612345') MonkeyRunner.sleep(1) device.press('KEYCODE_BACK', 'DOWN_AND_UP') MonkeyRunner.sleep(1.0) device.touch(450,700,'DOWN_AND_UP') MonkeyRunner.sleep(1.0) device.press('KEYCODE_BACK', 'DOWN_AND_UP') MonkeyRunner.sleep(1) device.press('KEYCODE_BACK', 'DOWN_AND_UP')
result = device.takeSnapshot() result.writeToFile('C:\cankao\shot1.png','png') |
好了,就这么多了,代码很简单,没啥好讲的,怎么运行?这都要问?好吧,打开android\tools\monkeyrunner.bat,进入jython的命令解释器,直接把你的代码一行行贴进去敲回车,或者保存上面的代码,扩展名可以用py,直接执行这个py文件就可以了。
GOD BLESS U!