airtest是網易開發的一款基於圖象識別的ui自動化框架,其對元素操作的流程是先對元素進行截圖,再和客戶端當前界面截圖進行對比,找出位置,執行點擊操作。
這樣的操作免除了傳統的查找控件的繁雜,但是對元素的斷言卻不夠精細,尤其在不僅僅判斷元素是否存在,而且還要對文本的內容進行檢查時,可以說無能爲力了。
想要解決這個問題,可以使用迴歸傳統的元素查找方式(airtest內置了各端通過元素查找方式的api),查找到元素,再判斷他的文本屬性,得到內容;但這樣的方式第一需要在元素的映射方式上增加傳統的例如xpath的關係,第二很多時候由於不規範開發等原因,元素的定位屬性往往不容易確定,花費時間查找其實已經丟失了圖像識別控件的便利性。
在實際的操作中(我的項目是pc端+安卓端雙端互動的場景),我發現可以利用airtest本身的api,外加ocr的python庫,做到對元素內容的識別,從而解決這個問題。
大概的思路是,先用airtest本身的api,將待識別內容截圖扣下來,然後利用ocr的庫進行對其內容識別。
理論上,如果你的設備分辨率不會變更,那麼其實不需要用到airtest的api,直接用固定的位置,通過opencv等圖像處理的庫進行摳圖保存即可,但由於生產設備的分辨率不能保證,因此,需要一個相對的位置,對這個位置,airtest裏有直接可用的方法,這個方法也是其本身對分辨率兼容的辦法。
airtest通過你截圖時記錄的座標,設備分辨率,來生成一個recordpos,這個pos其實就是一個用來計算當分辨率不同時他的座標偏移量。
具體怎麼通過recordpos進行計算座標,這裏就不贅述了,主要說一下通過recordpos進行元素查找的方法,這個方法是get_predict_area,有四個參數,分別是record_pos(截取控件圖片時的偏移量)、image_wh(空間的寬高)、image_resolution(截取圖片時記錄的設備分辨率)、screen_resolution(查找控件時所在設備的實際分辨率)。
該方法會返回一個四角座標,我們把這個四角座標用內置的圖片處理方法,在設備及圖上進行截圖保存,就可以獲取到待識別控件的圖片啦,然後再用ocr庫對這個圖片進行識別,就可以得到控件的文本內容了。
示例代碼如下(只適用於本人的硬件設備,用作參考):
dev = device()
stu_answer_num = r'./valid_pic/stu_answer_num.png' # 答題區域的截圖路徑
interact_pic_path = r'./valid_pic/snap_interact.png' # 互動界面的截圖路徑
interact_image = dev.snapshot(interact_pic_path) # 把互動界面截圖保存
from PIL import Image
import pytesseract
from airtest import aircv
from airtest.core.cv import Predictor
screen_resolution = aircv.get_resolution(interact_image) # 獲取互動界面截圖的實際分辨率
# 動態創建類繼承自Predictor,修改類參數,偏移值DEVIATION爲0,用以獲取精準的截圖區域
predictor = type('Pos', (Predictor,), {'DEVIATION': 0})
xmin, ymin, xmax, ymax = predictor.get_predict_area(record_pos=(0.404, -0.213), image_wh=(265, 45),
image_resolution=(1919, 1040),
screen_resolution=screen_resolution) # 獲取答題區域的截圖座標
predict_area = aircv.crop_image(interact_image, (xmin, ymin, xmax, ymax))
aircv.imwrite(stu_answer_num, predict_area) # 將待識別區域進行截圖保存
answer_str = pytesseract.image_to_string(Image.open(stu_answer_num), 'chi_sim') # 識別出的文字類似’全 班 共 參 與 : 1/1‘
print(answer_str)
if answer_str.find('參 與'):
answer_str = answer_str.split(' ')[-1] # 取1/1
answer_num = int(answer_str.split('/')[0]) # 取答題人數
return answer_num
return
(喜歡請轉發,謝謝!)
加入愛測未來qq羣,獲取更專業的技術知識分享:
274166295 (愛測未來二羣)
610934609 (愛測未來三羣)
195730410 (愛測未來四羣)
更多精彩文章:
——————————————————
愛測未來公衆號
WX:itest_forever
測試之道 | 測試技術
長按識別二維碼,關注愛測未來公衆號,瞭解更多精彩內容