当然在自动化测试登陆过程中,还有几种应对方案:
1、去掉验证码(测试环境)
这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,线上环境取消注释验证码模块。如果是在测试环境,这样做可省去了测试人员不少麻烦,线上环境若是去掉验证码的话一般是不可取的,线上环境可选择下面的方案二。
2、设置万能验证码(应该是最佳选择,但是需要开发人员的支持)
去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,而是程序中留一个“后门”——设置一个“万能验证码” ,只要用户输入这个“万能验证码” ,程序就认为验证通过,否则按照原先的验证方式进行验证。
3、验证码识别技术
例如可以通过 Python-tesseract等技术来识别图片验证码,Python-tesseract 是光学字符识别 Tesseract OCR 引擎的 Python 封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF 等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是 100% 。
目前有很多专门做验证码识别技术的,毕竟术业有专攻,也是不错之选,毕竟自己造轮子不大可取。
4、记录 cookie
通过向浏览器中添加 cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。
我们可以在用户登录之前,手动登陆,获取cookie,通过 add_cookie()方法将用户名密码写入浏览器 cookie ,再次访问系统登录链接将自动登录。
但是有的Cookie有一个过期时间,一旦再次运行代码时就需要重新获取cookie,也造成一些麻烦。
举个例子:Selenium + python 绕过验证码登陆百度
# -*- coding:GBK -*-
'''
Created on 2018年4月11日
@author: Peter
'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
url = "http://www.baidu.com"
driver = webdriver.Chrome()
# driver = webdriver.Firefox()
# 隐性等待,最长等X秒(X秒内加载完成所有网页,则执行下一步操作)
# 整个driver的周期都起作用,所以只要设置一次即可
# 缺点 有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步
driver.implicitly_wait(30)
driver.maximize_window()
driver.get(url)
driver.add_cookie({'name':'BAIDUID','value':'XXXXXXXXXXX:FG=1'})
driver.add_cookie({'name':'BDUSS','value':'XXXXXXXXXXXX'}) #此处为BDUSS的值
time.sleep(5)
driver.refresh()
username = driver.find_element_by_class_name("user-name").text
print(username)