使用 ATX 判斷單選框選中狀態、開關狀態、圖示型別

Mr.武發表於2020-12-21

測試新人記錄一下嘗試解決單選框選中狀態、開關狀態、圖示型別判斷的經歷

需求

使用ATX做自動化測試過程中遇到問題,該如何判斷單選框是否選中、開關狀態、圖示型別呢?

嘗試一

通過對比選中與未選中的單選框屬性,發現選中與未選中沒有屬性發生變化,通過屬性無法判斷

嘗試二

翻閱了ATX官方文件發現有個Image match,影像匹配功能,需要提供一張圖片,match會返回一個similarity值,在使用點選等事件
d.image.click(imdata, timeout=20.0)時,會輪詢查詢圖片,如果similarity>0.9則認為匹配成功,進行點選等操作。
嘗試過程中遇到問題:無論單選框是否選中similarity都大於0.9(可能是影像識別不夠精確所導致的問題?),所以認為此方法無法判斷

嘗試三

既然ATX的方法行不通,那我能不能自己寫一個方法呢?

百度查了一下有幾種圖片對比方法,雖然看不懂,但是可以拿來用:
值雜湊演算法
差值雜湊演算法
感知雜湊演算法
餘弦相似度

思路1:取一張預期圖片(即未選中單選框的圖片),使用ATX元素截圖方法擷取實際圖片,使用圖片對比方法把預期圖片和實際圖片進行對比,檢視對比結果值,如果該值大於某個特定值(經過多次圖片對比測試得出的一個值)則認為未選中,反之選中
嘗試1:經過測試發現找不到一個特定的值(使用雜湊演算法得到的兩個值可能對比結果正好是相反的,感覺不夠精確,不知道是不是方法不對),而且列表中兩個相同的單選框截出來的圖片是不一樣的,不知道為什麼,所以嘗試了第二個思路。

思路2:取兩張預期圖片(一張選中單選框的圖片,一張未選中單選框的圖片),使用ATX元素截圖方法擷取實際圖片,使用圖片對比方法分別將實際圖片和選中單選框圖片、未選中單選框圖片進行對比,分別得到兩個結果A、B,兩個結果進行對比,如果A>B則認為單選框為選中狀態,反之則為未選中狀態。

使用雜湊值得到返回值的是一個整數,存在兩個結果為相同值的情況(兩個對比結果可能都為14),所以最後使用餘弦距離進行對比,具體實現原理不清楚,但是可以得知餘弦距離越大,圖片相似度越高。
參考連結:https://blog.csdn.net/weixin_39121325/article/details/84187453

程式碼如下:

百度查到的通過計算餘弦距離來判斷兩張圖片的相似度

# 對圖片進行統一化處理
def get_thum(self, image, size=(64, 64), greyscale=False):
# 利用image對影像大小重新設定, Image.ANTIALIAS為高質量的
image = image.resize(size, Image.ANTIALIAS)
if greyscale:
# 將圖片轉換為L模式,其為灰度圖,其每個畫素用8bit表示
image = image.convert('L')
return image

# 計算圖片的餘弦距離
def image_similarity_vectors_via_numpy(self, image1, image2):
image1 = self.get_thum(image1)
image2 = self.get_thum(image2)
images = [image1, image2]
vectors = []
norms = []
for image in images:
vector = []
for pixel_tuple in image.getdata():
vector.append(average(pixel_tuple))
vectors.append(vector)
# linalg=linear(線性)+algebra(代數),norm則表示範數
# 求圖片的範數??
norms.append(linalg.norm(vector, 2))
a, b = vectors
a_norm, b_norm = norms
# dot返回的是點積,對二維陣列(矩陣)進行計算
res = dot(a / a_norm, b / b_norm)
return res
  • 判斷單選框是否選中,需要三張圖片,預期未選中圖片、預期選中圖片、實際截圖,如果預期未選中圖片和實際截圖對比結果>預期選中圖片和實際截圖對比結果,則認為未選中單選框返回False,反之則選中返回True,開關按鈕同理 選中單選框圖片 未選中單選框圖片
# 判斷是否選中
def judge_choose(self, no_choose, choose, practical):
'''
判斷是否選中單選框
:param no_choose:
:param choose:
:param practical:
:return: False:未選中,True:選中
'''
no_choose = Image.open(no_choose)
choose = Image.open(choose)
pr = Image.open(practical)
no_choose_con_result = self.image_similarity_vectors_via_numpy(no_choose, pr)
choose_con_result = self.image_similarity_vectors_via_numpy(choose, pr)
if no_choose_con_result > choose_con_result:
result = False
else:
result = True
return result
  • 判斷圖示型別和判斷單選框是一樣的,需要多張圖片對比,然後取出對比結果的最大值即可,單選框其實也可以這麼做,後面可以寫成一個通用的方法
# 判斷未接,已接,已撥,轉移,錄音的圖示狀態
def judge_choose_icon(self, missed, received, dialled, tansfer, icon):
'''
判斷未接,已接,已撥,轉移,錄音的圖示狀態
'''
missed = Image.open(missed)
received = Image.open(received)
dialled = Image.open(dialled)
tansfer = Image.open(tansfer)
icon = Image.open(icon)
missed_con_result = self.image_similarity_vectors_via_numpy(missed, icon)
received_con_result = self.image_similarity_vectors_via_numpy(received, icon)
dialled_con_result = self.image_similarity_vectors_via_numpy(dialled, icon)
tansfer_con_result = self.image_similarity_vectors_via_numpy(tansfer, icon)
dic = {"未接": missed_con_result, "已接": received_con_result, "已撥": dialled_con_result, "轉移": tansfer_con_result}
new_max_dic = sorted(dic.items(), key=operator.itemgetter(1), reverse=True)
max_dic=new_max_dic[0][0]
return max_dic

總結

我們測試近期由手工測試向自動化測試方面轉型,因為我們做的是智慧電話,大部分都是單機應用,很少有需要連網的,所以沒有那些http的介面,目前能做的也只有功能自動化測試,本來是由平臺部經理負責自動化團隊(經驗豐富,測試、開發都比較熟悉),因為平臺最近專案比較多,所以這件事情落到了我的頭上,之前平臺做了一些基礎功能,後來接手過來之後重寫了測試平臺,優化已有的測試框架,內部培養功能測試向自動化測試轉型。期間遇到各種困難,包括框架的限制,測試工具的限制,自動化測試團隊管理的問題,現在也在一一解決,也在向著積極的方向發展。遇到困難並不可怕,可怕的是不敢去面對困難。

相關文章