测试老宅男扶摇

导航

Selenium4Web自动化6-验证码处理

一、 验证码问题

图片验证码(Captcha)问题在自动化测试中是一个很常见的问题,也是一个很棘手的问题。图片验证码设计的初衷其实就是为了防自动化,防止一些人利用自动工具恶意攻击网站,而很不幸的是,我们所使用的一些自动化测试工具也包含在内。当然了,对付验证码也不是一点办法都没有,方法还是有很多的,只是我们需要跳出技术层面去思考问题。废话少说,先来看下几种常见的解决办法:

1、Debug模式启动浏览器(浏览器复用)(技术)--推荐

Selenium启动浏览器默认是会清除所有缓存的,所以系统如果有需要登陆验证的,每次全部都要验证一遍。
我们可以让Selenium直接用带有缓存的浏览器,就像我们使用本机浏览器一样,去访问系统。常规系统,比如淘宝、携程,只要完成一次登陆验证,后续登陆是不会再有验证码的。通过Debug模式启动谷歌浏览器,就能达到这个效果。
并且Debug模式的浏览器,还可以在自动化过程中实现复用浏览器来提高调试效率:
1).当运行 selenium 自动化时,要求已经登录才能才做。这个时候我们可以提前登录,运行脚本的时候复用已经打开的浏览器。
2).当调试了某个步骤很多的测试用例,前面N-1步已经成功,只需调试第N步。如果从头开始运行脚本,耗时过多,这时我们可以直接复用浏览器只操作第N步。
复用浏览器的特点:
webdriver启动时将不再创建新的浏览器窗口 将运用已打开的浏览器的当前页面,对元素的进行操作 。

2、识别法(技术)

识别法就是对验证码的图片进行字符识别,其原理就是通过识别算法解析图片,其解析的精准度取决于图片的复杂程度。
根据本人经验,如果图片中的字符方方正正的并且图片背景比较单调的话,那么OCR识别率会非常高。
但是对于一些复杂的图片:字体歪歪扭扭、字体颜色和图片背景很花哨、有故意干扰的曲直线、甚至包括计算等等,如果碰到这种情况,那么OCR识别率将非常低甚至无能为力。
我们可以看到,通过OCR这种技术来识别验证码图片中的字符不失为一种好的方法,但是它也有很多局限性,只适用于一些简单的图片。如果你的项目中的验证图片很复杂,果断放弃这种方法吧。

3、接口法(技术)

接口法就是让开发人员提供一个测试接口,通过这个接口可以获取到图片验证码。这种方法的具体实现又可以有很多种,比如在服务端提供一个可被客户端使用的接口,只要客户端传递过来自己的SessionID,该接口就返回此时正确的Session,这种方法就可以很容易地让自动测试工具直接获取到正确的应该提交的验证码内容;或者在网页中隐藏一个验证码内容的标签,通过读取这个网页标签内的值就可以轻松获取到验证码内容。
  增加了获取验证码的接口,势必会增加非常大的安全风险,所以这种方法只适合在测试环境使用。

4、移除法(非技术)

所谓移除法非常简单,就是把图片验证码的功能去掉,这是最省力的一种方法,但是需要开发人员的配合和领导的同意。但是需要注意的一点是这种方法也只适合在测试环境使用,软件产品上线时需要把图片验证码功能还原,否则会有巨大的安全隐患。

5、暗号法(非技术)

顾名思义,暗号法就是通过事先达成的一种秘密协议进行沟通,在这里是指让开发人员提供一个“万能验证码”,不论图片如何变化,只要输入万能验证码就能通过。但是这种方式同样会产生安全隐患,如果验证码被攻击者知道的话,所以这种方法也只适合在测试环境使用。

6、Cookie跳过验证码(技术)

不做登录操作,直接做后续请求,请求时带正常登录用户的可用cookie,那么是不需要登录就可以操作成功的,从而避免了验证。

二、Debug模式启动浏览器(浏览器复用)

1 Debug模式浏览器配置详解

1.1 浏览器路径问题

1)通常设置方式
找到浏览器的路径,配置到bat文件里头

2)浏览器路径中有空格或者中文或者特殊字符的设置方式
例如:C:\Program Files\Java

先配置浏览器路径到环境变量

然后在cmd中检查是否可以直接输入chrome.exe来打开浏览器
然后把bat文件中的路径删掉,改成如下:
chrome.exe --remote-debugging-port=9222

记得要重启pycharm,不然会提示chrome.exe 不是内部或外部命令。。。
PS:有同学只有C盘,会有文件无权限读取的情况发生,这个最好是分个D盘出来,不然解决比较麻烦

1.2 编码问题


使用bat文件控制台会输出一些乱马上,通过如下方式解决
File > settings > Editor > File Encodings > 将 Project Encoding 设置为 Gbk 即可
PS:其实乱码也没啥影响,改了编码会影响到其他工程的运行,建议不改

1.3 需要进行预登陆

因为我们这种操作,相当于直接用本机的浏览器去访问淘宝,因此预登陆后就可以绕过淘宝的诸多验证,只需要预登陆一次即可

1.4 以下报错信息不用管,用例可以正常执行

1.5 启动前,要关闭所有的谷歌浏览器

2 浏览器复用

通过debug模式浏览器实现在已打开的浏览器上继续运行自动化脚本调试
操作方式:
第一:注释掉打开浏览器的代码,让他不重新打开浏览器

# os.popen("d:/chrome.bat")

第二:把已经执行完的步骤注释掉

# driver.get("https://cart.taobao.com/cart.htm")
# 
# driver.find_element_by_id('fm-login-id').send_keys('19119282264')
# driver.find_element_by_id('fm-login-password').send_keys('cema6666..')
# driver.find_element_by_xpath("//div[@class='fm-btn']").click()

第三:浏览器复用模式下:如果需要切换窗口,需要特殊处理
1.在页面上,点击回到第一个窗口
2.运行窗口切换代码

三、Cookie跳过验证码

首先获取网站登陆后的cookie,然后通过添加cookie的方式,实现网站登陆的目的。我们用cook来表示xxxxxx的登录后的cookie。

from selenium import webdriver
import time
 
driver = webdriver.Chrome()
driver.get("http://www.xxxxxx.com/") # 要登陆的网站
 
# 这里添加cookie,有时cookie可能会有多条,需要添加多次
driver.add_cookie({'name':'userClientMarkKey','value':'d59bc6a8eafc4b4bbcaaec0bf175fcf4'}) 
driver.add_cookie({'name':'Hm_lpvt_ecc8b50a3122e6d5e09be7a9e5383e07','value':'1663318495'})

time.sleep(3)
 
# 刷新下页面就可以看到登陆成功了
driver.refresh(

注意:
登录时有勾选下次自动登录的请勾选,浏览器提示是否保存用户密码时请选择确定,这样获取的cookie成功登陆的机率比较高

cookie获取方法

利用开发者工具,编辑修改。F12打开开发者工具--->Application--->cookies,对对应的值进行查看、编辑、修改

四、JS处理方案

滑动解锁问题
使用ActionChains功能,用鼠标按住滑块并移动

ActionChains(driver)\
    .click_and_hold(slider_button)\
    .move_by_offset(delta_x,0)\
    .perform()

练习网站:https://layuion.com/demo/slider.html

五、OpenCV 图像预处理:灰度化和二值化

PS:简单来说,要做图像文本识别,一般会将图片预处理成黑白的

1 图像二值化基本原理:

对灰度图像进行处理,设定阈值,在阈值中的像素值将变为1(白色部分),阈值为的将变为0(黑色部分)。

2 图像二值化处理步骤:

(1)先对彩色图像进行去噪

//img为原图
cv.pyrMeanShiftFiltering(image, 10, 100)

(2)先对彩色图像进行灰度化

//img为原图,imgGray为灰度图
cvtColor(img, imgGray);

(3)对灰度图进行二值化

//imgGray为灰度图,result为二值图像
//100~255为阈值,可以根据情况设定
//在阈值中的像素点将变为0(白色部分),阈值之外的像素将变为1(黑色部分)。
threshold(imgGray, result, 100, 255, CV_THRESH_BINARY)

六、OCR图像识别

1 OCR原理

(Optical Character Recognition,光学字符识别)技术,将图片、照片上的文字内容,直接转换为文本。opencv不自带ocr,即使从cv4.4以后的external中包含cv::text识别文字,也需要用户先预装tesseract。

# 使用opencv读取图像(cv.imread)之后是BGR格式的,使用PIL读取图像(Image.open))之后是RGB格式的。
image = Image.open(file_name)
# 运行tesseract对图片进行OCR识别
img_str = pytesseract.image_to_string(image)

2 安装

需要安装的包:
(1)CV2
注意:下面这个包,实际安装的是cv2,pycharm自动装是装不了的,必须使用下面命令
pip install opencv_python
(2)pytesseract
pip install pytesseract
(3)需要安装一个软件,并配置环境变量:
安装软件tesseract-ocr
软件下载地址,下载最新的,根据操作系统选择:
https://digi.bib.uni-mannheim.de/tesseract/

在D盘建立文件夹Tesseract-OCR,于该目录下解压,安装到电脑。
配置环境变量
①右键“此电脑”——设置——高级系统设置——环境变量——系统变量---path---编辑——新建,写入Tesseract文件的路径,配置环境变量——确定保存
或②win+R,输入“sysdm.cpl”,回车,打开环境变量面板

编辑环境变量

posted on 2022-10-24 15:06  测试老宅男扶摇  阅读(564)  评论(0编辑  收藏  举报