zoukankan      html  css  js  c++  java
  • Selenium UI自动化验证码:识别+输入

    思路:使用UI+接口的方式来查找验证码图片和获取验证码元素进行参数输入(用截图方式)(非图片类型验证码无法实现)

    我们以访问当当网的注册界面来演示

    1.通过selenium定位查找验证码并截图保留

    1引入selenium包,创建web驱动,进入登录界面,执行无误

    2创建截图函数:查找验证码元素,截下当前的图片

    定位验证码图片

    对验证码图片进行截图

    使用代码获取验证码图片左上角的坐标(x,y),使用代码获取验证码图片的长度和宽度,求出两个对角的横纵坐标(四个边的x,y坐标)

    3通过已经获得的验证码的两个对角线的点的四个坐标将验证码截图(后面用接口获取值)

    获取到的截图

    这部分实现的代码

    2. 新建获取验证码函数,通过接口方法获取验证码

    1这个操作需要花钱,参考网址:https://www.showapi.com/apiGateway/view?apiCode=184

    2注册登录并购买套餐(花钱就行,注意使用时的消耗和次数)推荐买最便宜的试,有需要再说

    3使用方法:根据当前验证码的规则是4位英文字母,所以我们使用只含英数字符的就行

    检查验证码类型和长度(当前验证码是四位,且均是英文字母)

    选择业务类型(因此选择英文数字类型的待识别内容)

    4选择操作语言,查看指引方法(上一张图往下滚)

    选择语言后出现代码的指引操作,点击下载右边的SDK下载(soft-develop-kit 软件开发包)

    下载是一个zip压缩包,解压后是一个py同名不同格式名的文件

    将这个文件放到工作路径并引用,引用方法参照代码指引,并需要下载接口请求的requests

    调用这个文件里的方法我们需要三个参数(urlmy_appidmy_appsecret)其中接口地址在上面已给出

    my_appidmy_secret在登录后的个人中心——我的应用处获取 my_secret需要输入密码

    查看appid

    查看密码(得先输入登录密码)

     

    其他操作内容——对文件的获取,以及内容及长度的识别,这里只展示使用方法,上面有使用参数的介绍,根据个人需要配置参数,最后调用发送请求获取响应

    使用方法介绍

    参数介绍

    5完成验证码函数的代码实现

    6使用变量接收获取到的验证码,定位到输入框,输入获取到的验证码

    7一切都准备好后,点击运行

    最后附上全部代码

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


    driver = webdriver.Chrome()
    driver.get("https://login.dangdang.com/register.php?returnurl=http://book.dangdang.com/?_utm_brand_id=11106&_ddclickunion=460-5-biaoti|ad_type=0|sys_id=1")

    def screen_shot():
        driver.save_screenshot(r"D:zhuce.png") #截下当前页面的图
        left_angle = driver.find_element_by_id("imgVcode").location #获取验证码左上角坐标
        print(left_angle) #查看验证码图片左上角点的坐标
        left = left_angle["x"] #获取验证码图片最左边的x轴坐标
        top = left_angle["y"] #获取验证码图片最上面的y轴坐标
        image = driver.find_element_by_id("imgVcode") #对整个图片进行定位
        width = image.size["width"] #获取图片的宽度
        height = image.size["height"] #获取图片的高度
        right = left+width #获取验证码图片最右边的x轴坐标
        down = top+height #获取验证码图片最下面的y轴坐标
        print(left,top,right,down) #打印四个角的横纵坐标

        openim = Image.open(r"D:zhuce.png") #打开刚才截下的整个的图片
        jietu = openim.crop((left,top,right,down)) #通过刚才获得的四个坐标进行截图(Imagez中的方法) 这里是两个小括号
        jietu.save(r"D:xi.png") #截取验证码的小图并继续保存

    def yanzhengma():
        yz = ShowapiRequest("http://route.showapi.com/184-4","104117","6baff26b20aa48edb6584955c0e08559")
        yz.addFilePara("image",r"D:xi.png") #小验证码的照片来源
        yz.addBodyPara("typeId","24") #这个是纯英文数字,我输入24就可以
        yz.addBodyPara("convert_to_jpg","0") #照片类型不做转换
        yz.addBodyPara("needMorePrecise","1") #精度转换
        res = yz.post().json() #获取json格式的响应,方便取值
        d = res["showapi_res_body"]["Result"] #获取Result下的验证码的值
        print(d) #打印
        return d #返回

    if __name__=="__main__":
        screen_shot()
        c = yanzhengma() #赋值 用于输入
        driver.find_element_by_id("txt_vcode").send_keys(c)

    补充一下,这个套餐有次数和时间限制,想知道使用情况可以登录并查看即时情况

    本篇博文虽然用的是Python,但验证码接口识别支持多种语言。也可以用其他语言实现

    博文内容均为个人整理,如有错误请及时指出,如有建议和意见请联系:836311007(微信和QQ)
  • 相关阅读:
    Android性能测试工具APT使用指南
    android.app.Activity阅读摘要,有时候会不会需要保持一些现场数据呢? 想让系统帮你退出到后台或者挂掉前做些前置保持工作吗,重点参考吧:
    OkHttp+Stetho+Chrome调试android网络部分
    HLG2179 组合(dfs水水更健康)
    HLG 1494网络 (求的割点数目)可做模板
    hdu2586&&poj1330 求点间最短距&&最近公共祖先(在线&&离线处理):::可做模板
    hdu 2586
    poj分类
    poj3748 位运算 bitset
    C++ bitset类的使用与简介
  • 原文地址:https://www.cnblogs.com/wangx123sec/p/11495103.html
Copyright © 2011-2022 走看看