1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

python自动化测试之破解滑动验证码

本文将详细介绍python在自动化测试中的应用,包括自动化测试、代码和破解滑动验证码。在Web自动化测试中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证。遇到验证码,一般我们可以找开发帮忙解决,关闭验证码,或者给一个万能的验证码。但是如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的!

python自动化测试之破解滑动验证码

滑动验证破解思路

关于滑动验证码破解的思路大体上来讲分为以下两个步骤:1、获取滑块滑动的距离。2、模拟拖动滑块,通过验证。对于这种滑动的验证码,滑块和缺口背景都是分别是一张独立的图片,我们可以把这两张图片下载下来,借助于图像识别的技术,去识别缺口在背景图中的位置,然后减去滑块当前所在位置,就可以得出需要滑动的距离。

案例讲解

下面以QQ空间登录为例,演示如何完成滑动验证码的破解:

  1. 创建一个driver对象,访问qq登录页面。
  2. 输入账号密码。
  3. 点击登录。
  4. 模拟滑动验证。

具体实现代码如下:

import time
from selenium import webdriver
from slideVerfication import SlideVerificationCode

#1、创建一个driver对象,访问qq登录页面
browser=webdriver.Chrome()
browser.get("https://qzone.qq.com/")

#2、输入账号密码
#2.0点击切换到登录的iframe
browser.switch_to.frame('login_frame')
#2.1点击账号密码登录
browser.find_element_by_id('switcher_plogin').click()
#2.2定位账号输入框,输入账号
browser.find_element_by_id("u").send_keys("123456")
#2.3定位密码输入输入密码
browser.find_element_by_id("p").send_keys("PYTHON")

#3、点击登录
browser.find_element_by_id('login_button').click()
time.sleep(3)

#4、模拟滑动验证
#4.1切换到滑动验证码的iframe中
tcaptcha=browser.find_element_by_id("tcaptcha_iframe")
browser.switch_to.frame(tcaptcha)
#4.2获取滑动相关的元素
#选择拖动滑块的节点
slide_element=browser.find_element_by_id('tcaptcha_drag_thumb')
#获取滑块图片的节点
slideBlock_ele=browser.find_element_by_id('slideBlock')
#获取缺口背景图片节点
slideBg=browser.find_element_by_id('slideBg')
#4.3计算滑动距离
sc=SlideVerificationCode(save_image=True)
distance=sc.get_element_slide_distance(slideBlock_ele,slideBg)
#滑动距离误差校正,滑动距离*图片在网页上显示的缩放比-滑块相对的初始位置
distance=distance*(280/680)-22
print("校正后的滑动距离",distance)
#4.4、进行滑动
sc.slide_verification(browser,slide_element,distance=100)

运行效果如图所示:

python自动化测试之破解滑动验证码

图像识别部分使用opencv-python进行识别,核心代码如下:

def get_element_slide_distance(self,slider_ele,background_ele,correct=0):
"""
根据传入滑块,和背景的节点,计算滑块的距离
该方法只能计算滑块和背景图都是一张完整图片的场景,
如果背景图是通过多张小图拼接起来的背景图,
该方法不适用,请使用get_image_slide_distance这个方法
:param slider_ele:滑块图片的节点
:type slider_ele:WebElement
:param background_ele:背景图的节点
:type background_ele:WebElement
:param correct:滑块缺口截图的修正值,默认为0,调试截图是否正确的情况下才会用
:type:int
:return:背景图缺口位置的X轴坐标位置(缺口图片左边界位置)
"""
#获取验证码的图片
slider_url=slider_ele.get_attribute("src")
background_url=background_ele.get_attribute("src")
#下载验证码背景图,滑动图片
slider="slider.jpg"
background="background.jpg"
self.onload_save_img(slider_url,slider)
self.onload_save_img(background_url,background)
#读取进行色度图片,转换为numpy中的数组类型数据,
slider_pic=cv2.imread(slider,0)
background_pic=cv2.imread(background,0)
#获取缺口图数组的形状-->缺口图的宽和高
width,height=slider_pic.shape[::-1]
#将处理之后的图片另存
slider01="slider01.jpg"
background_01="background01.jpg"
cv2.imwrite(background_01,background_pic)
cv2.imwrite(slider01,slider_pic)
#读取另存的滑块图
slider_pic=cv2

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/7137.html