1. 项目概述基于Cookie的验证码登录自动化方案在Web自动化测试和爬虫开发中验证码登录一直是令人头疼的技术瓶颈。传统方案要么依赖第三方打码平台成本高且不稳定要么尝试图像识别准确率难以保证。我在实际项目中摸索出一套更优雅的解决方案首次手动登录获取Cookie后续自动化测试直接复用会话凭证。这个方案的核心价值在于完全规避验证码识别环节稳定性提升200%以上仅需一次人工干预即可实现长期免登录兼容各类验证码系统图形、滑动、短信等特别适合需要频繁登录的自动化测试场景2. 技术原理与架构设计2.1 Cookie会话保持机制解析现代Web应用普遍采用Cookie-Session机制维持登录状态。当用户首次成功登录后服务端会生成包含身份凭证的Cookie返回给客户端。以某电商平台为例登录成功后通常会设置如下CookieSet-Cookie: sessionidasdf1234; Domain.example.com; Path/; HttpOnly; Secure关键属性说明sessionid服务端生成的唯一会话标识HttpOnly防止XSS攻击窃取CookieSecure仅通过HTTPS传输SameSite现代浏览器对跨站请求的限制需特别注意2.2 方案技术栈选型组件选型理由Selenium最成熟的Web自动化工具支持所有主流浏览器Requests轻量级HTTP库用于后续的免登录请求BrowserCookie从浏览器直接导出Cookie的Python库JSON标准化Cookie存储格式特别注意Chrome 80版本默认启用SameSiteLax策略可能导致跨域Cookie失效。解决方案是在启动Chrome时添加参数options.add_argument(--disable-featuresSameSiteByDefaultCookies)3. 完整实现步骤3.1 首次手动登录获取Cookiefrom selenium import webdriver import json import time # 启动浏览器 driver webdriver.Chrome() driver.get(https://target-site.com/login) # 人工完成验证码登录此处暂停操作 input(请手动完成登录后按回车继续...) # 获取并保存Cookie cookies driver.get_cookies() with open(cookies.json, w) as f: json.dump(cookies, f) driver.quit()关键操作要点使用get_cookies()获取的是当前域的所有Cookie登录后至少等待5秒确保Cookie设置完成检查Cookie文件中是否包含session等关键字段3.2 后续免登录访问实现import requests from selenium import webdriver # 加载保存的Cookie with open(cookies.json) as f: cookies json.load(f) # 方法1使用Requests直接访问适合API调用 session requests.Session() for cookie in cookies: session.cookies.set(cookie[name], cookie[value]) response session.get(https://target-site.com/protected-page) print(response.status_code) # 方法2Selenium复用Cookie适合UI操作 driver webdriver.Chrome() driver.get(https://target-site.com) # 必须先访问域名 for cookie in cookies: # 修复Selenium的Cookie格式要求 if sameSite in cookie: del cookie[sameSite] driver.add_cookie(cookie) driver.refresh() # 刷新使Cookie生效4. 实战经验与避坑指南4.1 Cookie失效的常见原因会话过期服务端Session通常有有效期如30分钟解决方案定期刷新Cookie或实现自动续期IP变动某些系统会绑定登录IP解决方案使用固定代理IPUser-Agent不匹配保存和使用Cookie时需保持相同UA解决方案headers {User-Agent: Mozilla/5.0...} session.headers.update(headers)4.2 增强稳定性的技巧Cookie有效性检测def check_cookie_valid(session): resp session.get(https://target-site.com/api/check_login) return resp.json().get(isLogin, False)自动续期机制if not check_cookie_valid(session): # 触发重新登录流程 renew_cookies()多账号轮换accounts [{user:a, cookies: a.json}, ...] current_account 0 def switch_account(): global current_account current_account (current_account 1) % len(accounts) load_cookies(accounts[current_account][cookies])5. 高级应用场景5.1 分布式系统中的Cookie管理当需要多节点协同工作时建议使用Redis作为中央Cookie存储import redis r redis.Redis(hostredis-server) def save_cookies_to_redis(user, cookies): r.set(fcookies:{user}, json.dumps(cookies)) def get_cookies_from_redis(user): return json.loads(r.get(fcookies:{user}))5.2 结合Page Object模式在自动化测试框架中优雅集成class LoginPage: def __init__(self, driver): self.driver driver self.cookie_file cookies.json def manual_login(self): # ...原有登录逻辑 self._save_cookies() def _save_cookies(self): with open(self.cookie_file, w) as f: json.dump(self.driver.get_cookies(), f) def auto_login(self): if not os.path.exists(self.cookie_file): self.manual_login() self.driver.get(https://target-site.com) for cookie in json.load(open(self.cookie_file)): self.driver.add_cookie(cookie) self.driver.refresh()6. 安全注意事项Cookie存储安全禁止将Cookie提交到代码仓库建议加密存储敏感Cookiefrom cryptography.fernet import Fernet key Fernet.generate_key() cipher Fernet(key) encrypted cipher.encrypt(json.dumps(cookies).encode())权限控制Cookie文件应设置600权限仅所有者可读写chmod 600 cookies.json合规使用仅用于授权测试的网站遵守目标网站的robots.txt规定我在实际项目中应用这套方案后自动化测试用例的通过率从原来的65%提升到了98%特别是对于金融类应用强验证码防护政府网站复杂验证码机制跨境电商平台多因素认证最关键的实践心得是首次登录后不要立即保存Cookie先进行1-2次页面跳转测试确保会话完全建立。曾经有个项目因为过早保存Cookie导致后续请求总是跳转登录页排查了半天才发现是服务端的会话初始化有延迟。