zoukankan      html  css  js  c++  java
  • 自动化测试如何解决验证码的问题

    本文转载虫师的文章http://www.cnblogs.com/fnng/p/3606934.html在此很感谢虫师的分享!

    个人认为虫师的博客写的很不错,里面有很多好文章,做测试这一行业的朋友可以多去看看虫师的博客!

    下面来谈一下处理验证码的几种方法。

    去掉验证码

      这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,如果是在测试环境,这样做可省去了测试人员不少麻烦,如果自动化脚本是要在正式环境跑,这样就给系统带来了一定的风险。

     

     

    设置万能码

      去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,而是程序中留一个“后门”---设置一个“万能验证码”,只要用户输入这个“万能验证码”,程序就认为验证通过,否则按照原先的验证方式进行验证。

    复制代码
    #coding=utf-8
    import random
    
    #生成0到10之间的随机数
    #d = random.uniform(0,10)
    #print d
    
    #生成一个1000到9999之间的随机整数
    d = random.randint(1000,9999)
    print u"生成的随机数:%d " %d
    
    i = input(u"请输入随机数:")
    print i
    
    if i == d:
        print u"登录成功!!"
    elif i == 1111:
        print u"登录成功!!"
    else:
        print u"请重新输入验证码!"
    复制代码

    运行结果:

    复制代码
    >>> ================================ RESTART ================================
    >>> 
    生成的随机数:3764 
    请输入随机数:1111
    1111
    登录成功!!
    >>> ================================ RESTART ================================
    >>> 
    生成的随机数:3763 
    请输入随机数:3763
    3763
    登录成功!!
    >>> ================================ RESTART ================================
    >>> 
    生成的随机数:1928 
    请输入随机数:1354646
    1354646
    请重新输入验证码!
    复制代码

    random

    random用于生成随机数

    randint()

    randint()方法用于生成随机整数,传递的两个参数分别是随机数的范围,randint(1000,9999)第二个参数要大于第一个参数。

    我们要求用户输入随机数,并且对用户输入做判断,如果等于生成的随机数那么,登录成功,如果等于1111也算登录成功,否则失败。那么等于1111的判断就是一个万能码。

    验证码识别技术

      例如可以通过Python-tesseract 来识别图片验证码,Python-tesseract是光学字符识别Tesseract OCR引擎的Python封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是100% 。

     

     

    记录cookie

    (适用于UI自动化测试,且目前在大部应用的用户名密码不记录在cookie 或 进行加密处理。)

      通过向浏览器中添加cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。我们可以在用户登录之前,通过add_cookie()方法将用户名密码写入浏览器cookie ,再次访问系统登录链接将自动登录。例如下面的方式:

    复制代码
    ....
    #访问xxxx网站
    driver.get("http://www.xxxx.cn/")
    #将用户名密码写入浏览器cookie
    driver.add_cookie({'name':'Login_UserNumber', 'value':'username'})
    driver.add_cookie({'name':'Login_Passwd', 'value':'password'})
    #再次访问xxxx网站,将会自动登录
    driver.get("http://www.xxxx.cn/")
    time.sleep(3)
    ....
    driver.quit()
    复制代码

    使用cookie进行登录最大的难点是如何获得用户名密码的name ,如果找到不到name 的名字,就没办法向value 中输用户名、密码信息。

    我建议是可以通过get_cookies()方法来获取登录的所有的cookie信息,从而进行找到用户名、密码的name 对象的名字;当然,最简单的方法还是询问前端开发人员。

     

    下面就详细的介绍一下这种方式。

    准备工具:

    ------------------

    fiddler

    Python+selenium

    ------------------

    以百度登录为例。

    验证码是汉字的,我想通过程序识别起来有点难度,也会比较麻烦。

    接下来开始动手。

    1、开启Fiddler 工具,像这样!

    2、通过浏览器登录正常登录百度账号。像这样!

    3、通过Fiddler获取登录请求的Cookie。找到Host为“passport.baidu.com”的URL,在右侧窗口查看该请求的Cookie。

    然后,找到重要的两个参数“BAIDUID”和“BDUSS”。

    4、编写Selenium自动化测试脚本,跳过登录。

    复制代码
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com")
    
    # 添加Cookie
    driver.add_cookie({'name':'BAIDUID','value':'AAAAAAAAAAAAAA:FG=1'})
    driver.add_cookie({'name':'BDUSS','value':'AAAAAAAAAAAAAAAAAAAAAAAAAA'})
    
    # 刷新页面
    driver.refresh()
    
    # 获取登录用户名并打印
    username = driver.find_element_by_class_name("user-name").text
    print(username)
    
    #关闭浏览器
    driver.quit()
    复制代码

    首先,访问百度首页,处于未登录状态。

    然后,通过Selenium所提供add_cookie()方法添加Cookie信息。

    最后,刷新页面,现在已经是登录状态了,获取登录之后的用户名并打印。

  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/111testing/p/6490297.html
Copyright © 2011-2022 走看看