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')