? ? ? ?Airtest是一款?基于圖像識別原理?的跨平臺UI自動化測試框架,它能夠根據(jù)大量的?特征點?來識別一個截圖在當前畫面中的位置,但是它并不能識別出截圖中具體包含了什么文字。?
? ? ? ?而在自動化測試的過程中,我們會經(jīng)常遇到需要進行文字識別的場景,比如?識別驗證碼?、?識別截圖中的文字?、?讀取截圖中的數(shù)值?等等,遇到這些情況時我們可以如何處理呢?
今天教大家用一款免費的開源圖像OCR文字識別軟件 --?Tesseract-OCR?來處理上述情況。
1.安裝Tesseract-OCR.exe
? ? ? ?在網(wǎng)上搜索“Tesseract”,我們可以找到很多Tesseract-OCR的下載鏈接和安裝教程,大家可以選擇其中一個版本下載到本地即可。
? ? ? 下載完成后雙擊進入安裝,需要特別注意的是,在選擇安裝的組件時,我們需要把?Additional language data(download)?這一選項勾上,目的是?安裝各個版本的語言包?,后續(xù)我們就不用手動下載語言包來安裝了。

? ? ? 還有一點要注意的是,記住我們選擇的軟件安裝路徑,因為我們需要把這個路徑添加到?系統(tǒng)環(huán)境變量?的?path?中:

? ? 另外一個要新增的環(huán)境變量是?TESSDATA_PREFIX?,如下圖所示,未設(shè)置在識別過程中會報?Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory?的錯誤:

? ? ? 完成以上工作后,我們可以在命令行用?tesseract -v?驗證環(huán)境是否配置成功:

2.在本地python環(huán)境中安裝pytesseract
? ? 因為我們最終要在python環(huán)境中使用?airtest?和?tesseract?,所以需要在本地的python環(huán)境中安裝上?airtest?庫和?pytesseract?庫:
pipinstallairtestpipinstallpytesseract復(fù)制代碼
安裝完畢后可以在命令行輸入?pip list?檢查安裝結(jié)果:

3.用airtest截圖并識別截圖文字
打開我們的AirtestIDE,在?選項--設(shè)置--自定義python.exe路徑?中設(shè)置我們剛才安裝好對應(yīng)庫的python環(huán)境:

以之前官網(wǎng)提供的?poco?demo的界面為例,我們用?airtest?把紅框部分的截圖截取下來,然后再利用?tesseract?把截圖中的文字識別并打印出來:

具體實現(xiàn)如下:
# -*- encoding=utf8 -*-__author__ ="AirtestProject"fromairtest.core.apiimport*fromairtest.aircvimport*auto_setup(__file__)fromPILimportImageimportpytesseract# 局部截圖screen = G.DEVICE.snapshot()local = aircv.crop_image(screen,(132,58,380,126))# 保存局部截圖到指定文件夾中pil_image = cv2_2_pil(local)pil_image.save("D:/test/score0.png", quality=99, optimize=True)# 讀取截圖并識別截圖中的文字image = Image.open(r'D:/test/score0.png')? ? text = pytesseract.image_to_string(image)print("-----------初始數(shù)據(jù)為--------------")print(text)
識別結(jié)果如下:

知識點:
①?G.DEVICE.snapshot()?,對當前設(shè)備畫面進行截圖并保存在內(nèi)存中。
②?crop_image()?,局部截圖的方法,需要傳入倆個參數(shù),一個是內(nèi)存中的截圖,就像這里的?screen?,另一個是截取偏移?[x_min, y_min, x_max ,y_max]?。
③?Image.open()?,用來直接讀取給定路徑指向的圖片
④?image_to_string()?,用來解析圖片中的文字
4.識別驗證碼
以下述驗證碼截圖為例,該截圖的保存路徑為?D:/test/7364.jpg?:

別方式和結(jié)果如下:
# 識別驗證碼image2 = Image.open(r'D:/test/7364.jpg')? ? text2 = pytesseract.image_to_string(image2)print("-----------驗證碼為--------------")print(text2)log("驗證碼為:"+text2)

5.識別中文文字
識別中文的方法和識別數(shù)字與英文基本一致,但比較特別的是,我們需要在?image_to_string()?方法中指定中文的語言參數(shù)(示例代碼中指定了簡體中文來識別截圖):

# 識別中文image3 = Image.open(r'D:/test/3.png') text3 = pytesseract.image_to_string(image3,lang='chi_sim')print("-----------識別出來的文字為:--------------")print(text3)log("識別出來的文字為:"+text3)
