• 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

  • 相关阅读:
    C#数组学习
    关于servlet中要写初始化逻辑应该重载有参还是无参的init
    servlet初识servletConfig
    servlet通过响应头Content-Disposition实现文件下载效果
    response中setCharacterEncoding和setContentType的区别
    通过refresh响应头,定时刷新或隔n秒跳转页面
    通过location响应头实现重定向
    三层交换原理
    什么是CLOS架构?
    Cat8 八类网线是什么?与Cat5、Cat6、Cat7网线的区别?
  • 原文地址:https://www.cnblogs.com/yuntimer/p/11407733.html
Copyright © 2020-2023  润新知