1:在Python自動化測試過程中,進行登陸的時候,一般都是要進行驗證的校驗的,自己也在百度一下,現在有2種方法:
1)找開發去掉驗證碼或者使用萬能驗證碼
2)使用OCR自動識別(識別率不是很高,但簡單的驗證還是可以的)
2:使用OCR自動識別的思路是:(參考博客 http://www.cnblogs.com/landhu/p/4968577.html )
先將截取含有驗證碼的圖片>>>>定位到驗證碼的坐標>>>>然后從坐標從截圖中通過pytesseract進行截取驗證碼
#導入os庫
import os
#用於改變當前工作目錄到指定的路徑
os.chdir('D:\Software\Python27\lib\site-packages\pytesseract')
#導入PIL 庫做圖像處理
from PIL import Image
#導入pytesseract庫,pytesseract是用於驗證碼、字符識別(依賴環境是PIL和tesseract-ocr)
import pytesseract
#re 模塊使 Python 語言擁有全部的正則表達式功能
import re
#導入webdriver模塊
from selenium import webdriver
#導入等待時間模塊
from time import sleep
#打開瀏覽器
driver = webdriver.Firefox()
#獲取要登錄的網址
driver.get("http://172.16.199.236:6600/bms/login.html")
#將頁面窗口最大化
driver.maximize_window()
#等待5秒
sleep(5)
#截取當前網頁,該網頁有我們需要的驗證碼
driver.save_screenshot('d://aa.png')
# 定位驗證碼
imgelement = driver.find_element_by_xpath('//*[@id=\'codeValidateImg\']')
# 獲取驗證碼x,y軸坐標
location = imgelement.location
# 獲取驗證碼的長寬
size = imgelement.size
# 需要截取的位置坐標
rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
# 打開截圖
i = Image.open("d://aa.png")
# 使用Image的crop函數,從截圖中再次截取我們需要的區域
bb = i.crop(rangle)
bb.save("d://bb.jpg","JPEG")
#打開截圖
cc = Image.open('d://bb.jpg')
#使用image_to_string識別驗證碼
text = pytesseract.image_to_string(cc).strip()
#輸出從截圖獲取到的字符串
print text
#用戶Python的正則表達式將文本的驗證中進行純數字的提取
text1 = re.sub("\D","",text)
print text1
遇到問題:
1:保存有驗證碼區域的圖片時報錯:
解決方案:我這里出現這個問題的原因是:我用pillow來代替PIL,產生的錯誤,重新從網上下載win7的64位的PIL進行安裝,再次運行,解決(網上說這2兄弟沒啥區別,但是為啥會出現這情況,我也還沒搞明白)。
PIL下載地址參考博客:https://www.waitalone.cn/python-php-ocr.html
2:解決了上個問題1,之后又提示下圖的錯誤:
解決方案:改變當前工作目錄到指定的路徑,參考博客:http://www.jianshu.com/p/122f42624776
import os
os.chdir('D:\Software\Python27\lib\site-packages\pytesseract') #路徑:pytesseract的路徑
3:image_to_string識別驗證碼有誤,錯誤提示如下圖,
解決方案:下載圖像識別類庫tesseract-ocr工具進行安裝,傻瓜式安裝即可,安裝好之后,還要將pytesseract.py代碼中修改tesseract_cmd的路徑,然后重新運行即可成功
#tesseract_cmd = 'tesseract'
tesseract_cmd = 'D:\Software\Tesseract-OCR/tesseract.exe'
4:運行以上的代碼,可以將簡單的驗證提取出來,但是有時候會有小數點,通過re.sub()函數正則表達式進行過濾,參考博客:http://www.cnblogs.com/yyyg/p/5498803.html
import re
text1 = re.sub("\D","",text)
print text1