selenium自动处理验证码

2023-11-16

自动化测试中的验证码处理方法小总结

 

转自:  Selenium中文论坛 -> Selenium RC -> [转]自动化测试中的验证码处理方法小总结

原作者:yanpingsha

目前,不少网站在用户登录、用户提交信息等登录和输入的页面上使用了验证码技术。验证码技术可以有效防止恶意用户对网站的滥用,使得网站可以有效避免用户信息失窃、广告SPAM等问题。但与此同时,验证码技术的使用却使得WEB自动化测试面临了较大的困难。

  验证码一般应用在WEB系统涉及登录和输入的页面上,其实现的一般方法是在页面上显示一幅图片,要求用户肉眼识别图片中的信息并将该信息作为输入的一部分进行提交。页面上显示的这幅图片一般是一串随机产生的数字或符号,并且被添加了用于防止识别的背景。验证码的主要目的是为了防止恶意用户利用自动工具(机器人)对用户口令进行暴力破解、恶意注册用户,或是向网站发布令人厌烦的广告信息等。

  验证码具有随机性和不易被自动工具识别的特点,当用户访问某个使用验证码的页面时,每次对该相同页面的访问都会得到一个随机产生的不同的验证码,并且,这些验证码具有能够被人工识别,但很难被自动工具识别的特点,这样,自动工具就很难适应使用验证码的页面,从而达到保护网站不被恶意使用的目的。

 

1、验证码的主要实现方法

 

要解决验证码,需要知道验证码是如何产生的,验证码的生成方式有两种“读取方式”和“生成方式”两种。

  读取方式,就是在服务器目录下保存制作好的图片文件,然后显示在Web页面上让用户识别。这种方式完全可以通过url的来破解图片的地址,通过图片地址可以间接的知道图片表示的验证码是什么。所以现在这种方式很少出现了。

  生成方式,是通过随机生成字符串,然后利用编程语言的图形库生成验证码图片显示在页面上让用户识别。在生成的时候还可以增加背景的一些噪音,改变字符和背景的颜色,甚至变形字符。这种方式本身如果不是用对字符的变形和在背景增加噪音的情况下,可以通过OCR的技术来识别,但是经过这两种处理后,使得识别变的非常困难。

 

2、验证码的大致实现原理

 

使用生成式的验证码实现原理:首先服务器端生成随机数,并把它保存在session中,然后利用图形库生成验证图片展现给客户端的用户辨认;用户根据验证码图片输入自己识别的验证码发送给服务器端;服务器端根据session保存的随机数和用户输入的验证码进行对比,如果匹配验证通过,如果不匹配验证失败。

 

3、自动化测试解决验证码的方式

  自动化测试解决验证码的问题,最主要的有两种方式,通过识别方法和服务端插入法。这两种方式实现方法上侧重点不同,适用的场合也不同。

 3.1 识别的方法

  识别的方法,完全不用考虑服务端,直接通过图像识别的技术(如OCR技术),通过识别图片来破解验证码。这种方法优点就在于不需要服务器端做任何修改,不用提供任何接口,自动化测试便可以完成自己的验证码识别。但是这种方法也有致命的缺点,就是他的识别成功率的问题,在存在变形和背景加入噪音的验证码中,这种识别率相当的低。如果验证码还存在中文的话,那识别成功率就几乎难以忍受了。这种方法我们在以往的实践经验中,曾经使用OCR技术处理过验证码。但是最近遇到一些验证码,使用OCR的识别率都很低。

 

简单说明一下为什么OCR的识别率比较低,OCR是光学字符识别的简称,他一般用来识别等大规则字体的图像,比方说他可以扫描印刷的图书,将纸质的书扫描到计算机中形成文本;也可以用来识别证件号码,加快机读证件速度。所以如果在验证不规整或者存在噪点,那么识别率会直线下降。但是市面上有些人做的验证码识别程序为什么识别率那么高而通用的OCR识别程序识别率低呢?由于验证码的生成时的变形和加入噪点是存在规律的,开发者可以通过这些规律,为特定的验证码生成程序编写特定的识别代码,这种情况下的识别率是非常高的。还有为什么中文识别率低?这个就比较好理解了,想想英文只有26个字母,26种形态,我们中文一个字一个形态。还有在OCR识别的时候,他的算法可能会通过识别部分来确认全部,有点盲人摸象的感觉(具体的算法可以参照OCR具体的实现算法),在这种情况下,如果中文有稍微的变形就很难识别的了。如果不能理解这点,想想我们小学学习那些形近字的痛苦,也就知道对于计算机是多难了。

  这里补充一下QTP9.5以后加入了ABBYY公司的OCR解决方案,他对验证码的识别率是比较高的。当然silktest2009也加入了OCR识别库,不过我觉得识别率比较低。具体这两个工具OCR的部分,可以参照相关手册。当然开源中也有OCR的项目,目前比较好的叫tesseract-ocr。可以将开源的OCR库加入到自动化测试工程中使用。

 

3.2 服务器插入方法

  服务器插入方法,方法在服务端提供一个可被客户端使用的接口,只要客户端传递过来自己的SessionID,该接口就返回此时正确的Session,这种方法就可以很容易地让自动测试工具直接获取到正确的应该提交的验证码内容。从测试的角度来说,这种方法就等于是在系统上增加了一个测试接口,从而提高了系统的可测试性。这种方法的缺点也很明显,上线的程序一般不会保留这样的缺口,并且如果是做性能测试,通过接口获取验证码,会多一次交互操作,这样测试结果可能会有差异。

  session的获取的实现方法,根据使用的语言不同框架不同,可能获取session中验证码的方法有所不一样,但是总的思路是一致的。

  这里提供一个java用jsp写的demo,主要是为了说明从session中获取验证码的方法思路是什么样子的:

  首先,先来看一下jsp中一般验证码是如何实现的:

 

<img src="CheckCode.jsp"border="0" alt="验证....... 这个是调用 CheckCode.jsp 文件,生成图片验证码 

 

CheckCode.jsp文件代码如下

 

String sRand="";  

for (int i=0;i<4;i++){  

   String rand=String.valueOf(random.nextInt(10)); //生成随机数  

   sRand+=rand;  

}  

session.setAttribute("rand",sRand);将随机数据存入session中 

String sRand="";

for (int i=0;i<4;i++){

   String rand=String.valueOf(random.nextInt(10)); //生成随机数

   sRand+=rand;

}

session.setAttribute("rand",sRand);将随机数据存入session中

 

 

简单分析一下,在页面中有一个图片,该图片是通过验证码生成程序来生成的,生成程序首先生成随机数或者随机的字母。然后将随机生成好的代码存入到session中去。

然后,可以通过使用jsp的页面来吧session中的验证码传出来,具体代码如下:

 

 

getCheckCode.jsp代码如下  

<%  

  out.print(session.getAttribute("rand"));  

%> 

 

最后,在自动化测试脚本中首先CheckCode.jsp来生成图片的验证码,然后打开getCheckCode.jsp来获得验证码,然后讲获得的验证码填入提交的表单中提交。

  总结该方法,适合在测试环境中,加入一个获取验证码的页面(或者其他接口),自动化测试通过该页面来获得相应的验证码;当产品上线后,删除获得验证码的页面即可。该方法不适合生产环境,他其实是做了一个后门,从安全角度上讲,是比较危险的。该方法也不适合对验证码加密存储的情况:在实际应用中,可以将随机生成的验证码进行MD5加密存储到session中,用户输入的验证码也需要使用MD5加密后,和session中存在的密文进行对比。大家知道破解md5是非常困难的,如果使用这种方法的话,从session中获得验证码也是不可取的

 

3.3 其他一些方法来解决验证码

  在实际使用中也可以通过一些小技巧来解决验证码,这些方法就是通过各种手段来逃避或者获得验证,而这些手段主要是要求开发者在开发的时候留有一定的后门。下面简述几种:

  ●使用万能验证码,这种方法就是在判断验证的时候,如果遇到前台输入的是万能验证码,那就不要做验证码校验直接通过。

  ●特定用户跳过验证码,这种方法就是如果遇到指定用户登录,那么不管输入什么验证码,验证码校验都通过。

  ●使用hidden 控件在页面上显示验证码,就是在使用验证码的页面上,加入一个隐藏的控件,该控件的内容就是验证码。虽然用户看不到但是自动化测试工具可以找到该控件,并获得验证码。当然隐藏控件中的验证码也可以使用加密的方法,自动化测试脚本得到加密的验证后,可以通过解密操作解密验证码。

  上述的方法都需要开发对代码进行一定的修改,最好不要在生产环境上做,不然会造成安全漏洞。

4、小结

  作为自动化测试工程师遇到验证码的问题,无疑是非常头疼的。如果在测试环境中,最好能通过接口方法,或者开发后门的方法获取验证码,这样可能更有效。如果上线程序,安全性要求比较高的情况下,只能使用识别的方法。识别的方法可以多尝试几种OCR程序,由于OCR程序的算法不同,可能对于特定的验证码识别的成功率也不同。如果遇到中文的验证码,且那个中文字还变形了,最好的方法就是告诉开发换成英文的,中文的识别率,那真的很低。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium自动处理验证码 的相关文章

  • fedora18 从文本模式启动而不是图形界面启动

    在之前的linux版本中 如果想要启动操作系统后直接进入文本模式 那就要修改 etc inittab这个文件 把其中的5改成3即可 可是 linux2 6 貌似是 内核之后 这个文件就改了 它不再控制着系统的默认启动模式了 如果在fedor
  • vant-weapp 组件 样式的覆盖(一)

    最近在小程序开发中使用到 vant weapp 组件 但有些样式不符合自己的项目要求 需要对样式进行覆盖 以DropdownMenu组件为例 需求是用户选择菜单项 菜单文字变成 橙色 样式的修改 就是以权重高的 覆盖权重低的
  • “Docker Content Trust + 镜像签名”,打造安全的 Kubernetes 供应链!

    出品丨Docker公司 ID docker cn 编译丨小东 每周一 三 五晚6点10分 与您不见不散 说在前面 两周前 我们分享了一篇名为 镜像扫描 基于策略的镜像提升 打造安全的 Kubernetes 供应链 的文章 它主要介绍了 Do

随机推荐

  • 利用BaseMultiItemQuickAdapter打造二、三级级菜单

    去网上找了下资料 然后自己整理了下二级 三级菜单的实现 直接上代码 Recyclerview记得要导包 implementation com android support recyclerview v7 28 0 0 一 首先在app下的
  • AI赋能的判定机制的倾向性

    最近忙着论文的事情 没有时间写一些技术博客 而且CSDN的图床经常出现问题 也懒得整理了 今天也是说些闲话 讨论下对未来AI赋能的判定机制的一些思考 什么是AI赋能的判定机制 主要其实就是 基于机器智能的技术手段 来代替人类评判事情 可以举
  • 最全的整理:毫米波雷达在检测、分割、深度估计等多个方向的近期工作及简要介绍

    前情回顾 在之前 我已经有介绍过毫米波雷达在2D视觉任务上的一些经典网络 自动驾驶中雷达与相机融合的目标检测工作 多模态目标检测 整理 Naca yu的文章 知乎 总结概括而言 其本质上都是对视觉任务的一种提升和辅助 主要的工作在于如何较好
  • 一些官方的github地址

    阿里巴巴开源github地址 https github com alibaba 腾讯开源github地址 https github com Tencent 奇虎360github地址 https github com Qihoo360 小米
  • xss的绕过方式

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 xss的类型以及常用标签 二 xss常用绕过 总结 前言 xss cross site scripting 中文 跨站脚本攻击 常年位于owasp top
  • 损失函数和正则化

    参考 https www cnblogs com LXP Never p 10918704 html https blog csdn net Heitao5200 article details 83030465 https zhuanla
  • C++-----拷贝构造函数

    拷贝构造函数是一种特殊的构造函数 和构造函数同样是特殊的类成员函数 C 提供的拷贝构造函数用于在建立新对象时将已存在对象的数据成员的值复制给新对象 拷贝函数的特点 拷贝函数是构造函数的一个重载形式 拷贝函数的参数只有一个且必须是类类型对象的
  • ffmpeg命令使用记录

    1 添加水印 ffmpeg i a mp4 acodec copy b v 548k vf movie logo png watermark in watermark overlay 20 20 output mp4 说明 i a mp4
  • TM4C123库函数学习(1)--- 点亮LED+TM4C123的ROM函数简介+keil开发环境搭建

    前言 1 首先 我们需要知道TM4C123是M4的内核 对于绝大多数人而言 入门都是学习STM32F103 这款芯片是采用的M3的内核 所以想必各位对M3内核还是有一定的了解 M4内核就是M3内核的升级版本 他继承了M3的的所有功能 同时还
  • leetcode 1604. 警告一小时内使用相同员工卡大于等于三次的人

    力扣公司的员工都使用员工卡来开办公室的门 每当一个员工使用一次他的员工卡 安保系统会记录下员工的名字和使用时间 如果一个员工在一小时时间内使用员工卡的次数大于等于三次 这个系统会自动发布一个 警告 给你字符串数组 keyName 和 key
  • C~运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号 C 语言提供了以下类型的运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 下表显示了 C 语言支持的所有算术运算符 假设变量 A 的值为 10 变
  • Windows10安装Docker(基于WSL2,包含WSL2安装教程)

    WSL2 wsl是windows自带的功能 只需要开启Windows功能即可安装子系统 可以通过以下命令获取发行版名字 wsl list online 通过以下命令安装 wsl install d 发行版名字 如 wsl install d
  • android input 机制源码分析

    具体文字说明请参考 http blog csdn net luoshengyang article details 6882903
  • 2018年AI趋势盘点(02)

    善用智能之道 请您点击上方蓝色字体 欢迎关注 九三智能控 懒人阅读 2017年被定义为AI的史诗年 九三觉得17年确实引爆了AI 同时泡沫也存在不少 18年的AI将更加务实技术更加接近真实场景 可以确认的一点是 认知决策能力的升级将对所有行
  • WiFi探针的工作原理及采集的数据?

    WiFi探针在商业 公共安全领域的大放异彩 更多的人想了解什么是WiFi探针 WiFi探针是怎么工作的 WiFi探针的工作原理 要深入了解WiFi探针技术 首先先认识WiFi使用的网络协议 WiFi采用的是IEEE802 11协议集 此协议
  • element对上传组件二次封装,vue上传下载组件的实现

    前言 对element的上传组件进行二次封装 让他可以实现上传下载功能 实现效果 手动上传 不是自动 选中文件后可上传 也可清空选中文件 单个删除也是可以的 实现步骤 1 封装好的 uploadAndDown vue源码 引入就好
  • Linux 入门常用命令(ZT)

    1 Linux进入与退出系统 进入Linux系统 必须要输入用户的账号 在系统安装过程中可以创建以下两种帐号 1 root 超级用户帐号 系统管理员 使用这个帐号可以在系统中做任何事情 2 普通用户 这个帐号供普通用户使用 可以进行有限的操
  • MATLAB——求冲激响应和阶跃响应

    题目 已知一个RLC串联振荡电路系统函数为 其中L 22mH C 2000pF R 100 求其时域的冲激响应和阶跃响应 代码解释 这段代码定义了三个变量 电感L 电容C和电阻R 然后 定义了两个数组a和b 它们是差分方程的系数 接下来 使
  • 拿不到年薪25W全额退款

    速报 2023年经济下行趋势明显 毕业生出路在哪儿 今年 毕业人数将达到1158万 导致很多公司招聘非常谨慎 要求也变得非常更高 别说offer 现在出门找个实习都难 大学四年我都学了啥 是啊 现在咋找实习丰富简历啊 今年毕业的我该怎么办
  • selenium自动处理验证码

    自动化测试中的验证码处理方法小总结 转自 Selenium中文论坛 gt Selenium RC gt 转 自动化测试中的验证码处理方法小总结 原作者 yanpingsha 目前 不少网站在用户登录 用户提交信息等登录和输入的页面上使用了验