對於web應用程序來說,處於安全性考慮,在登陸的時候,都會設置驗證碼,驗證碼的類型種類繁多,有圖片中辨別數字字母的,有點擊圖片中指定的文字的,也有算術計算結果的,再複雜一點就是滑動驗證的。諸如此類的驗證碼,對咱們的系統增長了安全性的保障,可是對於咱們測試人員來說,在自動化測試的過程當中,無疑是一個棘手的問題。html
通常在咱們測試過程當中,登陸遇到上述的驗證碼的時候,有如下種解決方案:python
前三種解決方案,想必你們都比較瞭解,本文重點闡述第四種解決方案,也就是驗證碼的自動識別,關於驗證碼識別這一塊,能夠經過兩個方案來解決,git
OCR中文名稱光學識別, tesseract是一個有名的開源OCR識別框架,它與Leptonica圖片處理庫結合,能夠讀取各類格式的圖像並將它們轉化成超過60種語言的文本,能夠不斷訓練本身的識別庫,使圖像轉換文本的能力不斷加強。若是團隊深度須要,還能夠以它爲模板,開發出符合自身需求的OCR引擎。那麼接下來給你們介紹一下如何使用tessract來識別咱們的驗證碼。github
1)、安裝tesseractweb
適用於Tesseract 3.05-02和Tesseract 4.00-beta的chrome
Windows安裝程序下載地址:https://github.com/UB-Mannheim/tesseract/wik。api
2)、加入培訓數據瀏覽器
tesseract 默認只能識別英文,若是您想要識別其餘語言,則須要下載相應的培訓數據安全
下載地址:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files,cookie
咱們只作中文,暫時下載一箇中文的文字訓練數據就能夠 ,而後將.traineddata文件複製到安裝以後的'tessdata'目錄中。C:\OCR\Tesseract-OCR\tessdata
3)、配置環境變量
要從任何位置訪問tesseract-OCR,您可能必須將tesseract-OCR二進制文件所在的目錄添加到Path變量中C:\OCR\Tesseract-OCR
。
pip install pytesseract
安裝好後。找一張驗證碼圖片,以下圖(命名爲test.jpg),放在當前python文件同級目錄下面,
使用 PIL中的Image中的open方法打開驗證碼圖片,調用pytesseract.image_to_string方法,能夠識別圖片中的文字,而且轉換成字符串,以下面代碼所示。
import pytesseract
from PIL import Image
pic = Image.open('test.jpg')
# pic 爲打開的圖片,lang指定識別轉換的語言庫
text = pytesseract.image_to_string(pic,lang='chi_sim')
print(text)
經過上述方法能識別簡單的驗證碼,可是存在必定的問題,識別的精度不高,對於一些複雜一點,有干擾線的驗證碼沒法正確識別出結果。
接下來給你們介紹一下第二種識別的方案,第三方的打碼平臺識別
第三方的打碼平臺相對於OCR來說,優點在於識別的精準度高,網絡上的第三方打碼平臺不少,百度隨便一搜就有幾十個,這個給你們列舉幾個,以下所示:
網絡上的第三方打碼平臺衆多,這裏小編選擇超級鷹這個第三方的平臺來給你們作演示。
咱們打開chaojiying.py這個文件後,會發現這個文件中給出了的接口很是簡單,以下所示
首先第一步建立一個用戶對象:三個參數(帳號,密碼,軟件ID),帳號密碼就是該網站的帳號密碼,那麼軟件ID呢?軟件ID咱們能夠在用戶中心找到軟件ID,而後進去點擊生成一個軟件ID(以下圖),
第二行代碼就是打開一個要識別的驗證碼圖片,並讀取內容,
第三行,調用PostPic方法識別驗證碼,兩個參數(驗證碼圖片內容,驗證碼類型),關於驗證碼類型,請參考該網站的價格體系(以下圖),根據驗證碼類型選擇對應的數值傳入。
PostPic返回的是一個字典類型的數據,識別的驗證碼在該字典中的pic_str這個鍵中
res = cjy.PostPic(im, 1902) # 1902 驗證碼類型 官方網站>>價格體系 3.4+版 print 後要加()
data = res['pic_str']
print(data)
第三方接口給你們介紹到這裏,接下來咱們實際應用到登陸中去。
提示:打碼平臺通常都是收費的(差很少是一分錢,識別一次)
接下來以超級鷹這個網站爲列,使用web自動化測試框架selenium來實現驗證碼識別自動登陸,
pip install selenium
# 下載地址
http://chromedriver.storage.googleapis.com/index.html
pip install pillow
一、獲取帳號密碼輸入框:輸入帳號密碼
1
import time
from selenium import webdriver
from PIL import Image
from chaojiying import Chaojiying_Client
# 建立一個瀏覽器
browser = webdriver.Chrome()
# 訪問登陸頁面
url = 'http://www.chaojiying.com/user/mysoft/'
browser.get(url)
time.sleep(1) # 暫停一秒鐘
# 選擇帳號、密碼輸入欄,輸入對應的帳號密碼
input_user=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')
# 輸入帳號
input_user.send_keys('帳號')
input_pwd=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
# 輸入密碼
input_pwd.send_keys('密碼')
# 對當前頁面進行截圖
browser.save_screenshot('login.png')
# 選擇驗證碼圖片的元素
yzm_btn = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')
# 獲取圖片元素的位置
loc = yzm_btn.location
# 獲取圖片的寬高
size = yzm_btn.size
left = loc['x']*1.25 # 計算左邊界
top = loc['y']*1.25 # 計算上邊界
right = (loc['x'] + size['width'])*1.25 # 計算右邊界
botom = (loc['y'] + size['height'])*1.25 # 計算下邊界
# 將上下左右邊界值放到元祖中(注意順序:左 上 右 下)
local = (left, top, right, botom)
pic = PIL.Image.open('file')
pic.crop(local)
pic.sava('zym,png')
# 識別驗證碼
cjy = Chaojiying_Client('帳號', '密碼', '軟件ID') # 用戶中心>>軟件ID 生成一個
im = open('yzm.png', 'rb').read() # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統需要//
res = cjy.PostPic(im, 1902) # 1902 驗證碼類型
data = res['pic_str']
print(data)
# 在輸入框輸入驗證碼
yzm_input = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')
yzm_input.send_keys(data)
# 點擊登陸
submit = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')
submit.click()
import time
from selenium import webdriver
from PIL import Image
from chaojiying import Chaojiying_Client
# 建立一個瀏覽器
browser = webdriver.Chrome()
# 訪問登陸頁面
url = 'http://www.chaojiying.com/user/mysoft/'
browser.get(url)
time.sleep(1) # 暫停一秒鐘
# 選擇帳號、密碼輸入欄,輸入對應的帳號密碼
input_user = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')
input_user.send_keys('qq121292679')
input_pwd = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
input_pwd.send_keys('546245426')
# 獲取驗證碼的圖片,並進行識別,將識別的結果,輸入到驗證碼輸入框中
# 對當前頁面進行截圖
browser.save_screenshot('login.png')
# 選擇驗證碼圖片的元素
yzm_btn = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')
# 獲取圖片元素的位置
loc = yzm_btn.location
# 獲取圖片的寬高
size = yzm_btn.size
# 獲取驗證碼上下左右的位置
left = loc['x']*1.25
top = loc['y']*1.25
right = (loc['x'] + size['width'])*1.25
botom = (loc['y'] + size['height'])*1.25
val = (left, top, right, botom)
# 打開網頁截圖
login_pic = Image.open('login.png')
# 經過上下左右的值,去截取驗證碼
yzm_pic = login_pic.crop(val)
yzm_pic.save('yzm.png')
# 識別驗證碼
cjy = Chaojiying_Client('qq121292679', '546245426', '96001') # 用戶中心>>軟件ID 生成一個替換 96001
im = open('yzm.png', 'rb').read() # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統需要//
res = cjy.PostPic(im, 1902) # 1902 驗證碼類型 官方網站>>價格體系 3.4+版 print 後要加()
data = res['pic_str']
print(data)
# 在輸入框輸入驗證碼
yzm_input = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')
yzm_input.send_keys(data)
# 點擊登陸
submit = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')
submit.click()
1