【Python】Selenium自动化测试之滑块拼图验证码图片方法

在项目中有时验证码是滑块拼图形式的,这种验证码该如何完成验证呢?
有以下几个步骤:
目录
一、得到验证码图片
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破解滑块验证码最新版!》***
②YKenan《Python 爬虫 Selenium 中滑动验证码》*****
③上海-悠悠《selenium+python自动化101-execute_script 方法获取 JavaScript 返回值》
④YungGuo《python+selenium使用ActionChains类move_by_offset拖动鼠标重复执行位移问题》
⑤weixin_39792393《python 捕捉键盘esc事件_Python+Selenium自动化测试 4. ActionChains鼠标,键盘事件》
【Python】Selenium自动化测试之滑块拼图验证码图片方法的更多相关文章
- Python+Selenium自动化-设置等待三种等待方法
Python+Selenium自动化-设置等待三种等待方法 如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...
- python selenium自动化测试之路(1)--分层测试概念、selenium工具介绍
1.分层自动化测试概念 传统的自动化市场更关注产品UI层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段都需要自动化测试 大多公司与研发团队其实是忽略了单元测试与集成测试阶段的自动化测试工作,所 ...
- Python+selenium自动化测试之浏览器基础操作
**前言** 本文主要讲解webdriber框架,Selenium 就像真实用户所做的一样,Selenium 测试可以在 Windows.Linux 和 Macintosh上的 Internet ...
- Python&Selenium自动化测试之PO设计模式
一.摘要 Page Object模式,后面简称PO,他是一种设计思想,在上一章节中,曾经列举了一些在编写自动化测试过程中随着代码量的增加导致的大量代码难以维护.难以扩展.可读性极差等灾难性的事件:那么 ...
- python+selenium自动化测试之登录
selenium_login.py import unittest from selenium import webdriver class LoginTest(unittest.TestCase): ...
- python3 使用OpenCV计算滑块拼图验证码缺口位置
前言 滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到 环境准备 pip 安装 opencv-python pip insta ...
- python selenium自动化点击页面链接测试
python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...
- selenium自动化测试之整合测试报告
selenium自动化测试之整合测试报告 标签(空格分隔): 整合报告 如下截图我们添加一个文件叫做:latest_report.py文件, import time import os import ...
- Selenium自动化测试之结果处理
Selenium自动化测试之结果处理 一.断言 断言相当于性能测试中的检查点,常用断言种类很多,具体可以查看断言API:判断预期结果和实际结果是否一致,断言成功,程序继续处理,失败则终止运行,示例如下 ...
- Selenium自动化测试之数据驱动及用例管理
Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:
随机推荐
- 嵌入式测试手册——基于NXP iMX6ULL开发板(2)
基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成.核心板经过专业的PCB Layout ...
- c语言之位段
百度百科链接 示例: 1 struct CHAR 2 { 3 unsigned int ch : 8; //8位 4 unsigned int font : 6; //6位 5 unsigned in ...
- Docker下安装Nginx代理服务器【工作实操版】
一.Nginx下载 使用命令拉取nginx镜像到本地,此处我们获取排名第一的是官方最新镜像,其它版本可以去DockerHub查询 docker pull nginx 二.先启动一个nginx容器用于c ...
- 宇宙最强开发工具VScode快速搭建前后端分离环境【VUE+Springboot】
VS Code 的全称是 Visual Studio Code,是一款开源的.免费的.跨平台的.高性能的.轻量级的代码编辑器.它在性能.语言支持.开源社区方面,都做得很不错,是这两年非常热门的一款开发 ...
- 统计里面PV 和 UV代表什么意思
1.网站流量bai统计中"PV"它所代表的意思是访问量了,具体指的du就是网站zhi的页面点击量或是浏览量,亦或是页面的刷新量dao了,网站的页面每刷新一次,就统计一个" ...
- django python 循环一个月的每一天
from datetime import datetime, timedelta def get_dates_in_month(year, month): start_date = datetime( ...
- [oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs
编码进化 回忆上次内容 上次 我们回顾了 电子游戏的历史 从 电子游戏鼻祖 双人网球 到 视频游戏 PingPong 再到 街机游戏 Pong 雅达利 公司 来了 嬉皮士 捣乱? 布什内尔 会如何 应 ...
- C#:只支持GET和POST方法的浏览器,如何发送PUT/DELETE请求?RESTful WebAPI如何响应?
理想的RESTful WebAPI采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环境 ...
- 基于树莓派的OpenWrt系统打开蓝牙功能
在树莓派设备上的OpenWrt系统打开蓝牙功能 1. 安装必要的软件包 首先,你需要确保OpenWrt系统上安装了必要的蓝牙软件包.你可以通过OpenWrt的包管理器来安装它们.在OpenWrt系统上 ...
- 空间反演对称性 (Spatial Inversion Symmetry) 和非线性响应 (Non-linear Response)
我们定义一次宇称变换 (parity transformation) 为反转所有坐标: \[\mathcal{P}: \begin{pmatrix} x \\ y \\ z \end{pmatrix} ...
