使用Python Selenium拖动中证指数网滑块验证失败求助
阿里云滑块验证失败问题(访问中证指数网站)
问题场景
访问https://www.csindex.com.cn时,页面弹出阿里云滑块验证组件,需将滑块拖动至最右侧完成验证。验证组件的HTML结构如下:
<div id="waf_nc_block" style="display: block;"> <div class="waf-nc-mask"></div> <div id="WAF_NC_WRAPPER" class="waf-nc-wrapper"> <p class="waf-nc-title">访问验证</p> <p class="waf-nc-description">为保证您的正常访问,请进行如下验证</p> <p id="waf-nc-traceid" class="waf-nc-traceid-class">日志ID: ac11000117319689145554401e1a0c</p> <div id="nocaptcha"> <div id="aliyunCaptcha-window-embed" class="aliyunCaptcha-show" style="padding:0;border:none;display:block;"> <div id="aliyunCaptcha-sliding-wrapper" class="aliyun-captcha"> <div id="aliyunCaptcha-sliding-body" class="sliding"> <div id="aliyunCaptcha-sliding-left" class="" style="width: 295px;"></div> <div id="aliyunCaptcha-sliding-slider" class="" style="cursor: grabbing; left: 275px;"></div> <div id="aliyunCaptcha-sliding-text-box" class="aliyunCaptcha-sliding-text-box"><span id="aliyunCaptcha-sliding-text" class="aliyunCaptcha-sliding-text">请按住滑块,拖动到最右边</span></div> </div> <span id="aliyunCaptcha-sliding-failTip"></span> <span id="aliyunCaptcha-errorTip"></span></div> </div> </div> </div> </div>
尝试的Selenium操作代码
已尝试两种ActionChains拖动方式,但均触发验证错误:
- 直接偏移拖拽:
slider = driver.find_elements(by=By.XPATH, value="//div[@id = 'nocaptcha']//div[@id = 'aliyunCaptcha-sliding-slider']")[0] ActionChains(driver).drag_and_drop_by_offset(slider, 280, 0).pause(3).perform()
- 分段拖动模拟人类操作:
ActionChains(driver).move_to_element(slider).click_and_hold().move_by_offset(120, 0).pause(.4).move_by_offset(100, 0).pause(.3).move_by_offset(60, 0).pause(.1).release().perform()
错误表现
操作后触发验证失败,提示页面停留过长,请刷新页面重试,错误状态下的HTML结构如下:
<div id="waf_nc_block" style="display: block;"> <div class="waf-nc-mask"></div> <div id="WAF_NC_WRAPPER" class="waf-nc-wrapper"> <p class="waf-nc-title">访问验证</p> <p class="waf-nc-description">为保证您的正常访问,请进行如下验证</p> <p id="waf-nc-traceid" class="waf-nc-traceid-class">日志ID: ac11000117320265050193350e6922</p> <div id="nocaptcha"> <div id="aliyunCaptcha-window-embed" class="aliyunCaptcha-show" style="padding:0;border:none;display:block;"> <div id="aliyunCaptcha-sliding-wrapper" class="aliyun-captcha" style="background: white;"> <div id="aliyunCaptcha-sliding-body" class="sliding" style="display: none;"> <div id="aliyunCaptcha-sliding-left" class="" style="width: 300px;"></div> <div id="aliyunCaptcha-sliding-slider" class="ok" style="cursor: grabbing; left: 280px;"></div> <div id="aliyunCaptcha-sliding-text-box" class="aliyunCaptcha-sliding-text-box"><span id="aliyunCaptcha-sliding-text" class="verified">验证中...</span></div> </div> <span id="aliyunCaptcha-sliding-failTip"> <span id="aliyunCaptcha-sliding-fail-text" class="aliyunCaptcha-sliding-fail-text aliyun-captcha"> <span id="aliyunCaptcha-sliding-warning" class="aliyunCaptcha-sliding-warning"></span> 页面停留过长,请刷新页面重试 <br>(error:ac11000117320265050193350e6922) <br> </span> </span> <span id="aliyunCaptcha-errorTip"></span></div> </div> </div> </div> </div>
解决思路
1. 优化拖动节奏,减少不必要停顿
人类拖动滑块的行为是先快后慢、连贯平滑,而非多次停顿。尝试调整拖动逻辑,控制总时长在1-2秒内,接近终点时轻微减速微调:
import time from selenium.webdriver.common.action_chains import ActionChains slider = driver.find_element(By.ID, "aliyunCaptcha-sliding-slider") action = ActionChains(driver) action.click_and_hold(slider).perform() # 快速移动大部分距离 action.move_by_offset(260, 0).perform() # 终点前微调,模拟自然减速 time.sleep(0.1) action.move_by_offset(20, 0).perform() time.sleep(0.05) action.release().perform()
2. 确保元素完全可交互后再操作
使用WebDriverWait等待滑块元素处于可点击状态,避免在元素未加载完成时执行操作:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC slider = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "aliyunCaptcha-sliding-slider")) )
3. 隐藏自动化标识
Selenium默认会被网站检测到,通过ChromeOptions修改配置,禁用自动化特征:
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options) # 额外修改navigator.webdriver属性 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
4. 缩短页面到验证的间隔时间
错误提示的“页面停留过长”可能指从页面加载到触发验证的时间太久。尝试在页面加载完成后,立即处理验证弹窗,不要长时间等待。
内容的提问来源于stack exchange,提问作者user17866890
相关产品推荐
相关产品推荐

