對於驗證碼這個問題,通常我們可以采取以下三個途徑來解決該問題:
1、第一種方法,在被測系統中暫時屏蔽驗證功能。
即臨時修改應用,無論用戶輸入的是什么驗證碼,都認為是正確的。
優點:這種方法最容易實現,對測試結果也不會有太大的影響(當然,這種方式去掉了“驗證驗證碼”這個環節,不過這個環節本來就很難成為系統性能瓶頸)。
缺點:但這種方法有一個致命的問題:如果被測系統是一個實際已上線的系統,屏蔽驗證功能會對已經在運行的業務造成非常大的安全性的風險,因此,對於已上線的系統來說,用這種方式就不合適了;
2、第二種方法,留一個后門,我們設定一個所謂的“萬能驗證碼”,只要用戶輸入這個“萬能驗證碼”,我們就驗證通過,否則,還是按照原先的驗證方式進行驗證。
這種方法在第一種方法的基礎上稍微進行一些改進。第一種方法帶來了很大的安全性問題,那么我們可以考慮,不取消驗證,但在其中這種方式仍然存在安全性的問題,但由於我們可以通過管理手段將“萬能驗證碼”控制在一個小的范圍內,而且只在性能測試期間保留這個小小的后門,相對第一種方法來說,在安全性方面已經有較大的改進了;
3、寫一個驗證碼獲取的DLL,在測試腳本中進行調用即可。
驗證碼也在不斷的進步。在獲取驗證碼的時候,我們需要根據驗證碼的難易程度進行。
識別驗證碼:需要使用到pillow,pytesseract、tesseract-ocr.
pillow
PIL (Python Image Library) 是 Python 平台處理圖片的標准庫,兼具強大的功能和簡潔的 API。但是目前PIL最新版本是1.1.7(PIL官方網站:http://www.pythonware.com/products/pil/)
該版本只支持python2.4、2.5、2.6、2.7。看了網上相關資料后,使用了Pillow。 Pillow 庫則是 PIL 的一個分支,維護和開發活躍,Pillow 兼容 PIL 的絕大多數語法,推薦使用。
Pillow的Github主頁:https://github.com/python-pillow/Pillow
Pillow的文檔(對應版本v3.0.0):https://pillow.readthedocs.org/en/latest/handbook/index.html
Pillow的文檔中文翻譯(對應版本v2.4.0):http://pillow-cn.readthedocs.org/en/latest/
Pillow的安裝:
方法一:在pycharm環境中直接安裝。

方法二:使用pip進行安裝:pip install Pillow
pytesseract
pytesseract安裝
方法一;
在pycharm環境中直接安裝。

方法二:pip install pytesseract
真實案例的使用
代碼如下:
from selenium import webdriver
import time
from PIL import Image
import pytesseract
driver=webdriver.Chrome()
driver.get("http://www.xxx.com/index.html#/user/login")
time.sleep(3)
driver.find_element_by_id('userName').send_keys("iotqy")#輸入登錄賬戶
driver.find_element_by_id("password").send_keys("123456")#輸入登錄密碼
driver.save_screenshot('e://hbgj_login.png')#截取當前網頁,該網頁有我們需要的驗證碼
yzm=driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/form/div[1]/span/span/span[2]/div') #定位驗證碼
location=yzm.location#獲取驗證碼x,y軸坐標
size=yzm.size#獲取驗證碼的長寬
rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))#截取的位置坐標
i=Image.open('e://hbgj_login.png') #打開截圖
frame4=i.crop(rangle)#使用Image的crop函數,從截圖中再次截取我們需要的區域
frame4.save("e://yzm.jpg")#將截取到的驗證碼保存為jpg圖片
qq=Image.open("e://yzm.jpg")#打開jpg驗證碼圖片
text=pytesseract.image_to_string(qq).strip()#使用image_to_string識別驗證碼
driver.find_element_by_name("code").send_keys(text)#將識別的圖片驗證碼信息輸入到驗證碼輸入文本框中
driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/form/div[3]/div/div/span/button').click()#點擊登錄按鈕
=====================================================================================================================================
出現的問題:
1、KeyError: 'RGBA'
OSError: cannot write mode RGBA as JPEG

解決辦法:將截取到的驗證碼由jpg格式改為png格式。
改動如下:

2、上訴改動后,出現新的錯誤
FileNotFoundError: [WinError 2] 系統找不到指定的文件。
pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path

解決辦法:安裝tesseract-ocr
OCR(Optical Character Recognition, 光學字符識別) 軟件
安裝包含兩個部分:ORC引擎本身以及對應語言的訓練數據
github地址: https://github.com/tesseract-ocr/tesseract
windows:
The latest installer can be downloaded here: tesseract-ocr-setup-3.05.01.exe and tesseract-ocr-setup-4.00.00dev.exe (experimental).
下載安裝包tesseract-ocr-setup-3.05.01.exe,安裝到默認路徑:C:\Program Files (x86)\Tesseract-OCR
安裝tesseract-ocr完成后:處理方式中任選一。
①處理方法一:把安裝路徑(C:\Program Files (x86)\Tesseract-OCR)添加到環境變量PATH中去
②處理方法二:修改pytesseract.py文件,指定tesseract.exe安裝路徑
tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe‘
③處理方法三:在實際運行代碼中指定
pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe'
OCR自動識別-識別驗證碼圖片,識別過程:截取登錄頁面->獲取驗證碼的位置坐標->打開截圖->從截圖中截取驗證碼的區域->使用pytesseract工具識別驗證碼

