Selenium(十三):验证码的处理、WebDriver原理
1. 验证码的处理
对于Web应用来说,大部分的系统在用户登录时都要求用户输入验证码。验证码的类型很多,有字母数字的、有汉字的,甚至还需要用户输入一道算术题的答案的。对于系统来说,使用验证码可以有效地防止采用机器猜测方法对口令的刺探,在一定程度上增加了安全性。
但对于测试人员来说,不管是进行性能测试还是自动化测试,都是一个比较棘手的问题。在WebDriver中并没有提供相应的方法来处理验证码,这里我就根据自己的经验来谈谈处理验证码的几种常见方法。
1.1 去掉验证码
这里最简单的方法,对于开发人员来说,只是把验证码相关的代码注释掉即可。如果是在测试环境,这样做可以省去测试人员不少的麻烦。但如果自动化脚本是在正式环境测试,那么这种做法就给系统带来了一定的风险。
1.2 设置万能验证码
去掉验证码的主要问题是安全,为了应对在线系统的安全威胁,可以在修改程序时不取消验证码,而在程序中留一个“后门”,即设置一个“万能验证码”。只要用户输入这个“万能验证码”,程序就认为验证通过,否则就判断用户输入的验证码是否正确。
设计万能验证码的方式非常简单,只需要对用户的输入信息多加一个逻辑判断,下面通过例子演示。
from random import randint #生成一个1000到9999之间的随机整数
verify = randint(1000,9999)
print(u"生成的随机数:%d" %verify) number = input("请输入随机数:")
print(number)
number = int(number) if number == verify:
print("登录成功!!")
elif number == 123456:
print("登录成功!!")
else:
print("验证码输入有误!")
randint()用于生成随机数,设置随机数的范围为1000-9999之间。运行程序分别输入正确的验证码、万能验证码和错误的验证码。就会发现,只要输入了万能验证码,无论生成的是什么数字,都可以通过验证。
1.3 验证码识别技术
可以通过Python-tesseract来识别图片验证码。Python-tesseract是光学字符识别Tesseract OCR引擎的Python封装类,能够读取如何常规的图片文件(JPG、GIF、PNG、TIFF等)。不过目前市面上的验证码形式繁多,大多验证码识别技术的识别率都很难达到100%。但是现在出现了很多的OCR,例如百度云OCR、微软Azure图像识别、有道智云文字识别、阿里云图文识别、腾讯OCR文字识别等太多的识别技术了。然而我们公司的自动化开发并不使用验证码识别技术,我们公司又更多千奇百怪的过验证码技术,但是在文章里不好描述,就说下常用的一种吧,通过爬虫爬取验证码文件,将验证码通过统一处理,开发的在进行自动化的时候,读取到随机生成的验证码的文件信息,与公司的验证码的信息进行对比,匹配到信息相同的,就输入对应的验证码。
1.4 记录cookie
通过向浏览器中添加cookie可以绕过登录的验证码,这里比较有意思的一种解决方案。例如我们第一次登录某网站时勾选的“记住密码”的选项,当下次访问该网站时自动就处于登录状态了。这样自然就绕过了验证码问题。这个“记住密码”的功能其实就是记录在了浏览器的cookie中。前面已经学了通过WebDriver来操作浏览器的cookie,可以通过add_cookie()方法将用户名密码写入浏览器cookie,当再次访问网站时服务器将直接读取浏览器的cookie进行登录。
#访问XX网站
wd.get("http://www.xx.com") #将用户名密码写入浏览器cookie
wd.add_cookie({'name':'Login_UserNumber','value':'username'})
wd.add_cookie({'name':'Login_Passwd','value':'password'}) #再次访问XX网站,将会自动登录
wd.get("http://www.xx.com")
这种方式最大的问题是如何从浏览器的cookie中找到用户名和密码对应的key值,并处输入对应的登录信息。可以用get_cookies()方法来换取登录的所有cookie信息,从中找到用户名和密码的key。当然,更直接的方式是询问开发人员。
2. WebDriver原理
WebDriver是按照Server-Client的节点设计模式设计的。
Server端就是Remote Server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是Remote Server,它的职责就是等待Client发送请求并作出响应。
Client端简单说来就是我们的测试代码。我们测试代码中的一些行为,例如打开浏览器,跳转到特定的URL等操作是以http请求的方式发送给被测试浏览器的,也就是Remote Server。Remote Server接受请求,执行相应操作,并在Response中返回执行状态、返回值等信息。
WebDriver的工作流程:
WebDriver启动目标浏览器,并绑定到指定端口。启动的浏览器实例将作为WebDriver的Remote Server。
Client端通过CommandExcuter发送HTTPRequest给Remote Server的监听端口(通信协议:the webriver wire protocol)
Remote Server需要依赖原生的浏览器组件(如IEDriverServer.exe、chromedriver.exe)来转化浏览器的native调用。
Python提供了logging模块给运行中的应用提供了一个标准的信息输出接口。它提供了basicConfig()方法用于基本信息的定义。开启debug模块,就可以捕捉到客户端向服务器发送的请求。
from selenium import webdriver
import logging logging.basicConfig(level=logging.DEBUG)
wd = webdriver.Chrome() wd.get('https://www.baidu.com') wd.find_element_by_id("kw").send_keys("selenium")
wd.find_element_by_id("su").click()
basicConfig()所捕捉的log信息。不过basicConfig()开启的debug模式只能捕捉到客户端向服务器发送的POST请求,而无法获取服务器所返回的应答信息。我们在后面的章节中将会学会Selenium Server,通过Selenium Server可以获取到更详细的请求与应答信息。

Selenium(十三):验证码的处理、WebDriver原理的更多相关文章
- Selenium WebDriver原理(二):Selenium是如何操纵浏览器的?
前言 上一篇文章<selenium webdriver 是怎么运行的>用了一个简单的例子--搭出租车,形象地讲解selenium webdriver 是如何运行的,而这一篇文章可以理解为深 ...
- Selenium WebDriver原理
WebDriver原理 WebDriver是按照Server-Client的经典设计模式设计的. Server端就是RemoteServer,可以是任意的浏览器,当我们的脚本启动浏览器后,该浏览器就是 ...
- Selenium 2自动化测试实战24(webdriver原理)
一.webdriver原理 webdriver是按照Server-Client的经典设计模式设计的.Server端就是Remote Server,可以是任意的浏览器.当我们的脚本启动浏览器后,该浏览器 ...
- selenium-webdriver(python) (十四) -- webdriver原理
之前看乙醇视频中提到,selenium 的ruby 实现有一个小后门,在代码中加上$DEBUG=1 ,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据:觉得这个功能很强大,可以帮助理 ...
- selenium-webdriver(python) (十四) -- webdriver原理(转)
之前看乙醇视频中提到,selenium 的ruby 实现有一个小后门,在代码中加上$DEBUG=1 ,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据:觉得这个功能很强大,可以帮助理 ...
- selenium 参数设置-window.navigator.webdriver
selenium 参数设置 selenium启动chrome基本上与真实环境类似,但有一些变量还是不一样,需要注意. 有些网站通过这些参数识别爬虫. window.navigator.webdrive ...
- webdriver原理及操作
webdriver原理: 1. WebDriver 启动目标浏览器,并绑定到指定端口.该启动的浏览器实例,做为 webdriver 的 remote server. 2. Client 端通过 Com ...
- Selenium WebDriver原理(一):Selenium WebDriver 是怎么工作的?
首先我们来看一个经典的例子: 搭出租车 在出租车驾驶中,通常有3个角色: 乘客 : 他告诉出租车司机他想去哪里以及如何到达那里 对出租车司机说: 1.去阳光棕榈园东门 2.从这里转左 3.然后直行 2 ...
- python+selenium十三:破解简单的图形验证码
此方法可破解简单的验证码,如: 注:中文识别正在寻找办法 安装: 1.python3 2.Pillow 3.pytesseract 4.tesseract-ocr 下载地址:https://pa ...
随机推荐
- Winform 中DataGridView、dev Gridview控件添加行标题
有很多种方法. 1.可以在DataGridView控件中的RowStateChanged事件改变行标题单元格的值(Row.HeaderCell.Value) /// <summary> / ...
- Caffe源码-Net类(下)
net.cpp部分源码 // 接着上一篇博客的介绍,此部分为Net类中前向反向计算函数,以及一些与HDF5文件或proto文件相互转换的函数. template <typename Dtype& ...
- Mysql服务彪高排查方式及索引的正确使用步骤
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/12af580d-1 ...
- tp5.1 无限极分类前台展示
商城前台的多级分类展示,如图所示,一般是三级.所以代码只组装到第三级. 数据库设计,共5个字段.level字段是方便用来显示级别的.pid是父级分类id,pid等于0说明它是一级分类.path字段,举 ...
- ANSIBLE安装和常用模块模块使用详细教程
目录 ANSIBLE安装和各种模块应用功能 安装配置ANSIBLE ANSIBLE使用 ansible-galaxy工具 ansible-pull工具 ansible-playbook ansible ...
- Android进程管理机制研究
一.Linux中的进程管理在Linux中,进程是指处理器上执行的一个实例,可使用任意资源以便完成它的任务,具体的进程管理,是通过“进程描述符”来完成的,对应Linux内核中的task_struct数据 ...
- YII2中andWhere多个or查询
使用多个or的复杂查询: AND ((`name`='张三') OR (`name`='李四') OR (`name`='王五')) // AND ((`name`='张三') OR (`name`= ...
- Jenkins使用SSH构建Go项目并执行
目录 下载插件 配置要部署的服务器 构建项目 Jenkinx可以帮助我们通过SSH插件,将项目直接部署到指定的服务器. 下载插件 (1)点击左侧的"系统管理"菜单 ,然后点击 (2 ...
- WPF 3D Cube及点击交互
在WPF中构建一个简单的立方体比较容易实现,可参考资料也比较众多.比较麻烦的是处理点击交互. 我在WPF中用两种方式实现了3DCube,效果图如下: 方式一: 最常见的3D内容构建模式,结构如下图. ...
- Analyze Data 分析数据
In this lesson, you will learn how to add the Analysis functionality to your application. For this p ...