在项目中有时验证码是滑块拼图形式的,这种验证码该如何完成验证呢?

有以下几个步骤:

目录

一、得到验证码图片

1、思路

  • 获取完整图片和缺口图片的base64数据
  • 转换base64数据为图片

2、实践方法

封装

    def get_images(self):
"""第一步:得到验证码图片base64数据""" # 得到完整的图片base64数据,"return"必须加上
full_js = "return document.getElementsByTagName('img')[0].src"
full_image = self.executeScript(full_js, loc=None)
# 得到缺口的图片base64数据
gap_js = "return document.getElementsByTagName('img')[1].src"
gap_image = self.executeScript(gap_js, loc=None)
# 设置保存路径
base_path = fun().upPath() + "/data/image"
full_path = base_path + "/full_image.png"
gap_path = base_path + "/gap_image.png"
# 转换
self.base64_to_image(full_image, full_path)
self.base64_to_image(gap_image, gap_path)
# 返回路径
return full_path, gap_path def base64_to_image(self,base64_str , image_path=None):
"""在第一步里:base64转化为image""" base64_data = re.sub('^data:image/.+;base64,', '', base64_str)
byte_data = base64.b64decode(base64_data)
image_data = BytesIO(byte_data)
img = Image.open(image_data)
if image_path:
img.save(image_path)
return img

完整的图片:full_image.png

缺口的图片:gap_image.png

二、匹配缺口照片在完整照片的位置  返回目录

1、思路

  • 读取完整图片和缺口图片信息
  • 匹配缺口照片在完整照片的位置

2、实践方法

封装

    def match_gaps(self, full, gap):
"""第二步:匹配缺口照片在完整照片的位置""" # 读取图片文件信息
img_full = cv2.imread(full)
# 以灰度模式加载图片
template = cv2.imread(gap)
# 方法
methods = [cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF_NORMED]
# 记录每个方法的距离
left = []
# 最接近值
min_ = []
for method in methods:
# 匹配
res = cv2.matchTemplate(img_full, template, method)
# 获取相关内容
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
if method == cv2.TM_SQDIFF_NORMED:
min_.append(min_val - 0.0)
left.append(min_loc[0])
else:
min_.append(1.0 - max_val)
left.append(max_loc[0])
index = min_.index(numpy.min(min_))
print("选用第{:d}个方法, 差为:{:f},距离为:{:d}".format(index+1, min_[index], left[index]))
return left[index]

三、机器模拟人工滑动轨迹  返回目录

1、思路

  • 滑块移动轨迹
  • 机器模拟人工滑动轨迹

2、实践方法

封装

    def sliding_track(self, distance):
"""第三步:机器模拟人工滑动轨迹""" # 按住按钮
self.click_and_hold(loc.verifyButton_loc)
# 获取轨迹
track = self.get_track(distance)
print(f"获取轨迹:{track}")
print("++++++++++++++++++++++++++++++++++++++++++++")
for t in track:
self.move_by_offset(t)
self.move_by_offset(5)
self.move_by_offset(-5)
# 松开按钮
self.release() def get_track(self, distance):
"""在第三步里:滑块移动轨迹"""
track = []
current = 0
# 阈值
mid = distance * 3 / 4
t = random.randint(5, 6) / 10
v = 0
while current < distance:
if current < mid:
a = 6
else:
a = -7
v0 = v
v = v0 + a * t
move = v0 * t + 3 / 4 * a * t * t
current += move
track.append(round(move))
return track

四、判断拼图是否存在  返回目录

1、思路

  • 判断拼图是否存在
  • 存在的话返回true

2、实践方法

封装

    def judgeBox(self):
"""第四步:判断拼图是否存在""" box_js = "return document.getElementsByClassName('verifybox')"
box_is = self.executeScript(box_js, loc=None)
return len(box_is) > 0

五、滑块拼图递归循环调用  返回目录

1、思路

  • 判断拼图存在的话重新再执行以上方法

2、实践方法

封装

    def loop(self):
"""第五步:滑块拼图递归循环调用""" # 得到验证码图片
full_img_path, gap_img_path = self.get_images()
# 匹配缺口照片在完整照片的位置
number = self.match_gaps(full_img_path, gap_img_path)
print(f"缺口照片的位置为:{number}")
# 机器模拟人工滑动轨迹
self.sliding_track(number)
if self.judgeBox():
self.loop()

滑动结果:

虽然现在能达到模拟人工进行滑动模块,但是成功率不是很高!

六、附录  返回目录

爬遍天下无敌手Python Selenium破解滑块验证码最新版!》***

YKenanPython 爬虫 Selenium 中滑动验证码》*****

上海-悠悠selenium+python自动化101-execute_script 方法获取 JavaScript 返回值

YungGuopython+selenium使用ActionChains类move_by_offset拖动鼠标重复执行位移问题

weixin_39792393python 捕捉键盘esc事件_Python+Selenium自动化测试 4. ActionChains鼠标,键盘事件

【Python】Selenium自动化测试之滑块拼图验证码图片方法的更多相关文章

  1. Python+Selenium自动化-设置等待三种等待方法

    Python+Selenium自动化-设置等待三种等待方法   如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...

  2. python selenium自动化测试之路(1)--分层测试概念、selenium工具介绍

    1.分层自动化测试概念 传统的自动化市场更关注产品UI层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段都需要自动化测试 大多公司与研发团队其实是忽略了单元测试与集成测试阶段的自动化测试工作,所 ...

  3. Python+selenium自动化测试之浏览器基础操作

    **​​前言** 本文主要讲解webdriber框架,Selenium 就像真实用户所做的一样,Selenium 测试可以在 Windows.Linux 和 Macintosh上的 Internet ...

  4. Python&Selenium自动化测试之PO设计模式

    一.摘要 Page Object模式,后面简称PO,他是一种设计思想,在上一章节中,曾经列举了一些在编写自动化测试过程中随着代码量的增加导致的大量代码难以维护.难以扩展.可读性极差等灾难性的事件:那么 ...

  5. python+selenium自动化测试之登录

    selenium_login.py import unittest from selenium import webdriver class LoginTest(unittest.TestCase): ...

  6. python3 使用OpenCV计算滑块拼图验证码缺口位置

    前言 滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到 环境准备 pip 安装 opencv-python pip insta ...

  7. python selenium自动化点击页面链接测试

    python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...

  8. selenium自动化测试之整合测试报告

    selenium自动化测试之整合测试报告 标签(空格分隔): 整合报告 如下截图我们添加一个文件叫做:latest_report.py文件, import time import os import ...

  9. Selenium自动化测试之结果处理

    Selenium自动化测试之结果处理 一.断言 断言相当于性能测试中的检查点,常用断言种类很多,具体可以查看断言API:判断预期结果和实际结果是否一致,断言成功,程序继续处理,失败则终止运行,示例如下 ...

  10. Selenium自动化测试之数据驱动及用例管理

    Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:

随机推荐

  1. 嵌入式ARM端测试手册——全志T3+Logos FPGA评估板(下)

    前 言 本指导文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境:Ubuntu18.04.4 64bit 虚拟机:VMwa ...

  2. jsp---------------------复选框,全选按钮

    js部分:注意:<script type="text/javascript" ></script>内不能有其他内容,否则会无效,若有则另起一对<scr ...

  3. Node.js中的模块

    CommonJS模块 CommonJS是一种规范,它定义了JavaScript 在服务端运行所必备的基础能力,比如:模块化.IO.进程管理等.其中,模块化方案影响深远,其对模块的定义如下: 1,模块引 ...

  4. 开发一个微信小程序流程及需要多少费用?

    流程如下: 小程序是一种新的开放能力,开发者可以快速地开发一个小程序.小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 开放注册范围:个人 企业 政府 媒体 其他组织 1.注册 在微信公 ...

  5. jQuery -- 手稿

  6. 在Winform程序中增加隐藏的按键处理,用于处理一些特殊的界面显示或者系统初始化操作

    以前,我看到一个朋友在对一个系统做初始化的时候,通过一组魔幻般的按键,调出来一个隐藏的系统设置界面,这个界面在常规的菜单或者工具栏是看不到的,因为它是一个后台设置的关键界面,不公开,同时避免常规用户的 ...

  7. 面向对象VS面向过程

    什么是面向对象呢? 对于接触或者熟悉一些编程知识的同学来讲,"面向对象"这个词儿一点儿也不陌生.经常听说XX语言是完全面向对象的编程语言,比如C#.Java这些便是完全面向对象的编 ...

  8. influxdb得导出与导入

    转载请注明出处: 1.备份元数据 基本语法: influxd backup <path-to-backup> 备份元数据,没有任何其他参数,备份将只转移当前状态的系统元数据到path-to ...

  9. API网关实践-网易云轻舟微服务

    微服务最佳实践中,我们需要通过统一的 API 网关进行服务能力的共享,API 网关为用户提供发布.管理.保护和监控 API的能力,帮助用户在自己的多个系统之间,或者内部系统与合作伙伴以及第三方的系统之 ...

  10. 【漏洞分析】DoughFina 攻击事件分析:不做任何参数检查的去杠杆合约

    背景介绍 2024 年 7 月 12 日,DoughFina 协议遭受了黑客攻击,造成本次攻击的主要原因是 ConnectorDeleverageParaswap 合约没有对输入参数进行检查,且该合约 ...