今天尝试用monkeyrunner脚本在夜神模拟器上安装并截图QQ,但是遇到了一些问题:

1 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
2
3
4 #连接模拟器
5 device = MonkeyRunner.waitForConnection()
6
7 #打开锁屏
8 device.drag((355,1061),(621,1061),3,1)
9
10 #安装QQ
11 device.installPackage("F:\\QQ_730.apk")
12 MonkeyRunner.sleep(8)
13
14 #启动QQ
15 device.startActivity(component="com.tencent.mobileqq/.activity.LoginActivity")
16 MonkeyRunner.sleep(5)
17
18 #点击登录
19 device.touch(180,1170,"DOWN_AND_UP")
20 MonkeyRunner.sleep(3)
21
22 #保存截图
23 result = device.takeSnapshot()
24 result.writeToFile("qq.png","png")

无奈刚开始就报错了。

解决:SyntaxError: Non-ASCII character in file_java

"SyntaxError: Non-ASCII character in file 'C:\Users\Administrator\qq.py'

这是一个语法错误,原因可能是我们脚本的注释用的是中文。我们可以在脚本开始加上#-*-coding:utf-8-*-

1 #-*-coding:utf-8-*-
2
3 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
4
5
6 #连接模拟器
7 device = MonkeyRunner.waitForConnection()
8
9 #打开锁屏
10 device.drag((355,1061),(621,1061),3,1)
11
12 #安装QQ
13 device.installPackage("F:\\QQ_730.apk")
14 MonkeyRunner.sleep(8)
15
16 #启动QQ
17 device.startActivity(component="com.tencent.mobileqq/.activity.LoginActivity")
18 MonkeyRunner.sleep(5)
19
20 #点击登录
21 device.touch(180,1170,"DOWN_AND_UP")
22 MonkeyRunner.sleep(3)
23
24 #保存截图
25 result = device.takeSnapshot()
26 result.writeToFile("qq.png","png")

可是,又报错了:

解决:SyntaxError: Non-ASCII character in file_android_02

再次尝试:

1 import sys
2 reload(sys)
3 sys.setdefaultencoding("utf-8")
4
5 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
6
7
8 #连接模拟器
9 device = MonkeyRunner.waitForConnection()
10
11 #打开锁屏
12 device.drag((355,1061),(621,1061),3,1)
13
14 #安装QQ
15 device.installPackage("F:\\QQ_730.apk")
16 MonkeyRunner.sleep(8)
17
18 #启动QQ
19 device.startActivity(component="com.tencent.mobileqq/.activity.LoginActivity")
20 MonkeyRunner.sleep(5)
21
22 #点击登录
23 device.touch(180,1170,"DOWN_AND_UP")
24 MonkeyRunner.sleep(3)
25
26 #保存图片
27 result = device.takeSnapshot()
28 result.writeToFile("qq.png","png")

值得注意的两点是:

1.  检查夜神模拟器有没有连上:adb devices

如果没有连上,用adb connect 127.0.0.1:62001连接,再用adb devices检查。(详见lynnLi的博客​​monkeyrunner之夜神模拟器的安装与使用(二)​​)

2.  一定要用好MonkeyRunner.sleep()

在实际的测试过程中,有的时候发现脚本业务逻辑是正确的,可是不知道为什么一旦执行起来结果却是错误的,那么有一种可能就是你的操作过快,导致界面元素没有完全展示出来就开始了后续操作,从而引起的问题。(引自《精通移动App测试实战:技术、工具和案例》,于涌 王磊 曹向志编著)

 

====================================9月26日更新======================================

不知是Eclipse出错概率多,还是我的python脚本问题,今天写了一段python脚本,在Elipse中运行也出现了相同的错误,解决的办法却不一样:

1 '''
2 Created on 2017-9-26
3
4 @author: Administrator
5 '''
6
7
8 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
9
10 #连接设备
11 device = MonkeyRunner.waitForConnection()
12 MonkeyRunner.sleep(5)
13
14 #启动QQ
15 device.startActivity(component="com.tencent.mobileqq/.activity.SplashActivity")
16 MonkeyRunner.sleep(5)
17
18 #点击动态
19 device.touch(596, 1112, "DOWN_AND_UP")
20 MonkeyRunner.sleep(3)
21
22 #点击好友动态
23 device.touch(119, 296, "DOWN_AND_UP")
24 MonkeyRunner.sleep(5)
25
26 #向下滑
27 device.drag((288, 189), (288, 947), 1, 10)
28 MonkeyRunner.sleep(3)
29
30 #向上滑
31 device.drag((288, 947), (288, 189), 1, 10)
32 MonkeyRunner.sleep(3)
33
34 #回到桌面
35 device.touch(414, 738, "DOWN-AND_UP")
36 MonkeyRunner.sleep(3)

出现报错:

170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] Script terminated due to an exception
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]SyntaxError: Non-ASCII character in file 'D:\Program\workspace\monkeyrunner_test01\test02.py', but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.Py.SyntaxError(Py.java:166)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.ParserFacade.fixParseError(ParserFacade.java:102)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.ParserFacade.parse(ParserFacade.java:184)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.Py.compile_flags(Py.java:1731)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.__builtin__.execfile_flags(__builtin__.java:514)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:225)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.ScriptRunner.run(ScriptRunner.java:116)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.MonkeyRunnerStarter.run(MonkeyRunnerStarter.java:77)
170926 23:53:26.465:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.MonkeyRunnerStarter.main(MonkeyRunnerStarter.java:189)

方法一:如果我加上

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

报错:

170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] Script terminated due to an exception
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]SyntaxError: Non-ASCII character in file 'D:\Program\workspace\monkeyrunner_test01\test02.py', but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.Py.SyntaxError(Py.java:166)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.ParserFacade.fixParseError(ParserFacade.java:102)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.ParserFacade.parse(ParserFacade.java:184)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.Py.compile_flags(Py.java:1731)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.__builtin__.execfile_flags(__builtin__.java:514)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:225)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.ScriptRunner.run(ScriptRunner.java:116)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.MonkeyRunnerStarter.run(MonkeyRunnerStarter.java:77)
170926 23:56:37.058:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.MonkeyRunnerStarter.main(MonkeyRunnerStarter.java:189)

方法二:如果我加上:

#-*-coding:utf-8-*-

依旧报错:

170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] Script terminated due to an exception
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]SyntaxError: ('Unknown encoding: utf-8-', ('D:\\Program\\workspace\\monkeyrunner_test01\\test02.py', 1, 0, ''))

170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.ParserFacade.prepBufReader(ParserFacade.java:336)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.ParserFacade.prepBufReader(ParserFacade.java:286)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.ParserFacade.parse(ParserFacade.java:181)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.Py.compile_flags(Py.java:1731)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.core.__builtin__.execfile_flags(__builtin__.java:514)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:225)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.ScriptRunner.run(ScriptRunner.java:116)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.MonkeyRunnerStarter.run(MonkeyRunnerStarter.java:77)
170926 23:58:09.631:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] at com.android.monkeyrunner.MonkeyRunnerStarter.main(MonkeyRunnerStarter.java:189)

方法三:如果我加上

#coding:utf-8

反而能够正常跑下去而不报错。其中原因,待我分析之后附上。