51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4555|回复: 2
打印 上一主题 下一主题

[原创] web自动化中常用的跳过验证码操作

[复制链接]
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-5-24 10:09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言
      在做web自动化的时候,登录验证码是一个大问题。在测试过程中,我们可以通过找研发进行去除,但是如果真的无法去除的时候,那应该怎么操作呢?
      安静今天通过几个实例来给大家介绍下,web自动化中怎么解决验证码的问题。

      通过cookies值登录
      我们都知道cookies是保持登录的一种状态,那是否可以通过cookies进行登录呢?
      selenium中也有获取cookies信息操作,通过将cookies保存在text中,在我们执行登录操作时,进行将cookies添加进去,这个时候就能通过cookies完成登录,从而跳过验证码内容。
      思路是清晰了,先进行通过selenium进行获取cookies值信息,这里安静使用的方法是,通过chrome配置信息,selenium可以在已经打开的浏览器中进行操作,获取cookies信息。
      或者在常规打开浏览器页面中强制等待30秒,手动输入验证码和验证码信息,然后在获取cookies信息。
      通过打开cmd打开新的浏览器窗口(这里一定要将chrom的安装路径配置到环境变量中)。
    输入命令:chrome --remote-debugging-port=8210 --user-data-dir="F:\chrome_config"
    # chrome:表示启动chrome浏览器
    # remote-debugging-port:表示执行浏览器端口
    # 8210为个人设置的端口
    # --user-data-dir="F:\chrome_config":表示新建一个浏览器配置信息。




      在终端打开的浏览器中进行登录,登录过后,在通过selenium进行获取登录cookies值。
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import json
    options = Options()
    # 启动的浏览器地址
    options.debugger_address ='127.0.0.1:8210'
    # 将浏览器配置信息进行添加
    driver = webdriver.Chrome( chrome_options=options)
    print('目前浏览器标题:'+driver.title)
    x = json.dumps(driver.get_cookies())
    with open('cookies.txt','w') as f:
        # 将cookies保存为json格式,保存下来,方便下次使用。
        f.write(json.dumps(driver.get_cookies()))




      这里时候我们已经将登录的cookies获取下来了,再次通过selenium进行访问登录页面时候,通读取txt文件信息,将cookies添加进去就可以完成登录了。
    from selenium import webdriver
    import json
    driver = webdriver.Chrome()
    driver.get('http://127.0.0.1/pro/user-login-L3Byby8=.html')
    with open('cookies.txt','r') as f:
        # 使用json读取cookies,进行添加cookies
        cookies_list = json.load(f)
        for cookie in cookies_list:
            driver.add_cookie(cookie)
    # 刷新页面   
    driver.refresh()




      通过执行发现,我们已经完成了登录操作,从而跳过了验证码。


      通OCR识别验证码
      这里安静简单的介绍下通过OCR进行识别输入类型的验证码,从而完成登录操作。
      在平台中找到关于OCR识别的开源接口,然后通过selenium进行获取并保存图片信息,在通过OCR的开源接口信息进行识别图片内容,最后将识别的结果输入到验证码输入框中。
    import requests
    from selenium import webdriver
    import base64
    import time
    driver = webdriver.Chrome()
    # 打开登录页面
    driver.get('http://v3pro.houjiemeishi.com/PC/pages/login/login.html')
    # 获取验证码图片地址
    img_url = driver.find_element_by_class_name('codeImg').get_attribute('src')
    # 通过请求图片地址获取图片的base64编码
    img_r = requests.get(url=img_url)
    base64_data = base64.b64encode(img_r.content).decode()
    bodys = {
        "v_pic": base64_data,
        "pri_id": 'ne',
        "number": 4
    }
    # 这个参数可以通过尖叫数据进行自行申请
    headers = {
        'appcode': "xxxxxxx",
        "appKey": "xxxxxx",
        "appSecret": "xxxxxxx"
    }
    # 请求验证码接口信息,返回验证码数字
    url = 'http://apigateway.jianjiaoshuju.com/api/v_1/yzmCustomized.html'
    r = requests.post(url, headers=headers, data=bodys)
    tt = r.json()['v_code']
    time.sleep(1)
    # 验证码输入框输入验证码信息
    driver.find_element_by_class_name('ipt2').send_keys(tt)



      通过执行发现,我们已经在验证码输入框中输入了正确的验证码信息。


      总结
      其实跳过验证码的方法还有很多种,安静只是介绍了最简单最常用的两种方法进行跳过,当然最最最简单的肯定是让研发自动化测试阶段进行去除,或者用一个万能验证码进行输入。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-9 14:08
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2021-5-24 10:25:51 | 只看该作者
    直接让开发屏蔽验证码是最简单的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-10-22 14:23
  • 签到天数: 1007 天

    连续签到: 1 天

    [LV.10]测试总司令

    3#
    发表于 2021-5-24 11:39:45 | 只看该作者
    内部测试可以使用万能验证码或者屏蔽验证码,但是拿外部正式网站搞时还是无法避开验证码环节。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 06:24 , Processed in 0.066280 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表