Python自動化測試-驗證識別


一、准備

1、環境基礎:Python3 + pycharm + selenium + request + Pillow,chrome瀏覽器的驅動程序

  1)python:這里用的是Python3.7的,安裝略;

  2)pycharm:編輯器建立Python工程,安裝略;

  3)selenium:Python3環境應該自帶pip.exe,只需在cmd命令窗口輸入pip install selenium 進行安裝;

  4)request:用於接口識別,只需在cmd命令窗口輸入pip install request 進行安裝;

  5)Pillow:用於圖片切割,只需在cmd命令窗口輸入pip install pillow 進行安裝;

  6)chrome瀏覽器的驅動程序:到:http://chromedriver.storage.googleapis.com/index.html? 下載合適的 chromedriver.exe,64位的向下兼容,可以下載32的。解壓后放在Python安裝目錄下,見 https://www.cnblogs.com/yuntimer/p/11178530.html。

2、易源網站-算法的接口(收費的)

  1)需要注冊后購買驗證碼接口算法,一般測試人員不會花時間去寫圖片識別的算法;

  2)准備 用戶id(my_appId)和 密碼(my_appSecret),網站里有用戶使用說明;

  3)識別率高達 90%,只能識別 中文、數字、英文。

二、實現

1、在易源網站-圖片驗證碼識別-請求示例,下載Python-SDK,解壓后放在Python安裝目錄庫下(如:D:\Python37\Lib)。

2、使用selenium啟動chrome瀏覽器,進入驗證碼填寫頁面:

'''調用chrome瀏覽器,打開最大化瀏覽器'''
driver = webdriver.Chrome() # 打開瀏覽器
driver.get("驗證碼頁面地址")# 打開地址
driver.maximize_window()
time.sleep(2)

3、截圖瀏覽器中的圖片,進行切割(Pillow庫),編寫圖片切割函數:

'''截圖瀏覽器中的圖片,進行切割(Pillow庫),從網頁中提取出驗證碼圖片'''
def  jietu():
    driver.save_screenshot("D:/yemian.png")
    '''使用坐標方式,拿到驗證碼左上角坐標'''
    left_top = driver.find_element_by_id("captchaImg").location
    print("左上角坐標",left_top)
    x1 = left_top['x']# 驗證碼框的左上角的x軸坐標
    y1 = left_top['y']# 驗證碼框的左上角的y軸坐標
    '''取出右下角坐標'''
    img = driver.find_element_by_id("captchaImg")# 定位圖片
    x2 = img.size['width']+x1  # 獲取圖片的寬度+ x1 =====》右坐標
    y2 = img.size['height']+y1 # 獲取圖片的高度+ y1 =====》  下坐標
    print("四個點的坐標",x1,y1,x2,y2)
    '''利用這四個坐標切割圖片'''
    yan_img = Image.open("D:/yemian.png")# 打開圖片
    yan_ma = yan_img.crop((x1,y1,x2,y2))
    yan_ma.save("D:/yanzhengma.png")# 保存到硬盤上

4、針對驗證碼進行識別,(易源的接口),易源網站-圖片驗證碼識別中有對應的使用方法:

易源網站示例:

from ShowapiRequest import ShowapiRequest

r = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret" )
r.addFilePara("image", "替換為你的文件")
r.addBodyPara("typeId", "34")
r.addBodyPara("convert_to_jpg", "0")
r.addBodyPara("needMorePrecise", "0")
res = r.post()
print(res.text) # 返回信息

自寫實現方法:

'''再針對驗證碼進行識別(易源的接口)'''
def   shibieyanzhengma():
    # 使用接口環境訪問接口地址===>前提要注意聯網
    yun1 = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret")
# 增加接口請求的參數
    yun1.addBodyPara("typeId","36")#“36”:英數組合,6位驗證碼
    yun1.addBodyPara("convert_to_jpg","0")#“0”:不需要圖片轉換
    # 告訴接口識別的驗證碼圖片文件
    yun1.addFilePara("image","D:/yanzhengma.png")
    # 訪問接口
    result = yun1.post().json()
    print(result)
    # 從json提煉出有效的數據
    text = result['showapi_res_body']['Result']
    print("驗證碼是",text)
    return  text

三、腳本

注:上面實現方法寫的是 驗證碼識別英數_文件 類型的驗證碼。

1、驗證識別-英數組合6位:

__author__ = "三天樂趣"

from PIL import Image
from selenium import webdriver
from ShowapiRequest import ShowapiRequest
import time

'''1、調用chrome瀏覽器,打開最大化瀏覽器'''
driver = webdriver.Chrome() # 打開瀏覽器
driver.get("驗證碼頁面地址")# 打開地址
driver.maximize_window()
time.sleep(2)

'''2、截圖瀏覽器中的圖片,進行切割(Pillow庫),從網頁中提取出驗證碼圖片'''
def  jietu():
    driver.save_screenshot("D:/yemian.png")
    '''使用坐標方式,拿到驗證碼左上角坐標'''
    left_top = driver.find_element_by_id("captchaImg").location
    print("左上角坐標",left_top)
    x1 = left_top['x']# 驗證碼框的左上角的x軸坐標
    y1 = left_top['y']# 驗證碼框的左上角的y軸坐標
    '''取出右下角坐標'''
    img = driver.find_element_by_id("captchaImg")# 定位圖片
    x2 = img.size['width']+x1  # 獲取圖片的寬度+ x1 =====》右坐標
    y2 = img.size['height']+y1 # 獲取圖片的高度+ y1 =====》  下坐標
    print("四個點的坐標",x1,y1,x2,y2)
    '''利用這四個坐標切割圖片'''
    yan_img = Image.open("D:/yemian.png")# 打開圖片
    yan_ma = yan_img.crop((x1,y1,x2,y2))
    yan_ma.save("D:/yanzhengma.png")# 保存到硬盤上

'''3、再針對驗證碼進行識別(易源的接口)'''
def   shibieyanzhengma():
    # 使用接口環境訪問接口地址===>前提要注意聯網
    yun1 = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret")
# 增加接口請求的參數
    yun1.addBodyPara("typeId","36")
    yun1.addBodyPara("convert_to_jpg","0")
    # 告訴接口識別的驗證碼圖片文件
    yun1.addFilePara("image","D:/yanzhengma.png")
    # 訪問接口
    result = yun1.post().json()
    print(result)
    # 從json提煉出有效的數據
    text = result['showapi_res_body']['Result']
    print("驗證碼是",text)
    return  text

# 運行
if  __name__=="__main__":
    jietu()
    # 調用驗證碼函數獲取結果
    yanzhengma = shibieyanzhengma()
    # 將驗證碼放到網頁上
    driver.find_element_by_name("inputCode").send_keys(yanzhengma)
    # time.sleep(3)
    # driver.quit()

效果1:

2、驗證碼識別-算數識別_base64:

__author__ = "三天樂趣"

from PIL import Image
from selenium import webdriver
from ShowapiRequest2 import ShowapiRequest
import time
import base64

'''1、調用chrome瀏覽器,打開最大化瀏覽器'''
driver = webdriver.Chrome() # 打開瀏覽器
driver.get("驗證碼頁面地址")# 打開地址
driver.maximize_window()
time.sleep(2)

'''2、截圖瀏覽器中的圖片,進行切割(Pillow庫),從網頁中提取出驗證碼圖片'''
def  jietu():
    driver.save_screenshot("D:/yemian.png")
    '''使用坐標方式,拿到驗證碼左上角坐標'''
    left_top = driver.find_element_by_xpath("/html/body/div[1]/div/div/div[2]/form[1]/div[3]/div[2]/img").location
    print("左上角坐標",left_top)
    x1 = left_top['x']# 驗證碼框的左上角的x軸坐標
    y1 = left_top['y']# 驗證碼框的左上角的y軸坐標
    '''取出右下角坐標'''
    img = driver.find_element_by_xpath("/html/body/div[1]/div/div/div[2]/form[1]/div[3]/div[2]/img")# 定位圖片
    x2 = img.size['width']+x1  # 獲取圖片的寬度+ x1 =====》右坐標
    y2 = img.size['height']+y1 # 獲取圖片的高度+ y1 =====》  下坐標
    print("四個點的坐標",x1,y1,x2,y2)
    '''利用這四個坐標切割圖片'''
    yan_img = Image.open("D:/yemian.png")# 打開圖片
    yan_ma = yan_img.crop((x1,y1,x2,y2))
    yan_ma.save("D:/yanzhengma.png")# 保存到硬盤上
    with open("D:/yanzhengma.png",'rb') as f:
        data64 = base64.b64encode(f.read())
        text64 = data64.decode()# 轉換成圖片的base64字符串
        print(text64)
    return text64

'''3、再針對驗證碼進行識別(易源的接口)'''
def   shibieyanzhengma():
    # 使用接口環境訪問接口地址===>前提要注意聯網
    yun1 = ShowapiRequest("http://route.showapi.com/184-6","my_appId","my_appSecret")
# 增加接口請求的參數
    yun1.addBodyPara("img_base64",jietu())
    print(yun1.post().text)
    # 從json提煉出有效的數據
    result = yun1.post().json()
    text = result['showapi_res_body']['Result']
    print("驗證碼是",text)
    return  text

# # 運行
if  __name__=="__main__":
    # # 調用驗證碼函數獲取結果
    yanzhengma = shibieyanzhengma()
    # 將驗證碼放到網頁上
    driver.find_element_by_name("captcha").send_keys(yanzhengma)
    # time.sleep(3)
    # driver.quit()

效果2:

 

謝謝,繼續努力!

2019-08-25


免責聲明!

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



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