目前,不少网站在用户登录、用户提交信息登登录和输入的页面上使用了验证码技术。
验证码技术可以有效防止恶意用户对网站的滥用,使得网站可以有效避免用户信息失窃、广告SPAM等问题。但与此同时,验证码技术的使用却使得WEB自动化测试面临了较大的困难。验证码一般应用在WEB系统涉及登录和输入的页面上,其实现的一般方法是在页面上显示一幅图片,要求用户肉眼识别图片中的信息并将该信息作为输入的一部分进行提交。
页面上显示的这幅图片一般是一串随机产生的数字或符号,并且被添加了用于防止识别的背景。验证码的主要目的是为了防止恶意用户利用自动工具(机器人)对用户口令进行暴力破解、恶意注册用户,或是向网站发布令人厌烦的广告信息等。验证码具有随机性和不易被自动工具识别的特点,当用户访问某个使用验证码的页面时,每次对该相同页面的访问都会得到一个随机产生的不同的验证码,并且,这些验证码具有能够被人工识别,但很难被自动工具识别的特点,这样自动工具就很难适应使用验证码的页面,从而达到保护网站不被恶意使用的目的。
那么在做自动化测试遇到验证码这种随机生成的问题时,该如何解决呢?emmmmm
以下讲举例出三种验证方法,大家可以带入产品进行各自的挑选
第一种方式:
使用OCR图像识别技术,现在主流的验证码技术都是基于OCR图像识别技术
不过了解了一下,该技术自身还是有写不可跨越的缺陷,这里简单地说一下OCR技术的原理:
OCR是光学字符识别的简称,他一般用来识别等大规则字体的图像,比方说他可以扫描印刷的图书,将纸质的书扫描到计算机中形成文本;也可以用来识别证件号码,加快机读证件速度。
所以如果在验证不规整或者存在噪点,那么识别率会直线下降。但是市面上有些人做的验证码识别程序为什么识别率那么高而通用的OCR识别程序识别率低呢?由于验证码的生成时的变形和加入噪点是存在规律的,开发者可以通过这些规律,为特定的验证码生成程序编写特定的识别代码,这种情况下的识别率是非常高的。还有为什么中文识别率低?这个就比较好理解了,想想英文只有26个字母,26种形态,我们中文一个字一个形态。还有在OCR识别的时候,他的算法可能会通过识别部分来确认全部,有点盲人摸象的感觉(具体的算法可以参照OCR具体的实现算法),在这种情况下,如果中文有稍微的变形就很难识别的了。如果不能理解这点,想想我们小学学习那些形近字的痛苦,也就知道对于计算机是多难了。
总结一下缺点:
1.这门技术工具的免费功能有限,收费操作也比较不太方便
2.图像的识别成功率太低,导致有不少的时间都已经花费在图片的识别上了
3.OCR的验证码识别库也是有限的,下面大家可以看看部分基于验证的验证信息会有哪些
OCR识别技术在遇到上面的验证码,都是无法识别,那么就需要用其它的手段来进行处理。
第二种处理方式:
利用Cookie机制
利用Cookie是可以绕过相应的验证码的,比如:只要有过一次正确的登录,后台就可能会以Cookie的形式写入相应的登录信息,从而来保持用户登录状态,此时,在进行自动化测试时,就能将含有登录信息的Cookie带到后台,后台验证Cookie通过后,将保持用户以前登录的状态。
#以Selenium为例的Cookie形式的处理形式:
#Step1:先用抓包工具(如,Filddler)抓取正常登录时的登录状态的Cooike
#Step2:然后在利用Selenium做自动化测试时,把Cookie带入后台:
WebDriver driver = new ChromeDriver();
driver.navigate().to(url);
driver.manage().addCookie(new Cookie(key, value));
driver.navigate().refresh();
缺点
- 一个系统中可能需要进行输入验证码的地方很多,不一定就唯一的是登录或注册时需要;
- Cookie是有失效时间的,过了有效时间就不能再用;
- 后台可能不对Cookie进行处理;
似乎目前并没有完美的解决方案来解决验证码的问题,所以就剩下最后一招:万能验证码
第三种方式:
万能验证码的设置,需要开发人员的配合,把我们的诉求告诉开发,让开发去修改代码,在代码中将需要输入验证码的地方设置成我们需要的固定值,即所谓的万能验证码。
或让开发将需要验证的地方代码注掉(有一定的风险,开发不一定干)。
和开发人员沟通万能验证码的时候,不一定顺利,开发人员可能会找各种理由拒绝,此时需要我们做到心中有数,至少对于验证码的生成原理及验证码的处理机制有一定的了解。很多时候,验证码在后台生成,然后存入Session或放入Redis或其它的地方(具体项目有所不同),当开发人员拒绝时,可以表明自己的看法,对促进工作的开展有很大的帮助。
所以处理验证码一般根据项目来定,如果只是普通的数字型、字母型,且比较容易识别的时候,可用OCR技术实现;如果后台有保持用户登录状态,且有对登录Cookie进行处理的,可使用Cookie的形式;如果不是以上情况,最后的杀手锏就只有万能验证码了。但是设置了万能验证码后,项目要在上线前,记得通知开发人员把万能验证码去掉,如果直接测试的是线上产品,则要记得让开发定期更新万能验证码。
欢迎大家关注公众号【测试菜鸟小家洛】每天持续更新,软件测试知识!