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的工作流程:
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可以获取到更详细的请求与应答信息。