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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?