zoukankan      html  css  js  c++  java
  • (三十一)WebDriver API之验证码的处理

    随笔记录方便自己和同路人查阅。

    #------------------------------------------------我是可耻的分割线-------------------------------------------

      学习selenium自动化之前,最好先学习HTML、CSS、JavaScript等知识,有助于理解定位及操作元素的原理。关于python和selenium安装请自行搜索别的资料,

    这里就不多做介绍了,所有例子均使用python3.6+selenium执行的。

    #------------------------------------------------我是可耻的分割线-------------------------------------------

    验证码的处理

      对于Web应用来说,大部分的系统在用户登录时都要求用户输入验证码。验证码的类型很多,有字母数字的、有汉字的,甚至还有需要用户输入一到算术题的答案的。对于系统来说,使用验证码可以有效地防止采用机器人猜测方法对口令的刺探,在一定程度上增加了安全性。

      但对于测试人员来说,不管是进行性能测试还是自动化测试,都是一个比较棘手的问题。在WebDriver中并没有提供相应的方法来处理验证码,这里笔者根据自己的经验来谈谈处理验证码的几种常见方法。

      1.去掉验证码

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

      2.设置万能验证码

      去掉验证码的主要问题是安全,为了应对在线系统的安全威胁,可以在修改程序时不去掉验证码,而是在程序中留一个“后门”,即设置一个“万能验证码”。只要用户输入这个“万能验证码”,程序就认为验证通过,否则就判断用户输入的验证码是否正确。

      设计万能验证码的方式非常简单,只需对用户的输入信息多加一个逻辑判断,下面通过例子演示。

     

    from random import randint
    
    #生成一个1000到9999之间的随机整数
    verify = randint(1000,9999)
    print(u"生成的随机数:%s" % verify)
    
    number = input("请输入随机数:")
    print(number)
    number = int(number)
    
    if number == verify:
        print("登录成功!!")
    elif number == 5412:
        print("登录成功!!")
    else:
        print("验证码输入有误!")

      randint()用于生成随机数,设置随机数的范围为1000~9999之间。运行程序分别输入正确的验证码、万能验证码和错误的验证码,执行结果如下:

     

     

      3.验证码识别技术

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

      4.记录cookie

      通过向浏览器中条件cookie可以绕过登录的验证码,这是比较有意思的一种解决方案。例如我们在第一次登录某网站时勾选“记住密码”的选项,当下次再访问该网站时自动处于登录状态了。这样自然绕过了验证码问题。这个“记住密码”的功能其实就记录在了浏览器的cookie中。前面已经学了通过WebDriver来操作浏览器的cookie,可以通过add_cookie()方法将用户名密码写入浏览器cookie,当再次访问网站时,服务器将直接读取浏览器的cookie进行登录

    from selenium import webdriver
    from time import sleep

    # driver=webdriver.Firefox()
    driver=webdriver.Chrome()
    driver.get("https://baidu.com/")

    #手动添加cookie

    driver.add_cookie({'name':'BAIDUID','value':'92241303A3AC5BA1D9FD08FAA258A9BD:FG=1'})
    driver.add_cookie({'name':'BDUSS','value':'ktFaVU3QXBSSUxLNjFxLWg0Qlg1NkJuWGtqU1h6alA2cnF5bzg0eEFxZFpTQ0piQVFBQUFBJCQAAAAAAAAAAAEAAAB~V4cC5~Pd0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFm7-lpZu~paM'})

    sleep(3)
    driver.refresh()
    sleep(3)

      这种方式最大的问题是如何从浏览器的cookie中找到用户名和密码对应的key值,并穿输入对应的登录信息。可以用get_cookies()方法来获取登录的所有的cookie信息,从中找到用户名和密码的key。当然,更直接的方式是询问开发人员。

  • 相关阅读:
    ORACLE各种对象、概念及关系整理(一文读懂)
    Spring面试题总结及答案
    MySQL面试总结
    可变参数,你还为方法的参数而烦恼吗?可变参数,让你的头发从此“茂密”!
    java编译报错: 找不到或无法加载主类 Demo.class 的解决方法
    java编译报错 错误: 编码GBK的不可映射字符
    sql server2017开启远程连接
    sql server一些快捷方式和操作技巧
    sql server无法连接本地服务器
    phpStorm+xdebug调试(php7.3)
  • 原文地址:https://www.cnblogs.com/lirongyang/p/11459817.html
Copyright © 2011-2022 走看看