1、在使用uiautomator進行自動化測試過程當中,執行某些動作之后,要進行判斷是否已執行的動作成功時,需要添加檢查點來判斷,因此添加判斷點除了使用id、text、view等方式進行之外,存在一種問題是界面無任何的可判定元素來判斷當前的測試動作是否成功時,就需要用到截圖對比;
2、以下是簡單的截圖對比與自動化執行相結合使用的小例子,在真正的測試執行過程中,可將截圖方法進行封裝,在使用時調用即可;
# -*- coding: utf-8 -*- from uiautomator import Device import time import os import cv2 import numpy as np class Test: def __init__(self,deviceid): self.device=Device(deviceid) self.deviceid=deviceid def click(self,x,y): self.device.click(x,y) def startActivity(self,activity): os.system('adb -s %s shell am start %s' %(self.deviceid,activity)) #平均hash算法計算 def classify_aHash(self,image1,image2): image1 = cv2.resize(image1,(8,8)) image2 = cv2.resize(image2,(8,8)) gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) hash1 = self.getHash(gray1) hash2 = self.getHash(gray2) return self.Hamming_distance(hash1,hash2) #輸入灰度值,返回hash def getHash(self,image): avreage = np.mean(image) hash = [] for i in range(image.shape[0]): for j in range(image.shape[1]): if image[i,j] > avreage: hash.append(1) else: hash.append(0) return hash # 計算漢明距離 def Hamming_distance(self,hash1,hash2): num = 0 for index in range(len(hash1)): if hash1[index] != hash2[index]: num += 1 return num #使用adb命令截取手機頁面圖片 def screenshot(self): time.sleep(8) #os.system("adb shell /system/bin/screencap -p /sdcard/p2.png") #(保存到SDCard) #os.system("adb pull /sdcard/p2.png E:\Study\uiautomator\picture") #(保存到電腦)
self.device.screenshot("E:\\Study\\uiautomator\\picture\\p2.png") if __name__ == "__main__": w=Test('0123456789ABCDEF') #記錄手機串號,查看方式adb devices w.startActivity('com.android.mms/.ui.ConversationList') w.screenshot() img1 = cv2.imread("E:\\Study\\uiautomator\\picture\\p1.png") #讀取保存的圖片,原始圖片 img2 = cv2.imread("E:\\Study\\uiautomator\\picture\\p2.png") #讀取與原始圖相同使用screenshot方法截取的頁面圖片 cv2.imshow("img1",img1) #展示圖片1 cv2.imshow("img2",img2) #展示圖片2 degree = w.classify_aHash(img1,img2) #調用方法,對比兩張圖片是否相同,返回值0為相同,返回1為不同,值越小,返回值越小,相似度越高 print degree cv2.waitKey(0)
