WebDriver中自動識別驗證碼--Python實現


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


免責聲明!

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



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