monkeyrunner的功能脚本编写完成之后,我们就需要对结果进行判断,判断结果是否为我们预期的结果值。下面我们主要讲述2种方式判断结果。
方式一、monkeyrunner截图对比
这是monkeyrunner非常有特色的一种方式,用于通过设备屏幕前后的对比来获取对执行结果的判断。使用.sameAs()对比截图,获得测试结果。
#连接设备 device = MonkeyRunner.waitForConnection() #当前页面截图 image = device.takeSnapshot() #去文件中找到我们要对比的正确的图片(这里比如存储在F盘,命名为result.png),与该截图image进行对比 result = MonkeyRunner.loadImageFromFile('F:\result.png') #判断图片相识度是否是90%(这个比值根据需求来定) if image.sameAs(result,0.9): print "图片对比成功" else: print "图片对比失败"
这种方式虽然比较常见,但是如果屏幕分辨率一旦改变,就使得对比结果无效,代码可移植性很低,不稳定。
下面推荐一种通过控件id或文字判断结果的方式。
方式二、monkeyrunner文字对比
1.EasyMonkeyDevice
这种文字对比方式,主要是利用EasyMonkeyDevice中的exists(By selector)和getText(By selector)两种方法来判断。关于EasyMonkeyDevice,后续有文章会专门介绍其所有的API。
核心代码如下(代码中的packageName和activity要换成自己需要的包名和活动名):
#coding:utf-8 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage #提供了根据ID进行访问 from com.android.monkeyrunner.easy import EasyMonkeyDevice #根据ID返回PyObject的方法 from com.android.monkeyrunner.easy import By #连接设备 device = MonkeyRunner.waitForConnection() #packageName、activity根据自己的需求获取,启动app componentName = packageName + '/' + activity device.startActivity(component = componentName) #必须在activity启动之后 easy_device = EasyMonkeyDevice(device) #判断结果页面中是否有特定控件ID:如果有,则获取该控件上的文本;若没有,则直接出对比结果 if easy_device.exists(By.id('id/btn_loginout')) == True: text = easy_device.getText(By.id('id/btn_loginout')) if text.encode('utf-8') == '注销': print "login success" else: print "login failed" else: print "login failed"
注:控件text需要具有唯一性。
2.HierarchyViewer
这个方法的API和EasyMonkeyDevice类似,主要用到findViewById和getText来判断。关于HierarchyViewer各API,后续有文章介绍。
由于方法和EasyMonkeyDevice类似,这里不再赘述。核心代码如下:
device=MonkeyRunner.waitForConnection() hierarchy_viewer = device.getHierarchyViewer() login_button = hierarchy_viewer.findViewById('id/btn_loginout') text = hierarchy_viewer.getText(login_button) print text.encode('utf-8')
最后,再补充一句,还可以根据EasyMonkeyDevice的getFocusedWindowId接口来获取当前页面的窗口ID,即activity,或者,根据HierarchyViewer的getFocusedWindowName来获取当前页面的packageName/activityName。从而方便monkeyrunner脚本中各页面的切换。
注:每个窗口的activity并不是唯一的,所以当activity相同时,需要activity的Fragment来判断当前页面。(判断方法后续讲述,主要用sdk/tools/uiautomatorviewer)
核心代码如下,欢迎拍砖:
#获取当前页面窗口ID
winId = easy_device.getFocusedWindowId() print winId.encode('utf-8')