You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium无法复用已认证会话问题排查

Selenium复用Cookies后仍无法保持登录状态的问题

背景

我用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,这两个没有被捕获到,而且它们的值会随页面刷新或加载变化。


问题分析与解决方案

核心问题

  1. 添加Cookies的时机错误:第二次启动浏览器后,先点击登录按钮跳转到登录页面再添加Cookies,此时Cookie的域不匹配,导致无法生效。
  2. 未捕获关键会话Cookie:AWSALB和AWSALBCORS是保持登录状态的关键Cookie,它们属于residencyexplorer.org域,但当前代码只捕获了.aamc.org域的Cookie。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:15:54