登录时,会有遇到滑块验证码,一般有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)标签:webdriver,滑块,验证,selenium,find,tracks,options,browser From: https://www.cnblogs.com/jintianniu/p/17517196.html
move_to_gap(slider,tracks)
参考:
https://blog.csdn.net/shclbear/article/details/124807195
https://blog.csdn.net/weixin_41712499/article/details/127488038