web 自動化-驗證碼識別登錄 圖片驗證碼


  這個軟件收費,這就很不好了

1、pillow 模塊安裝(處理圖像的庫)

默認安裝:打開 cmd,輸入命令:

  pip install pillow

豆瓣格式:打開 cmd,輸入命令:

  pip install -i https://pypi.douban.com/simple pillow

 

2、驗證碼的由來

  • 驗證碼,是一種區分用戶是計算機還是人的公共全自動程序。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。這個問題可以由計算機生成並評判,但是必須只有人類才能解答
  • 對於web應用程序來講,處於安全性考慮,在登錄的時候,都會設置驗證碼,驗證碼的類型種類繁多,有圖片中辨別數字字母的,有點擊圖片中指定的文字的,也有算術計算結果的,再復雜-點就是滑動驗證的。 諸如此類的驗證碼,對我們的系統增加了安全性的保障,但是對於我們測試人員來講,在自動化測試的過程中,無疑是一個棘手的問題。

 

3、web自動化驗證碼解決方案

一般在我們測試過程中,登錄遇到驗證碼的時候,有以下種解決方案:

  • 第一種、讓開發去掉驗證碼
  • 第二種、設置一個萬能的驗證碼
  • 第三種、通過cookie繞過登錄
  • 第四種、自動識別技術識別驗證碼

 

4、識別驗證碼

1、第三方的打碼平台識別

  

 

 

  網絡上的第三方打碼平台眾多,這里的選擇 超級鷹 這個第三方的平台來給大家做演示。

  地址:http://www.chaojiying.com/

2、下載開發文檔:

  

下載好的代碼:

import requests
from hashlib import md5


class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password = password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 圖片字節
        codetype: 題目類型 參考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                          headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:報錯題目的圖片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


if __name__ == '__main__':
    # 需要傳三個參數'超級鷹用戶名', '超級鷹用戶名的密碼', '軟件id'
    cjy = Chaojiying_Client('qq1938091409', '123456', '904651')  # 用戶中心>>軟件ID 生成一個替換 96001
    # 打開一個文件,讀取圖片的內容
    im = open('a.jpg', 'rb').read()  # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統須要//
    print(cjy.PostPic(im, 1902))
    res = cjy.PostPic(im, 1902)  # 1902 驗證碼類型  官方網站>>價格體系 3.4+版 print 后要加()
    print(res['pic_str'])

 

3、需要注冊賬號,在代碼執行中會用到 '超級鷹用戶名', '超級鷹用戶名的密碼', '軟件id'

  

 

 

獲取並輸入圖片驗證碼步驟順序:

import time
from selenium import webdriver
from PIL import Image       # pillow模塊
from web_項目前期.a圖片驗證碼.chaojiying import Chaojiying_Client

# 創建一個瀏覽器
driver = webdriver.Chrome()
# 訪問登錄頁面
url = 'http://www.chaojiying.com/user/mysoft/'
driver.get(url)
time.sleep(2)  # 暫停一秒鍾

# 選擇賬號、密碼輸入欄,輸入對應的賬號密碼
input_user = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')
input_user.send_keys('qq121292679')
input_pwd = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
input_pwd.send_keys('546245426')

# 獲取驗證碼的圖片,並進行識別,將識別的結果,輸入到驗證碼輸入框中
# 對當前頁面進行截圖
driver.save_screenshot('login.png')

# 選擇驗證碼圖片的元素
yzm_btn = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')
# 獲取圖片元素的位置
loc = yzm_btn.location
# 獲取圖片的寬高
size = yzm_btn.size
print(loc)
print(size)

# 獲取驗證碼上下左右的位置,電腦的縮放比例125%(100%就不需要乘),需要乘以1.25,否則會出現定位不准確
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 = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input')
yzm_input.send_keys(data)


# 點擊登錄
submit = driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input')
submit.click()

# 登錄之后等待5秒 關閉瀏覽器
time.sleep(5)
driver.close()

 

 

*******請大家尊重原創,如要轉載,請注明出處:轉載自:https://www.cnblogs.com/shouhu/,謝謝!!******* 


免責聲明!

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



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