(三十一)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。当然,更直接的方式是询问开发人员。

原文地址:https://www.cnblogs.com/lirongyang/p/11459817.html