Selenium无法复用已认证会话问题排查
背景
我用Selenium Python爬取https://www.residencyexplorer.org/,该网站需要账号密码登录,以下代码可以正常完成登录:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import pathlib script_directory = pathlib.Path().absolute() options = Options() options.add_argument("--disable-web-security") options.add_argument("--disable-gpu") options.add_argument(f"user-data-dir={script_directory}\\userdata") username = 'username' password = 'password' try: driver = webdriver.Chrome(options=options) driver.maximize_window() driver.get("https://www.residencyexplorer.org/") WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '.login_btn')) ).click() username_field = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'IDToken1')) ) password_field = driver.find_element(By.ID, 'IDToken2') username_field.send_keys(username) password_field.send_keys(password) driver.find_element(By.ID, 'login-btn').click() # 确保登录成功 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'setup-selection-wrapper')) ) finally: time.sleep(5) driver.quit()
为了复用会话,我尝试存储并重新加载Cookies,代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import pathlib script_directory = pathlib.Path().absolute() options = Options() options.add_argument("--disable-web-security") options.add_argument("--disable-gpu") options.add_argument(f"user-data-dir={script_directory}\\userdata") username = 'username' password = 'password' try: driver = webdriver.Chrome(options=options) driver.maximize_window() driver.get("https://www.residencyexplorer.org/") WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '.login_btn')) ).click() username_field = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'IDToken1')) ) password_field = driver.find_element(By.ID, 'IDToken2') username_field.send_keys(username) password_field.send_keys(password) driver.find_element(By.ID, 'login-btn').click() # 确保登录成功 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'setup-selection-wrapper')) ) cookies = driver.get_cookies() print(cookies) driver.quit() del driver driver = webdriver.Chrome(options=options) driver.maximize_window() driver.get("https://www.residencyexplorer.org/") WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '.login_btn')) ).click() WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'IDToken1')) ) for cookie in cookies: driver.add_cookie(cookie) driver.refresh() finally: time.sleep(5) driver.quit()
这段代码能成功存储并加载Cookies,但问题是:第二次启动浏览器加载Cookies后刷新页面,仍然显示登录页,而手动操作时可以直接跳转到仪表盘。测试账号:用户名test7679,密码Testuser@7679。
额外信息
打印的Cookies内容如下:
[{'domain': '.aamc.org', 'expiry': 1758351087, 'httpOnly': False, 'name': '_ga_F34J4B2QMY', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'GS1.1.1723789310.0.0'}, {'domain': '.aamc.org', 'expiry': 1758351086, 'httpOnly': False, 'name': '_ga_6RMD5F01JZ', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'GS1.1.13791086.0.0.0'}, {'domain': '.aamc.org', 'expiry': 1758351087, 'httpOnly': False, 'name': '_ga_JBPEGS57X9', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '.4.1.1723791086.0.0.0'}, {'domain': '.aamc.org', 'httpOnly': True, 'name': 'amlbcookie', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '01'}, {'domain': 'ry': 1758351081, 'httpOnly': False, 'name': '_ga', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'GA1.1.545195483.1723773905'}]
但开发者工具里还能看到AWSALB和AWSALBCORS两个Cookie,这两个没有被捕获到,而且它们的值会随页面刷新或加载变化。
问题分析与解决方案
核心问题
- 添加Cookies的时机错误:第二次启动浏览器后,先点击登录按钮跳转到登录页面再添加Cookies,此时Cookie的域不匹配,导致无法生效。
- 未捕获关键会话Cookie:
AWSALB和AWSALBCORS是保持登录状态的关键Cookie,它们属于residencyexplorer.org域,但当前代码只捕获了.aamc.org域的Cookie。 - Cookie属性处理缺失:部分Cookie带有
HttpOnly或特定path/domain属性,添加时未完整保留这些属性,导致服务器无法识别。
修正代码
第一步:正确存储所有Cookie
登录成功后,切换回residencyexplorer.org域,确保捕获所有Cookie:
# 登录成功后,切回目标网站主页 driver.get("https://www.residencyexplorer.org/") # 等待页面完全加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'setup-selection-wrapper')) ) # 获取所有Cookie cookies = driver.get_cookies() # 可选:将Cookie保存到文件,方便后续复用 import json with open('cookies.json', 'w') as f: json.dump(cookies, f)
第二步:正确加载Cookie
第二次启动浏览器时,直接访问主页再添加Cookie,无需点击登录按钮:
driver = webdriver.Chrome(options=options) driver.maximize_window() # 先访问目标网站,确保浏览器处于正确域下 driver.get("https://www.residencyexplorer.org/") time.sleep(2) # 加载Cookie(从文件读取) import json with open('cookies.json', 'r') as f: cookies = json.load(f) # 添加所有Cookie,处理可能的属性问题 for cookie in cookies: # 修复空域问题 if 'domain' in cookie and not cookie['domain']: cookie['domain'] = '.residencyexplorer.org' try: driver.add_cookie(cookie) except Exception as e: print(f"添加Cookie失败: {cookie['name']}, 错误: {e}") # 刷新页面,直接进入登录后的仪表盘 driver.refresh() # 验证登录状态 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'setup-selection-wrapper')) )
额外注意事项
user-data-dir的作用:该参数本身会保存浏览器会话数据(包括Cookie),如果只是复用同一会话,无需手动存储/加载Cookie,直接启动浏览器访问网站即可自动保持登录。- AWS Cookie特性:
AWSALB和AWSALBCORS是短期会话Cookie,有效期短且会随请求更新,过期后需要重新登录获取新Cookie。 - 版本兼容性:确保ChromeDriver版本与Chrome浏览器版本匹配,避免无法获取
HttpOnly类型Cookie的问题。
内容的提问来源于stack exchange,提问作者Malay Patra
相关产品推荐
相关产品推荐

