Selenium 4无法自动识别验证码,仅提供浏览器操作接口;滑块需OpenCV缺口识别+分段模拟拖动轨迹;点选类须动态适配缩放与设备像素比;reCAPTCHA推荐Token注入而非模拟点击。

直接结论:Selenium 4本身不解决验证码,它只提供操作入口
验证码(尤其是滑块、点选、reCAPTCHA)不是Selenium能“自动绕过”的东西。Selenium 4的作用是精准控制浏览器行为——点击按钮、截图、拖动滑块、注入Token——但识别和决策必须交由外部逻辑完成。盲目指望selenium自带函数解决验证码,只会卡在ElementNotInteractableException或TimeoutException上反复 retry。
滑块验证码:缺口识别 + 物理拖动轨迹必须模拟
极验、腾讯云等主流滑块验证会检测拖动速度曲线。简单直线拖动(ActionChains(driver).drag_and_drop_by_offset())大概率失败。
- 先用
driver.get_screenshot_as_file()全屏截图,再定位geetest_canvas_bg和geetest_canvas_slice两个canvas元素,用location_once_scrolled_into_view确保可见后截图裁切 - 缺口识别推荐用OpenCV做边缘检测(
cv2.Canny())而非纯像素比对,抗噪更强;缺口横坐标偏差常在±3px,需预留容错 - 拖动必须分段:前1/3加速,中1/3匀速,后1/3减速。用
move_by_offset(x, y)配合time.sleep(0.02)逐点移动,总耗时控制在1.2–1.8秒之间 - 拖完立刻检查
document.querySelector(".geetest_success")是否存在,而不是盲目click()提交按钮
点选/宫格类验证码:坐标必须动态适配 viewport 缩放
很多网站用transform: scale()缩放验证码容器,导致你算出的图片坐标和实际点击位置偏移。硬编码坐标会失效。
- 先读取容器
style.transform值,提取scale(0.x)系数;再用driver.execute_script("return window.devicePixelRatio")获取设备像素比 - 真实点击坐标 = (原始坐标 × 缩放系数) / 设备像素比
- 点选类务必用
ActionChains(driver).move_to_element_with_offset(el, x, y).click().perform(),避免click()直接触发元素事件而跳过视觉校验 - 宫格验证码若出现频率高,可本地缓存已识别模板(SHA256哈希命名),比对
cv2.matchTemplate()相似度 > 0.92 再复用轨迹
reCAPTCHA v3/v2:Token 注入比模拟点击更可靠
reCAPTCHA 的核心是后台校验 Token,前端点击只是触发生成。强行模拟人机交互既慢又易被标记为可疑。
立即学习“Python免费学习笔记(深入)”;
- v3 场景下,直接调用
driver.execute_script("return grecaptcha.execute('SITE_KEY', {action: 'login'})")获取 Token,再填入隐藏input[name="g-recaptcha-response"] - v2 场景优先走 Capsolver API:
capsolver.solve({"type": "ReCaptchaV2TaskProxyless", "websiteURL": url, "websiteKey": key}),返回token后注入表单 - 绝对不要尝试用
iframe内switch_to.frame()去点“我不是机器人”——reCAPTCHA 已禁用该方式,且 iframe 域名与主站不同,跨域拒绝 - 注入 Token 后,需等待
document.getElementById("g-recaptcha-response").value非空再 submit,否则后端收不到值
真正难的从来不是写几行ActionChains代码,而是判断哪个环节该交给人工规则、哪个该交给OCR模型、哪个必须外包给付费服务。验证码类型一变,整个链路就得重调——没有银弹,只有分层应对。


















