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:Python37Lib)。

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

原文地址:https://www.cnblogs.com/yuntimer/p/11407733.html