Selenium(十三):验证码的处理、WebDriver原理

1. 验证码的处理

对于Web应用来讲,大部分的系统在用户登陆时都要求用户输入验证码。验证码的类型不少,有字母数字的、有汉字的,甚至还须要用户输入一道算术题的答案的。对于系统来讲,使用验证码能够有效地防止采用机器猜想方法对口令的刺探,在必定程度上增长了安全性。web

但对于测试人员来讲,无论是进行性能测试仍是自动化测试,都是一个比较棘手的问题。在WebDriver中并无提供相应的方法来处理验证码,这里我就根据本身的经验来谈谈处理验证码的几种常见方法。chrome

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文字识别等太多的识别技术了。然而咱们公司的自动化开发并不使用验证码识别技术,咱们公司又更多千奇百怪的过验证码技术,可是在文章里很差描述,就说下经常使用的一种吧,经过爬虫爬取验证码文件,将验证码经过统一处理,开发的在进行自动化的时候,读取到随机生成的验证码的文件信息,与公司的验证码的信息进行对比,匹配到信息相同的,就输入对应的验证码。cookie

1.4 记录cookie

经过向浏览器中添加cookie能够绕过登陆的验证码,这里比较有意思的一种解决方案。例如咱们第一次登陆某网站时勾选的“记住密码”的选项,当下次访问该网站时自动就处于登陆状态了。这样天然就绕过了验证码问题。这个“记住密码”的功能其实就是记录在了浏览器的cookie中。前面已经学了经过WebDriver来操做浏览器的cookie,能够经过add_cookie()方法将用户名密码写入浏览器cookie,当再次访问网站时服务器将直接读取浏览器的cookie进行登陆。dom

#访问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能够获取到更详细的请求与应答信息。

相关文章
相关标签/搜索