Web自动化测试之滑动验证码的解决方案

news2024/12/23 23:28:30

 

目录

滑动验证破解思路

案例讲解

实现代码

运行效果:

根据传入滑块,和背景的节点,计算滑块的距离

滑动滑块进行验证

总结:


 在Web自动化测试的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证。 一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码! 那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢? 答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码!

滑动验证破解思路

关于滑动验证码破解的思路大体上来讲就是以下两个步骤:

1、获取滑块滑动的距离

2、模拟拖动滑块,通过验证。

关于这种滑动的验证码,滑块和缺口背景都是分别是一张独立的图片,我们可以把这两张图片,

下载下来借助于图像识别的技术,去识别缺口在背景图中的位置,然后减去滑块当前所在位置,就可以得出需要滑动的距离。

               

 

案例讲解

话不多说,我们先来看一个案例(QQ 空间登录),QQ 空间登录案例实现步骤如下:

1、创建一个driver对象,访问qq登录页面 

2、输入账号密码 

3、点击登录 

4、模拟滑动验证 

实现代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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)<br><br><br>

  

运行效果:

其实关于这个模块图像识别,是借助了第三方的图像处理模块来进行识别的,python 中有很多现成的用来处理图片的库,本文使用的是 opencv-python 来进行识别的。slideVerfication 模块上面用到的两个方法的部分参考代码如下:

根据传入滑块,和背景的节点,计算滑块的距离

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

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.imread(slider01)

    # 进行色彩转换

    slider_pic = cv2.cvtColor(slider_pic, cv2.COLOR_BGR2GRAY)

    # 获取色差的绝对值

    slider_pic = abs(255 - slider_pic)

    # 保存图片

    cv2.imwrite(slider01, slider_pic)

    # 读取滑块

    slider_pic = cv2.imread(slider01)

    # 读取背景图

    background_pic = cv2.imread(background_01)

    # 比较两张图的重叠区域

    result = cv2.matchTemplate(slider_pic, background_pic, cv2.TM_CCOEFF_NORMED)

    # 获取图片的缺口位置

    top, left = np.unravel_index(result.argmax(), result.shape)

    # 背景图中的图片缺口坐标位置

    print("当前滑块的缺口位置:", (left, top, left + width, top + height))

    return left<br><br>

 

滑动滑块进行验证

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

def slide_verification(self, driver, slide_element, distance):

    """

    滑动滑块进行验证

   

    :param driver: driver对象

    :type driver:webdriver.Chrome

    :param slide_element: 滑块的元组

    :type slider_ele: WebElement

    :param distance:  滑动的距离

    :type: int

    :return:

    """

    # 获取滑动前页面的url地址

    start_url = driver.current_url

    print("需要滑动的距离为:", distance)

    # 根据滑动距离生成滑动轨迹

    locus = self.get_slide_locus(distance)

    print("生成的滑动轨迹为:{},轨迹的距离之和为{}".format(locus, distance))

    # 按下鼠标左键

    ActionChains(driver).click_and_hold(slide_element).perform()

    time.sleep(0.5)

    # 遍历轨迹进行滑动

    for loc in locus:

        time.sleep(0.01)

        ActionChains(driver).move_by_offset(loc, random.randint(-55)).perform()

        ActionChains(driver).context_click(slide_element)

    # 释放鼠标

    ActionChains(driver).release(on_element=slide_element).perform()<br><br>

  

总结:

感谢每一个认真阅读我文章的人!!!

我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

                                             

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prompt不等于编程,“提示词工程师”淘汰程序员也是伪命题

Original 李建忠 李建忠研思 最近ChatGPT及基于大语言模型&#xff08;Large Language Model&#xff0c;以下简写为LLM&#xff09;的Github Copilot等工具出来之后&#xff0c;在软件开发领域也带来了非常大的震撼。著名的观点有Fixie创始人、前Google工程总监Matt Welsh在AC…

解决onblur()失去焦点事件在刚登陆页面(尚未有任何操作)时就触发的问题

文章目录 一、原始错误&#xff1a;1.1 原始代码1.2 访问页面&#xff08;仅访问页面&#xff0c;不进行任何操作&#xff09; 二、解决错误2.1 解决办法2.2 再次访问页面2.2.1 输入错误格式2.2.2 输入正确格式 最近笔者在编写代码时遇到刚访问页面&#xff0c;什么都没有操作&…

JavaWeb学习笔记-1

学习路线 Web开发–介绍&#xff08;画大饼&#xff09; 什么是Web&#xff1f; Web&#xff1a;全球广域网&#xff0c;也成为万维网&#xff0c;能通过浏览器访问的网站 Web网站的工作流程 网站大致是由三个部分组成的 第一部分就是我们能看到的网页程序&#xff0c;也叫做…

React 组件中怎么做事件代理

React 并不会把所有的处理函数直接绑定在真实的dom节点上&#xff0c;而是把所有的事件绑定到结构的最外层&#xff08;合成事件层&#xff09;&#xff0c;使用一个统一的事件监听器&#xff0c;这个事件监听器上维持了一个映射来保存所有组件内部的事件监听和处理函数。 当组…

哈工大计算机网络课程网络层协议详解之:网络地址转换NAT

哈工大计算机网络课程网络层协议详解之&#xff1a;网络地址转换NAT 文章目录 哈工大计算机网络课程网络层协议详解之&#xff1a;网络地址转换NAT网络地址转换&#xff08;NAT&#xff09;NAT实现原理NAT穿透问题NAT穿透问题的解决方案 上一节中&#xff0c;我们在DHCP协议中介…

K 个一组翻转链表

反转链表是比较常出的一种题目&#xff0c;我们有简单难度的一整个链表翻转&#xff1a; private ListNode reverse(ListNode head){ListNode pre null;ListNode cur head;while(cur ! null){ListNode next cur.next;cur.next pre;pre cur;cur next;}return pre;}从第一…

GC说明与介绍,GC的垃圾回收算法有哪些

1、GC是什么 2、GC算法概述 JVM在进行GC时&#xff0c;并非每次都对上面三个内存区域一起回收的&#xff0c;大部分时候回收的都是指新生代。 因此GC按照回收的区域又分了两种类型&#xff0c;一种是普通GC&#xff08;minor GC&#xff09;&#xff0c;一种是全局GC&#xff0…

【算法】行星碰撞机器人碰撞(栈的使用)

文章目录 行星碰撞机器人碰撞参考资料 本文记录了两个使用栈来处理碰撞问题的算法题目。 行星碰撞 https://leetcode.cn/problems/asteroid-collision/ 对于这种题目&#xff0c;各个元素分别会向左或向右移动&#xff0c;可以使用栈模拟碰撞的过程。 由于从左往右进行遍历…

Argis通过Python的Arcpy第三方库进行字段计算、批量将mxd导出为jpg图片、合并数据库

前言 近来公司有开发Arcgis脚本工具的需求&#xff0c;我就去学了一下用Arcpy来操作Arcgis的数据&#xff0c;今天学习了字段计算&#xff0c;将学习成果记录如下。 arcpy帮助文档传送门&#xff1a;https://resources.arcgis.com/zh-cn/help/main/10.2/ 一、字段计算 1、…

Linux学习之内核升级

wget --no-check-certificate https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.1.14.tar.xz下载源代码。 yum install -y gcc gcc-c make ncurses-devel openssl-devel elfutils-libelf-devel安装必要的依赖包。 完成之后&#xff0c;显示如下&#xff1a; …

openEuler操作系统和openGauss数据库

文章目录 1. openEuler操作系统2. openGauss数据库2.1 系统自带库2.1.1 允许所有地址访问端口2.1.2 创建远程登录用户 2.2 安装5.0 版本2.2.1 下载2.2.2 安装2.2.3 测试 1. openEuler操作系统 镜像下载地址 https://www.openeuler.org/zh/download 选一个下载 安装 按提示安…

【kubernetes系列】Kubernetes中的重要概念(三)

在实际的工作中&#xff0c;我们使用Kubernetes 通常不会直接创建 Pod&#xff0c;而是通过 各种 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性&#xff0c;比如有几个副本&#xff0c;在什么样的 Node 上运行等。为了满足不同的业务场景&#xff0c;Kuberne…

VMware Workstation 17 的安装

一、简介 VMware Workstation 17.0是一款功能非常强大的虚拟机&#xff0c;可以帮助用户在Windows系统上同时开启多个系统&#xff0c;不仅能在虚拟机上安装上不同的操作系统&#xff0c;比如Mac、Linux以及Windows10/11等&#xff0c;还能与云技术和容器技术&#xff08;如 D…

【金融量化】ETF基金是什么?有什么特点?

1 含义 ETF&#xff08;交易型开放式指数基金&#xff09;是以某一选定的指数所包含的成分证券或商品为投资对象&#xff0c;依据构成指数的证券或商品的种类和比例&#xff0c;采取完全复制或抽样复制&#xff0c;进行被动投资的指数基金。ETF不但具有传统指数基金的全部特色…

vue导出excle单sheet文字居中表头加粗显示

效果图&#xff1a; 首先下载依赖 npm install xlsx --save npm install xlsx-style --save在需要导出excle的vue文件中导入依赖 import XLSX from "xlsx" import XLSXStyle from xlsx-style在method中定义 methods:{// 格式化formatJson(filterVal, jsonData)…

月近万次发布,故障率<4‰如何做到?去哪儿测试左移重难点揭秘!

一分钟精华速览 去哪儿发布的数据显示&#xff0c;在过去一年中&#xff0c;其发布故障率始终保持在 4‰ 以下并不断降低。作为一家出行旅游服务平台&#xff0c;去哪儿网如何在复杂的业务场景下&#xff0c;仍能保持如此低的故障率&#xff1f;其中功能测试左移功不可没。 本…

高质量编程-编码规范之代码格式和注释

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 &#x1f49e;从这个专栏里面可以迅速获得Go的知识 本次文章不仅仅是在 go 中主要注意&#xff0c;在编写其他语言中也同样重要…

单片机介绍选型(嵌入式学习)

单片机介绍&选型 单片机介绍常见的单片机单片机如何选型 单片机介绍 单片机&#xff08;Microcontroller&#xff09;是一种集成电路芯片&#xff0c;具有处理器核心、存储器、输入/输出接口和各种外设的功能。 单片机是单片微型计算机的简称&#xff0c;MCU是Microcontro…

15. WebGPU 相机

在上一篇文章中&#xff0c;我们必须将 F 移到视锥体前面&#xff0c;因为 mat4.perspective 函数 将眼睛放在原点 (0, 0, 0) 并且把对象 放到 位于眼前 -zNear 到 -zFar 之间的视锥体中。这意味着&#xff0c;任何想要显示的东西&#xff0c;都需要放在这个空间里。 在现实世…

对英雄联盟英雄属性数据的预处理及相似度矩阵计算

目录 一、引言 二、任务1 1、填充缺失值 2、用中位数填充“生命值”属性列缺失值 3、 用均值填充“生命值”属性列缺失值 三、任务2 注&#xff1a;英雄联盟英雄属性数据资源可在博客资源中自行获取。 一、引言 英雄联盟作为一款古早的刀塔游戏&#xff0c;可谓之刀塔游…