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

相关文章
相关标签/搜索