在airtest中使用ocr反向識別文本內容

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  (愛測未來四羣)

 

更多精彩文章:

移動端H5調試與自動化

Android兼容性測試應該怎麼做逼格更高呢?

JVM性能調優

MTP-移動測試平臺

性能分析之OS資源飽和度

前端性能監控

來自520的福利----視頻直播平臺性能測試

前端性能測試平臺及應用

震驚性能測試圈的經典案例!!

——————————————————

   愛測未來公衆號

     WX:itest_forever

  測試之道 | 測試技術

長按識別二維碼,關注愛測未來公衆號,瞭解更多精彩內容

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章