使用 ATX 判斷單選框選中狀態、開關狀態、圖示型別
測試新人記錄一下嘗試解決單選框選中狀態、開關狀態、圖示型別判斷的經歷
需求
使用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模式,其為灰度圖,其每個畫素用8個bit表示
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的介面,目前能做的也只有功能自動化測試,本來是由平臺部經理負責自動化團隊(經驗豐富,測試、開發都比較熟悉),因為平臺最近專案比較多,所以這件事情落到了我的頭上,之前平臺做了一些基礎功能,後來接手過來之後重寫了測試平臺,優化已有的測試框架,內部培養功能測試向自動化測試轉型。期間遇到各種困難,包括框架的限制,測試工具的限制,自動化測試團隊管理的問題,現在也在一一解決,也在向著積極的方向發展。遇到困難並不可怕,可怕的是不敢去面對困難。
相關文章
- 判斷Nginx存活狀態Nginx
- jstack判斷執行緒狀態JS執行緒
- android判斷狀態列是否可見Android
- 05@多用列舉表示狀態、選項、狀態碼
- React 4 種狀態型別及 N 種狀態管理React型別
- layui前端選單構建-批量刪除-彈框填寫-樹狀選單-樹狀下拉框選擇treeSelectUI前端
- JS在瀏覽器中判斷當前網路狀態JS瀏覽器
- Java的型別化狀態機Java型別
- ant design模態框中使用Select元件下拉選框不顯示元件
- UML狀態圖
- 被各種巢狀判斷噁心的你,想到狀態模式了嗎?巢狀模式
- BGP報文結構&型別、狀態型別
- Rusty型別狀態Typestates入門 - rustypeRust型別
- 《Effective Objective-C 2.0》- 5:用列舉來表示狀態、選項、狀態碼Object
- 選擇適合的型別判斷方式型別
- Vuex 單狀態庫 與 多模組狀態庫Vue
- 透過bat檔案批次判斷url地址的狀態BAT
- 直播系統搭建,判斷螢幕橫豎屏狀態
- 獲取ChoiceGroup多選狀態下的值
- 狀態列相關
- elementui 如果變數為1 顯示 開啟,2顯示關閉。表格怎麼根據狀態碼顯示狀態值UI變數
- 一個小技巧助您減少if語句的狀態判斷
- element ui switch開關 點選按鈕後,彈窗確認再改變開關狀態UI
- vue-cli 預設路由再子路由選中下的選中狀態問題Vue路由
- H5 記錄當前頁面的選中狀態,sessionStorageH5Session
- 【react】實現動態表單中巢狀動態表單React巢狀
- 帶有多選和突出顯示關鍵字的自定義下拉選擇框(靜態)
- keycloak~對接login-status-iframe頁面判斷使用者狀態變更
- js基礎–如何判斷瀏覽器標籤頁是隱藏或者顯示狀態JS瀏覽器
- 前端狀態管理與有限狀態機前端
- Flutter學習(8)——CheckBox多選框使用及動態更改多選框資料Flutter
- 死鎖避免中的安全狀態和不安全狀態
- 使用帶型別判斷的比較判斷型別
- [擴充套件] hieu-le active 判斷導航元素的 active 狀態套件
- 狀態列Theme相關配置
- iOS狀態列相關操作iOS
- React 狀態管理:狀態與生命週期React
- oracle RAC 診斷叢集狀態命令Oracle