Python模拟登录窗口滑动验证

一:思路

  1. 创建chrome浏览器驱动

  2. 访问需要测试的登录页面

  3. 添加指定元素的位置

  4. 填写拖动按钮的数据参数

  5. 导入cv库

二:登录窗口滑动验证

Python代码如下

import time
from selenium import webdriver
from selenium.webdriver import ActionChains

# 新建selenium浏览器对象,后面是geckodriver.exe下载后本地路径
browser = webdriver.Chrome('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
# 浏览器访问登录页面
browser.get('https://login.zhipin.com/?ka=header-login')
browser.maximize_window()
#browser.implicitly_wait(3)
draggable = browser.find_element_by_id('nc_2_n1z') #滚动标签ID
#滚动指定元素位置
browser.execute_script("nc_1__bg.width[0].scrollIntoView();", draggable)
browser.execute_script("nc_1_n1z.left[0].scrollIntoView();", draggable)
time.sleep(2)
ActionChains(browser).click_and_hold(draggable).perform()
# 拖动
ActionChains(browser).move_by_offset('nc_1__bg.width=276', 'nc_1_n1z.left=276').perform()
ActionChains(browser).release().perform()

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
# 新建selenium浏览器对象,后面是geckodriver.exe下载后本地路径
browser = webdriver.Chrome('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
# 浏览器访问登录页面
browser.get('https://login.zhipin.com/?ka=header-login')#登录窗口页面
browser.maximize_window()
#browser.implicitly_wait(3)
draggable = browser.find_element_by_id('nc_2_n1z') #滚动标签ID
#滚动指定元素位置
browser.execute_script("nc_1__bg.width[0].scrollIntoView();", draggable)
browser.execute_script("nc_1_n1z.left[0].scrollIntoView();", draggable)
time.sleep(2)
ActionChains(browser).click_and_hold(draggable).perform()
# 拖动
ActionChains(browser).move_by_offset('nc_1__bg.width=276', 'nc_1_n1z.left=276').perform()
ActionChains(browser).release().perform()

------------------------------------------------------------------------------

import time
import cv2
import canndy_test
from selenium import webdriver
from selenium.webdriver import ActionChains
# 新建selenium浏览器对象,后面是geckodriver.exe下载后本地路径
browser = webdriver.Firefox()
# 网站登陆页面
url = 'https://www.om.cn/login'
# 浏览器访问登录页面
browser.get(url)
handle = browser.current_window_handle
# 等待3s用于加载脚本文件
browser.implicitly_wait(3)
# 点击登陆按钮,弹出滑动验证码
btn = browser.find_element_by_class_name('login_btn1')
btn.click()
# 获取iframe元素,切到iframe
frame = browser.find_element_by_id('tcaptcha_iframe')
browser.switch_to.frame(frame)
time.sleep(1)
# 获取背景图src
targetUrl = browser.find_element_by_id('slideBg').get_attribute('src')
# 获取拼图src
tempUrl = browser.find_element_by_id('slideBlock').get_attribute('src')
# 新建标签页
browser.execute_script("window.open('');")
# 切换到新标签页
browser.switch_to.window(browser.window_handles[1])
# 访问背景图src
browser.get(targetUrl)
time.sleep(3)
# 截图
browser.save_screenshot('temp_target.png')
w = 680
h = 390
img = cv2.imread('temp_target.png')
size = img.shape
top = int((size[0] - h) / 2)
height = int(h + ((size[0] - h) / 2))
left = int((size[1] - w) / 2)
width = int(w + ((size[1] - w) / 2))
cropped = img[top:height, left:width]
# 裁剪尺寸
cv2.imwrite('temp_target_crop.png', cropped)
# 新建标签页
browser.execute_script("window.open('');")
browser.switch_to.window(browser.window_handles[2])
browser.get(tempUrl)
time.sleep(3)
browser.save_screenshot('temp_temp.png')
w = 136
h = 136
img = cv2.imread('temp_temp.png')
size = img.shape
top = int((size[0] - h) / 2)
height = int(h + ((size[0] - h) / 2))
left = int((size[1] - w) / 2)
width = int(w + ((size[1] - w) / 2))
cropped = img[top:height, left:width]
cv2.imwrite('temp_temp_crop.png', cropped)
browser.switch_to.window(handle)
# 模糊匹配两张图片
move = canndy_test.matchImg('temp_target_crop.png', 'temp_temp_crop.png')
# 计算出拖动距离
distance = int(move / 2 - 27.5) + 2
draggable = browser.find_element_by_id('tcaptcha_drag_thumb')
ActionChains(browser).click_and_hold(draggable).perform()
# 拖动
ActionChains(browser).move_by_offset(xoffset=distance, yoffset=0).perform()
ActionChains(browser).release().perform()
time.sleep(10)

--------------------------------------------------------------------

import cv2
import numpy as np
def matchImg(imgPath1,imgPath2):
    imgs = []
    # 原始图像,用于展示
    sou_img1 = cv2.imread(imgPath1)
    sou_img2 = cv2.imread(imgPath2)
    # 原始图像,灰度
    # 最小阈值100,最大阈值500
    img1 = cv2.imread(imgPath1, 0)
    blur1 = cv2.GaussianBlur(img1, (3, 3), 0)
    canny1 = cv2.Canny(blur1, 100, 500)
    cv2.imwrite('temp1.png', canny1)
    img2 = cv2.imread(imgPath2, 0)
    blur2 = cv2.GaussianBlur(img2, (3, 3), 0)
    canny2 = cv2.Canny(blur2, 100, 500)
    cv2.imwrite('temp2.png', canny2)
    target = cv2.imread('temp1.png')
    template = cv2.imread('temp2.png')
    # 调整显示大小
    target_temp = cv2.resize(sou_img1, (350, 200))
    target_temp = cv2.copyMakeBorder(target_temp, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])
    template_temp = cv2.resize(sou_img2, (200, 200))
    template_temp = cv2.copyMakeBorder(template_temp, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])
    imgs.append(target_temp)
    imgs.append(template_temp)
    theight, twidth = template.shape[:2]
    # 匹配拼图
    result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)
    # 归一化
    cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    # 匹配后结果画圈
    cv2.rectangle(target,max_loc,(max_loc[0]+twidth,max_loc[1]+theight),(0,0,255),2)
    target_temp_n = cv2.resize(target, (350, 200))
    target_temp_n = cv2.copyMakeBorder(target_temp_n, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=[255, 255, 255])
    imgs.append(target_temp_n)
    imstack = np.hstack(imgs)
    cv2.imshow('stack'+str(max_loc), imstack)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    matchImg('vcode_data/out_'+str(1)+'.png','vcode_data/in_'+str(1)+'.png')

另外:在安装CV2库的时候,windows 10 系统会报错,可以执行如下命令

pip install opencv-python
国内的用户可以用阿里云的源:
pip install -i https://mirrors.aliyun.com/pypi/simple/opencv-python

 

Python学习教程企鹅裙:162181791  Python web开发,Python爬虫,数据分析,人工智能等技术交流!零基础系统的学习教程分享。

更多Python学习资料加入QQ群:162181791 备注CSDN

PS:如果觉得本篇文章对您有所帮助,欢迎关注、订阅!帮忙转发一下 分享出去

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值