2021年9月8日,完美解决selenium自动处理滑块问题方案,只有想不到没有做不到!

本文主要是介绍2021年9月8日,完美解决selenium自动处理滑块问题方案,只有想不到没有做不到!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.有一天我需要使用自动化填写表单,但是,当我保存时,碰到了滑块,只能自己手动滑动,我自己心有不甘,决定自己破解它,不破解自动验证滑块成功誓不罢休,于是我开始思考。。。
(注:大家可以自己寻找一个需要通过滑块验证的网站,此方法适用于所有的滑块验证网站)
在这里插入图片描述

2.思路:首先使用selenium截全屏,然后使用selenium定位图片标签获取x,y,w,h,通过宽高截屏滑块图片,同时识别滑块缺口,识别缺口后获得缺口的横向坐标,然后使用selenium拖动滑块匀速从左向右滑动到达位置,即成功,识别效果百分之80以上。

3.主要问题有两个,一是如何定位到滑块页面,二是如何识别滑块缺口并且返回横坐标x

4.如何定位到滑块页面,主要可能需要进如iframe页面,大家可以详细搜一下如何进入和退出iframe页面的方法

5.如何识别滑块缺口并且返回横坐标x,我们首先需要一个缺口的图片作为对照,之后每次获取的背景图可根据缺口进行识别,使用此识别方式识别较为准确

背景图片
背景图片
缺口图片
在这里插入图片描述
识别滑块缺口代码展示

def identify(bg, tp, out):# 读取背景图片和缺口图片bg_img = cv2.imread(bg)  # 背景图片tp_img = cv2.imread(tp)  # 缺口图片# 识别图片边缘bg_edge = cv2.Canny(bg_img, 100, 200)tp_edge = cv2.Canny(tp_img, 100, 200)# 转换图片格式bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)# 缺口匹配res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配# 绘制方框th, tw = tp_pic.shape[:2]tl = max_loc  # 左上角点的坐标br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形cv2.imwrite(out, bg_img)  # 保存在本地print(tl[0])# 返回缺口的X坐标return tl[0]

3.完整代码展示
在这里插入图片描述

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
import cv2
def identify_gap(bg, tp, out):'''bg: 背景图片tp: 缺口图片out:输出图片'''# 读取背景图片和缺口图片bg_img = cv2.imread(bg)  # 背景图片tp_img = cv2.imread(tp)  # 缺口图片# 识别图片边缘bg_edge = cv2.Canny(bg_img, 100, 200)tp_edge = cv2.Canny(tp_img, 100, 200)# 转换图片格式bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)# 缺口匹配res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配# 绘制方框th, tw = tp_pic.shape[:2]tl = max_loc  # 左上角点的坐标br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形cv2.imwrite(out, bg_img)  # 保存在本地print(tl[0])# 返回缺口的X坐标return tl[0]
# identify_gap("result1.png","result2.png","1.png")
chome_option=webdriver.ChromeOptions()
driver=webdriver.Chrome()
driver.get("https://spcjsample.gsxt.gov.cn/index.php?m=Admin&c=Sample&a=receiveOrEditSample&oper_type=receive&sample_code=XC21320115216735911")
driver.maximize_window()
driver.find_element_by_xpath('//*[@id="formReceiveSample"]/div[2]/span').click()
time.sleep(3)
source=driver.find_element_by_xpath('//*[@id="tncode_div"]/div[5]/div[1]')
print(source.location['x'])
time.sleep(2)
ActionChains(driver).click_and_hold(source).perform()
driver.save_screenshot('result.png')
im = cv2.imread('result.png')
im = im[342:495,858:1075]
cv2.imwrite('result1.png',im)
distance = identify_gap("result1.png","result2.png","1.png")+30
i = 0
while i <= distance:ActionChains(driver).move_by_offset(2,0).perform()i += 2
ActionChains(driver).release().perform()
time.sleep(3)
driver.quit()

4.改良后适配不同窗口代码
在这里插入图片描述
在这里插入图片描述

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
import cv2
def identify_gap(bg, tp, out):'''bg: 背景图片tp: 缺口图片out:输出图片'''# 读取背景图片和缺口图片bg_img = cv2.imread(bg)  # 背景图片tp_img = cv2.imread(tp)  # 缺口图片# 识别图片边缘bg_edge = cv2.Canny(bg_img, 100, 200)tp_edge = cv2.Canny(tp_img, 100, 200)# 转换图片格式bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)# 缺口匹配res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配# 绘制方框th, tw = tp_pic.shape[:2]tl = max_loc  # 左上角点的坐标br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形cv2.imwrite(out, bg_img)  # 保存在本地print(tl[0])# 返回缺口的X坐标return tl[0]
# identify_gap("result1.png","result2.png","1.png")
chome_option=webdriver.ChromeOptions()
driver=webdriver.Chrome()
driver.get("https://spcjsample.gsxt.gov.cn/index.php?m=Admin&c=Sample&a=receiveOrEditSample&oper_type=receive&sample_code=XC21320115216735911")
driver.maximize_window()
driver.find_element_by_xpath('//*[@id="formReceiveSample"]/div[2]/span').click()
time.sleep(3)
source=driver.find_element_by_xpath('//*[@id="tncode_div"]/div[5]/div[1]')
target=driver.find_element_by_xpath('//*[@id="tncode_div"]/canvas[2]')
time.sleep(2)
ActionChains(driver).click_and_hold(source).perform()
driver.save_screenshot('result.png')
im = cv2.imread('result.png')
# im = im[342:495,858:1075]
sp = im.shape
sz1 = sp[0]
sz2 = sp[1]
sz3 = sp[2]
im = im[(int(sz1)//2-119):(int(sz1)//2+31),(int(sz2)//2-130):(int(sz2)//2+115)]
cv2.imwrite('result1.png',im)
distance = identify_gap("result1.png","result2.png","1.png")+4
i = 0
while i <= distance:ActionChains(driver).move_by_offset(4,0).perform()i += 4
ActionChains(driver).release().perform()
time.sleep(3)
driver.quit()

5.改良后不需要截全屏后再截图,直接全屏和缺口识别
在这里插入图片描述

在这里插入图片描述

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
import cv2
def identify_gap(bg, tp, out):'''bg: 背景图片tp: 缺口图片out:输出图片'''# 读取背景图片和缺口图片bg_img = cv2.imread(bg)  # 背景图片tp_img = cv2.imread(tp)  # 缺口图片# 识别图片边缘bg_edge = cv2.Canny(bg_img, 100, 200)tp_edge = cv2.Canny(tp_img, 100, 200)# 转换图片格式bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)# 缺口匹配res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配# 绘制方框th, tw = tp_pic.shape[:2]tl = max_loc  # 左上角点的坐标br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形cv2.imwrite(out, bg_img)  # 保存在本地print(tl[0])# 返回缺口的X坐标return tl[0]
# identify_gap("result1.png","result2.png","1.png")
chome_option=webdriver.ChromeOptions()
driver=webdriver.Chrome()
driver.get("https://spcjsample.gsxt.gov.cn/index.php?m=Admin&c=Sample&a=receiveOrEditSample&oper_type=receive&sample_code=XC21320115216735911")
# driver.maximize_window()
driver.find_element_by_xpath('//*[@id="formReceiveSample"]/div[2]/span').click()
time.sleep(3)
source=driver.find_element_by_xpath('//*[@id="tncode_div"]/div[5]/div[1]')
target=driver.find_element_by_xpath('//*[@id="tncode_div"]/canvas[2]')
time.sleep(2)
k=source.location['x']
print(k)
ActionChains(driver).click_and_hold(source).perform()driver.save_screenshot('result.png')#这里截全屏,截全屏后再保存,之后再截图# im = cv2.imread('result.png')
# sp = im.shape
# sz1 = sp[0]
# sz2 = sp[1]
# sz3 = sp[2]
# im = im[(int(sz1)//2-119):(int(sz1)//2+31),(int(sz2)//2-130):(int(sz2)//2+115)]
# cv2.imwrite('result1.png',im)
distance = identify_gap("result.png","result2.png","1.png")-k
print(distance)
i = 0
while i <= distance:ActionChains(driver).move_by_offset(5,0).perform()i += 5
ActionChains(driver).release().perform()
time.sleep(3)
driver.quit()

更新问题:
1.此滑块没有ifame页面,所以很方便进入,大家的滑块验证很大可能是ifame页面,如果发现自己自动点击不了的话可能就是这个问题。

2.此方法适用于所有验证滑块的情况,因为这个方法是直接识别滑块缺口的位置,然后计算需要移动的像素距离来实现的,是可变的、能够适用所有滑块验证。

3.通过测试了99次验证只有5次没有成功,没有成功的原因在于,滑块的缺口识别错误,因为识别缺口是有识别度的,这个方法的识别度大概在百分之85以上,如果你想增加精确度,那么可以提炼识别方法,识别的更准确,则验证更成功。

这篇关于2021年9月8日,完美解决selenium自动处理滑块问题方案,只有想不到没有做不到!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682748

相关文章

豆包 MarsCode 不允许你还没有女朋友

在这个喧嚣的世界里,爱意需要被温柔地唤醒。为心爱的她制作每日一句小工具,就像是一场永不落幕的浪漫仪式,每天都在她的心田播撒爱的种子,让她的每一天都充满甜蜜与期待。 背景 在这个瞬息万变的时代,我们都在寻找那些能让我们慢下来,感受生活美好的瞬间。为了让这份浪漫持久而深刻,我们决定为女朋友定制一个每日一句小工具。这个工具会在她意想不到的时刻,为她呈现一句充满爱意的话语,让她的每一天都充满惊喜和感动

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言