金天牛

导航

selenium之滑块验证

登录时,会有遇到滑块验证码,一般有2种:1.拖到最右边;2.拖到指定位置。

本文只介绍下第一种情况。 

第二种情况,可以参考:https://zhuanlan.zhihu.com/p/624497402

例如第一次登录lazada网站需要滑块验证:https://sellercenter.lazada.com.ph/apps/seller/login,怎么解决这个问题呢?

 可以通过2个步骤来解决:

① 根据偏移量获取移动轨迹,下面函数中distance 为滑块从左到右的距离

def get_tracks(distance):
"""
根据偏移量获取移动轨迹
:param distance:偏移量
:return:移动轨迹
"""
# 移动轨迹
tracks = []
# 当前位移
current = 0
# 减速阈值
mid = distance * 4 / 5
# 计算间隔
t = 0.2
# 初速度
v = 0
while current < distance:
if current < mid:
# 加速度为正10.值大则速度快
a = 10
else:
# 加速度为负3
a = -3
# 初速度v0
v0 = v
# 当前速度
v = v0 + a * t
# 移动距离
move = v0 * t + 1 / 2 * a * t * t
# 当前位移
current += move
# 加入轨迹
tracks.append(round(move))
return tracks
②拖动滑块,下面函数中,slider为滑块的定位,tracks为拖动轨迹,从函数1中获取
def move_to_gap(slider, tracks):
"""
拖动滑块
:param slider: 滑块
:param tracks: 轨迹
:return:
"""
# 模拟滑动滑块
action = ActionChains(browser)
action.click_and_hold(slider).perform()
# action.reset_actions() # 清除之前的action
for i in tracks:
action.move_by_offset(xoffset=i, yoffset=0).perform()
time.sleep(0.5)
action.release().perform()

另外,在模拟登录时,发现滑块拖动了,结果网站验证失败,提示如下图。这个是因为在浏览器开发者模式中,看到window.navigator.webdriver显示为true,正常打开的显示为false
此时需要在启动浏览器时,加上参数options
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled") # 就是这一行告诉chrome去掉了webdriver痕迹,令navigator.webdriver=false,极其关键
# 还有其他options配置,此处和问题无关,略去
browser = webdriver.Chrome(options=options) # 打开浏览器

 

具体代码如下:

 

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled") # 就是这一行告诉chrome去掉了webdriver痕迹,令navigator.webdriver=false,极其关键
# 还有其他options配置,此处和问题无关,略去

browser = webdriver.Chrome(options=options) # 打开浏览器
browser.maximize_window() # 浏览器最大化
browser.get('https://sellercenter.lazada.com.ph/apps/seller/login') # 输入网址
time.sleep(3)
browser.find_element(By.XPATH, "//input[@id='account']").click()
browser.find_element(By.XPATH, "//input[@id='account']").send_keys("aaaaaaa")
browser.find_element(By.XPATH, "//input[@id='password']").click()
browser.find_element(By.XPATH, "//input[@id='password']").send_keys("bbbb")
browser.find_element(By.XPATH, "//button[@data-spm='home_next']").click()
time.sleep(5)

iframe = browser.find_element(By.XPATH, "//iframe[@id='baxia-dialog-content']")
browser.switch_to.frame(iframe) #滑块在iframe中,需要切换
# browser.find_element(By.XPATH, "//a[@id='bx-feedback-btn']").click()
time.sleep(3)
slider = browser.find_element(By.XPATH, "//span[@id='nc_1_n1z']") #滑块

tracks = get_tracks(260)
move_to_gap(slider,tracks)

参考:
https://blog.csdn.net/shclbear/article/details/124807195
https://blog.csdn.net/weixin_41712499/article/details/127488038

posted on 2023-06-30 16:32  金天牛  阅读(862)  评论(0编辑  收藏  举报