如何用Selenium WebDriver自动化含图片验证码的登录流程?
处理Selenium登录中无法定位的图片验证码方案
遇到这种随机字符图片验证码且无法定位元素的情况,推荐按优先级尝试以下几种方案:
1. 优先考虑绕过验证码(最高效)
这是自动化测试中最常用的思路,避免和验证码硬刚:
- 测试环境配置:联系开发在测试环境关闭验证码功能,或者添加测试专用的白名单账号,登录时跳过验证码校验。
- 接口层面登录:直接调用后端的登录接口完成认证,获取会话Cookie后,将Cookie注入到Selenium的浏览器实例中,跳过前端登录流程:
import requests from selenium import webdriver # 调用登录接口获取Cookie login_data = {"username": "test_user", "password": "test_pwd"} response = requests.post("https://your-site.com/api/login", data=login_data) session_cookie = response.cookies.get("sessionId") # 根据实际Cookie名调整 # 初始化浏览器并注入Cookie driver = webdriver.Chrome() driver.get("https://your-site.com") driver.add_cookie({"name": "sessionId", "value": session_cookie, "domain": "your-site.com"}) driver.refresh() # 刷新后已处于登录状态 - 使用记住登录状态:第一次手动登录后,保存浏览器的用户数据目录,后续Selenium启动时加载该目录,直接复用登录状态:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument(r"user-data-dir=C:\Users\YourName\AppData\Local\Google\Chrome\User Data") # 替换为你的Chrome数据目录 driver = webdriver.Chrome(options=options) driver.get("https://your-site.com") # 直接进入登录后的页面
2. OCR识别简单验证码
如果必须处理验证码,对字符清晰、无复杂干扰的图片验证码,可以用Tesseract OCR工具:
- 步骤:截图验证码区域 → 图片预处理(灰度化、降噪)→ OCR识别 → 输入验证码
- 示例代码:
注意:这种方法对有扭曲、干扰线的验证码识别率极低,仅适用于简单场景。from selenium import webdriver from PIL import Image import pytesseract # 先截图整个页面 driver.save_screenshot("full_page.png") # 手动确定验证码在页面中的坐标范围(x1, y1为左上角,x2, y2为右下角) captcha_coords = (200, 300, 400, 350) img = Image.open("full_page.png") captcha_img = img.crop(captcha_coords) # 预处理:转灰度、提高对比度 captcha_img = captcha_img.convert("L").point(lambda x: 0 if x < 127 else 255) captcha_img.save("processed_captcha.png") # 识别验证码 captcha_text = pytesseract.image_to_string("processed_captcha.png").strip() # 输入到验证码框 driver.find_element_by_id("captcha_input").send_keys(captcha_text)
3. 第三方验证码识别服务
针对复杂验证码(扭曲、干扰、滑块等),可以使用付费的第三方识别服务,这类服务通过人工或AI模型识别验证码,返回结果后再输入到页面。但需要注意成本和数据隐私风险,不建议在生产环境使用。
4. 手动介入调试
如果只是小范围测试或调试,可以在验证码出现时暂停脚本,手动输入后继续:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://your-site.com/login") # 输入用户名密码 driver.find_element_by_id("username").send_keys("test_user") driver.find_element_by_id("password").send_keys("test_pwd") # 点击登录 driver.find_element_by_id("login_btn").click() # 暂停脚本,等待手动输入验证码 input("请在页面中输入验证码后按回车键继续...") # 继续后续自动化操作
内容的提问来源于stack exchange,提问作者user14206159
相关产品推荐
相关产品推荐

