Python自動化測試-驗證識別

1、準備html

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

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

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

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

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

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

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

二、易源網站-算法的接口(收費的)瀏覽器

  1)須要註冊後購買驗證碼接口算法,通常測試人員不會花時間去寫圖片識別的算法;app

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

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

2、實現

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

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

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

三、截圖瀏覽器中的圖片,進行切割(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")# 保存到硬盤上

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

易源網站示例:

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

3、腳本

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

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

__author__ = "三天樂趣" from PIL import Image from selenium import webdriver from ShowapiRequest import ShowapiRequest import time '''一、調用chrome瀏覽器,打開最大化瀏覽器''' driver = webdriver.Chrome() # 打開瀏覽器 driver.get("驗證碼頁面地址")# 打開地址 driver.maximize_window() time.sleep(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")# 保存到硬盤上 '''三、再針對驗證碼進行識別(易源的接口)''' 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:

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

__author__ = "三天樂趣" from PIL import Image from selenium import webdriver from ShowapiRequest2 import ShowapiRequest import time import base64 '''一、調用chrome瀏覽器,打開最大化瀏覽器''' driver = webdriver.Chrome() # 打開瀏覽器 driver.get("驗證碼頁面地址")# 打開地址 driver.maximize_window() time.sleep(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 '''三、再針對驗證碼進行識別(易源的接口)''' 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

相關文章
相關標籤/搜索