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

最新文章

  1. 如何用命令检查Linux服务器性能
  2. java 类的静态变量
  3. SQL Server中DateTime与DateTime2的区别
  4. bnuoj 4207 台风(模拟题)
  5. 全世界只有我们Erlang程序员是正确的
  6. C语言学习之笔记
  7. 源代码版本控制工具TortoiseSVN,AnkhSVN最新版本下载地址
  8. Mayor's posters问题处理
  9. redis php sort 函数
  10. 进程间通信系列 之 socket套接字及其实例
  11. vuex所有核心概念完整解析State Getters Mutations Actions
  12. 为什么MOBA、“吃鸡”游戏不推荐用tcp协议——实测数据
  13. swift class的缺省基类(SwiftObject)与内存模型
  14. 一个死循环导致的栈溢出实例:StackOverFlowError
  15. Gym - 101911C Bacteria (规律题)
  16. HDU - 5658
  17. 基于FPGA的I2C读写EEPROM
  18. Android免费短信验证
  19. Javascript和OCX的结合历程
  20. Android targetSdkVersion 原理

热门文章

  1. 《Java知识应用》Java压缩文件和解压缩
  2. python基础知识第七篇(练习)
  3. Spark Streaming vs. Structured Streaming
  4. C#线程学习笔记三:线程池中的I/O线程
  5. JS基础语法---函数作为返回值使用
  6. Hack the Breach 2.1 VM (CTF Challenge)
  7. 百度大脑UNIT3.0详解之知识图谱与对话
  8. Hyperledger Fabric私有数据
  9. JavaScript Map 和 Set
  10. C#中转换运算符explicit、implicit、operator、volatile研究