Python&selenium&tesseract自動化測試隨機碼、驗證碼(Captcha)的OCR識別解決方案參考


        在自動化測試或者安全滲透測試中,Captcha驗證碼的問題經常困擾我們,還好現在OCR和AI逐漸發展起來,在這塊解決上越來越支撐到位。

我推薦的幾種方式,一種是對於簡單的驗證碼,用開源的一些OCR圖片處理包即可,對於復雜的識別率要求非常高的,可以考慮百度等公司的OCR有償服務(當然注冊后好像每天可以免費試用上百次,普通測試夠用了)。

 

本人環境: win10,python3.x, pip( python3安裝版會自帶), pycharm, tesseract-ocr-setup-3.02.02.exe,

                  pytesser3 ,pytesseract ,selenium(chrome瀏覽器以及匹配版本的瀏覽器驅動geckodriver.exe),pillow 5.3,pillow-PIL 0.1 

 

注意事項: 

A.務必單獨下載安裝tesseract-ocr-setup-3.02.02.exe(會自動配置好PATH環境變量),安裝好后可以運行DOS命令執行

tesseract  G:\temp\captcha\image_code.png  g:\temp\abc_123  digits_numbers

tesseract 要識別的圖片  識別出來后字符的保存文件,默認為.txt ,  tesseract安裝后Tesseract-OCR\tessdata\configs\路徑有個digits文件,可以定義識別白名單,比如只識別數字等,使用后可以提高識別率,可以在原來文件直接改,我這里是復制后修改並且重新命名為digits_numbers,如果不使用白名單命令行可以不加digits_numbers

 

B.在pytesser3目錄下的__init__.py文件里,要修改好以下這行,主要是配置好tesseract.exe的安裝路徑,注意.exe不需要寫

#請務必修改下面的tesseract的name 換成你安裝的ocr路徑,謝謝!
tesseract_exe_name = 'D:\\programs\\Tesseract-OCR\\tesseract' # Name of
#tesseract_exe_name = 'c:\\Program Files (x86)\\Tesseract-OCR\\tesseract'

 

以下是pycharm下的工程包和OCR核心源碼,至於后續識別后如何登陸就是普通的接口測試或者selenium等UI自動化范疇了,此處省略一萬字。如果連UI自動化都不精,不建議直接做這個,趕快回家看書去。

 

 

from selenium import webdriver
import pytesser3
import os
import sys, time
from PIL import Image, ImageEnhance

url = "http://登陸的URL"

driver = webdriver.Chrome()

time.sleep(2)

driver.get(url)

time.sleep(5)

try:
account = driver.find_element_by_id('_account')
password = driver.find_element_by_id('_password')
region = driver.find_element_by_id('_regionId')
captcha = driver.find_element_by_id('_captcha')
except:
print("查找元素出現異常")

# 網頁截圖 + 驗證碼截圖
try:
driver.get_screenshot_as_file('G:\\temp\\page\\loginPage1.png') # 比較好理解
im = Image.open('G:\\temp\\page\\loginPage1.png')
box = (884, 684, 1024, 734) # 設置要裁剪的區域,這個坐標是驗證碼圖片這個長方形的左上角坐標和右下角坐標,不懂可以問UI美工,用圖形編輯工具很容易獲得
region = im.crop(box) # 此時,region是一個新的圖像對象。
region.save("G:\\temp\\captcha\\image_code.png")
except:
print("網頁截圖 + 驗證碼截圖出現異常")

driver.close()
# --------------------圖片增強+自動識別簡單驗證碼-----------------------------
# 防止圖片還沒保存好,就開始識別
time.sleep(3)
im = Image.open("G:\\temp\\captcha\\image_code.png")
imgry = im.convert('L') # 圖像加強,二值化
sharpness = ImageEnhance.Contrast(imgry) # 對比度增強
sharp_img = sharpness.enhance(2.0)
sharp_img.save("G:\\temp\\captcha\\image_code.png")


time.sleep(2)

def image_file_to_string(file):
cwd = os.getcwd()
try:
os.chdir("D:\\programs\\Tesseract-OCR")
return pytesser3.image_file_to_string(file)
finally:
os.chdir(cwd)

# code即為識別出的圖片數字str類型
code = image_file_to_string("G:\\temp\\captcha\\image_code.png")
time.sleep(1)
print(code)

后續省略一萬字,自己用次code去完成接下來的自動化登陸即可....
有些復雜點的圖片驗證碼識別率不高,是的,一開始我就說了,







改進參考: 

1. 真正應用的時候可以考慮把打開瀏覽器,截圖等事情換個實現方式,使用內核瀏覽器操作,而非真正打開可見的瀏覽器,這樣更快。

2. OCR識別部分還需要用你要實現產品的驗證碼樣本進行tesseract的進一步學習訓練,或者換用商用OCR工具,識別率更高




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM