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

有以下几个步骤:

目录

一、得到验证码图片

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. Simple WPF: WPF 自定义按钮外形

    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园. WPF的按钮提供了Template模板,可以通过修改Template模板中的内容对按钮的样式进行自定义,完整代码Github自取. ...

  2. SpringBoot可视化接口开发工具magic-api

    magic-api简介 magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller.Service ...

  3. Maven的依赖详解和打包方式

    设置maven maven下载与安装教程: https://blog.csdn.net/YOL888666/article/details/122008374 1. 在File->setting ...

  4. 谈谈你对 Vue 生命周期的理解?

    生命周期是什么? Vue 实例有一个完整的生命周期,也就是从 开始创建.初始化数据.编译模版.挂载 Dom -> 渲染.更新 -> 渲染.卸载等一系列过程,我们称这是 Vue 的生命周期. ...

  5. Mac下安装Redis,附可视化工具Medis

    导读 我之前写过很多相关的redis的博文,有时候,为了开发,还得去虚拟机上搭建一个redis,感觉太麻烦了,为了做个demo,直接在自己mac本上安装一个即可. Redis 从入门到精通:点我直达 ...

  6. Mybatis下划线自动映射驼峰字段

    mybatis-config.xml <!--下划线自动映射驼峰字段--> <settings> <setting name="mapUnderscoreToC ...

  7. 硬核案例分享,一文带你拆解PHP语言体系下的容器化改造

    本文分享自华为云社区<PHP语言体系下的容器化改造,助力夺冠集团应用现代化>,作者: HuaweiCloudDeveloper. 1.摘要 本文主要介绍了PHP语言体系应用现代化改造上云的 ...

  8. Java-文件下载案例

    文件下载需求 1.页面显示超链接 2.点击超链接后弹出下载框 3.完成图片文件下载 分析 1.超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框.不满足需求 2.任 ...

  9. C#委托的2种调用方式

    第一种:直接调用,通过invoke方法: 第二种:这是第二种将委托作为方法的参数的间接调用: 下面举个栗子演示: using System; using System.Collections.Gene ...

  10. 【java深入学习第2章】Spring Boot 结合 Screw:高效生成数据库设计文档之道

    在开发过程中,数据库设计文档是非常重要的,它可以帮助开发者理解数据库结构,方便后续的维护和扩展.手动编写数据库设计文档不仅耗时,而且容易出错.幸运的是,可以使用Spring Boot和Screw来自动 ...