?
UI自動化測試時,需要對驗證碼進行識別處理,有很多方式,每種方式都有自己的特點,以下是一些常用處理方法,僅供參考。
1 去掉驗證碼
- 從自動化的本質上來講,主要是提升測試效率等,但是為了去研究驗證碼以及提升驗證碼的識別效率,是需要投入比較大的時間的;
- 去掉驗證碼無疑是最簡單的方式,而且對于開發而言這樣做,工作量也不是很大;
- 但是建議在測試環境使用,生產環境禁用,因為存在安全問題。
2 設置萬能碼
- 這個是筆者剛開始做自動化時首選的一個處理方法;
- 因為既測試到了驗證碼的功能,而且也不用投入太大的精力去研究如何進行驗證碼識別;
- 另外對于開發來說,內置一個萬能驗證碼也是非常簡單的事情;
- 對于寫自動化腳本的人來說也是非常的方便,效率也高;
- 但這個萬能驗證碼僅限相關人員知道,避免存在安全隱患。
3 保留一個資源
- 有點驗證碼實則就是圖片資源;
- 其實就是在制定的文件夾資源庫中隨機抽取一張,那么只需要將服務器上的所有圖片刪除,僅保留一張即可;
- 說白了就相當于固定驗證碼。
4 光學字符識別
- 其實就是通過
Python-tesseract
模塊來只能識別圖片中的驗證碼; Python-tesseract
是光學字符識別Tesseract OCR
的python
封裝類;- 其能夠讀取大部分常規圖片文件,比如
JPG、GIF、PNG、TIFF
等; - 這個筆者也嘗試過,因為現在的圖片驗證碼越來越復雜,其實有時候識別率并不高;
- 下邊我們嘗試著使用一下。
4.1 識別對象
- 我們收集了幾個圖片驗證碼(來源于網絡,僅供參考):從左到右依次是
image01.jpg-image04.jpg
:
現在我也找了很多測試的朋友,做了一個分享技術的交流群,共享了很多我們收集的技術文檔和視頻教程。
如果你不想再體驗自學時找不到資源,沒人解答問題,堅持幾天便放棄的感受
可以加入我們一起交流。而且還有很多在自動化,性能,安全,測試開發等等方面有一定建樹的技術大牛
分享他們的經驗,還會分享很多直播講座和技術沙龍
可以免費學習!劃重點!開源的!!!
qq群號:110685036【暗號:csdn999】
4.2 pytesseract安裝
- 直接使用命令安裝即可:
pip install Pillow
4.3 Pillow安裝
- 直接使用命令:
pip install Pillow
4.4 OCR安裝
- 直接在下載即可:OCR官網;
- 選擇對應的版本下載即可:
- 按照提示安裝完成:
- 配置環境變量,將其根目錄添加到
path
環境變量中:
4.5 識別原理
- 基本思路是通過圖片降噪、圖片切割等,輸出圖像文本;
- 圖片降噪就是將圖片中一些不需要的信息去除,比如背景、干擾像素、干擾線等。
- 如果驗證碼是彩色的背景,其實就是把每個像素放在五維空間,即
X、Y、R、G、B
; X、Y
是像素的二維平面坐標,RGB
代表像素所對應的顏色。
4.6 處理過程
4.6.1 轉灰度處理
- 導入需要的包:
from PIL import Image
- 打開需要分析的圖像:
image = Image.open("./image01.jpg")
- 將彩色圖像轉化為灰度圖像(
RGB
轉為HSI
色彩空間),采用L
分量:
# 彩色轉灰度
img_01 = image.convert("L")
img_01.show()
- 以上完整代碼為(使用
image01.jpg
):
# 導入Image包
from PIL import Image# 打開圖像
image = Image.open("./image01.jpg")
# 彩色轉灰度
img_01 = image.convert("L")
img_01.show()
- 轉灰度后圖像如下:
4.6.2 二值化處理
- 圖像分割常用的方法就是二值化處理;
- 二值化處理就是二值化圖像時,將大于某個臨界灰度值的像素灰度設置為灰度的極大值,把小于這個值的像素灰度設為灰度的極小值,取值范圍一般為
0-1
; - 二值化算法不同,可分固定閾值和自適應閾值,比如這個固定閾值如下(使用
image02.jpg
):
# 導入Image包
from PIL import Image# 打開圖像
image = Image.open("./image02.jpg")
# 二值化處理
img_02 = image.point(lambda x:0 if x<143 else 255)
img_02.show()
- 二值化后的效果:
- 我們結合前兩種方法,把
image03.jpg
先灰度再二值化處理后輸出對應的文字:
# 導入Image包
from PIL import Image
from pytesseract import pytesseract# 打開圖像
image = Image.open("./image03.jpg")# 灰度處理
img_new = image.convert("L")
# 二值化處理
img_03 = img_new.point(lambda x:0 if x<143 else 255)
img_03.show()
out_img = pytesseract.image_to_string(img_03)
print(out_img)
image03.jpg
原圖和處理后效果:
- 結果輸出:
4.6.3 圖像增強
- 為了排除更多的干擾,我們可以使用將圖片增強顯示,或者將圖片轉成黑白;
- 我們在以上代碼繼續添加:
from PIL import ImageEnhanceimg_enh = ImageEnhance.Contrast(img_03)
img_enh01 = img_enh.enhance(4)
img_enh01 .show()out_img = pytesseract.image_to_string(img_enh01)
4.6.4 完整代碼
- 我們使用
image04.jpg
輸出完整代碼:
# 導入Image包
from PIL import Image
from pytesseract import pytesseract
from PIL import ImageEnhance# 打開圖像
image = Image.open("./image04.jpg")# 灰度處理
img_new = image.convert("L")# 二值化處理
img_04 = img_new.point(lambda x:0 if x<143 else 255)# 圖像增強
img_enh = ImageEnhance.Contrast(img_04)
img_enh01 = img_enh.enhance(4)# 處理后圖片
img_enh01.show()# 提取圖片文字
out_img = pytesseract.image_to_string(img_enh01)
print(out_img)
- 處理前后的效果:
5 打碼平臺
- 另外我們可以通過打碼平臺來實現圖片文字提取,比如超人、圖鑒、斐斐等等;
- 比如圖鑒平臺,可以參考它的開發文檔;
6 記錄cookie
- 通過添加登錄成功時所攜帶的
cookie
來跳過登錄; - 在
selenium
中使用add_cookie()
方法將用戶名和密碼等登錄信息寫入瀏覽器的cookie
中,再次登錄時直接讀取瀏覽器cookie
即可。 - 此處代碼省略后續添加。
END今天的分享就到此結束了!點贊關注不迷路~