Selenium WebDriver 添加 Cookie 实现免登录详解

Ryan
Ryan
发布时间:2026-10-14 | 6人浏览过
原创

本文详解 Selenium WebDriver 中 add_cookie 方法的用法,解析 cookie_dict 参数结构,并针对 'unable to set cookie' 报错提供解决方案。通过先加载目标域名再添加 Cookie 的技巧,实现浏览器自动化登录状态的复用与绕过验证。

Selenium WebDriver 操作 Cookie 常用方法

Selenium WebDriver 提供了操作 Cookie 的基础方法,主要包括获取、添加、删除特定及全部 Cookie 的功能。

具体涉及的方法包括:获取当前会话的所有 Cookie 信息、向当前会话添加指定 Cookie、删除指定名称的 Cookie 以及清除所有 Cookie。

  • get_cookies() 用于获取当前会话中的所有 Cookie 数据。
  • add_cookie(cookie_dict) 用于向当前会话添加一个 Cookie 对象。
  • delete_cookie(name) 用于删除指定名称的 Cookie。
  • delete_all_cookies() 用于删除当前会话中的所有 Cookie。

add_cookie 方法参数详解

重点介绍 add_cookie() 方法的具体使用方式及其参数要求。

首先查看源码中的文档字符串说明,了解其基本用法。

源码文档展示了 add_cookie 的基本调用形式,代码如下:


def add_cookie(self, cookie_dict):
    """
    Adds a cookie to your current session.

    :Args:
     - cookie_dict: A dictionary object, with required keys - "name" and "value";
      optional keys - "path", "domain", "secure", "expiry"

    Usage:
      driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
      driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
      driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})

    """
    self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})

从源码可见,add_cookie 接收一个字典参数 cookie_dict。该字典必须包含 'name' 和 'value' 两个键,可选键包括 'path'、'domain'、'secure' 和 'expiry'。需注意,源码注释中遗漏了 'httponly' 这一可选键。

以下是各键名的具体含义说明:

  • name:Cookie 的名称,用于标识该 Cookie。
  • value:Cookie 对应的值,通常由服务器动态生成。
  • domain:设置 Cookie 有效的服务器域名。
  • expiry:Cookie 的过期时间,即有效终止日期。
  • path:定义 Web 服务器上哪些路径下的页面可以访问该 Cookie。
  • httpOnly:设置此标志可防止客户端脚本通过 document.cookie 访问 Cookie,从而降低跨站脚本攻击风险。
  • secure:标记该 Cookie 仅通过加密协议(如 HTTPS)传输,确保浏览器与服务器间通信的安全性。

添加 Cookie 实例与报错解决

接下来通过具体实例演示如何获取并添加 Cookie,重点解决常见报错问题。

第一步,手动执行登录操作。打开 Chrome 浏览器调试工具(F12),切换到 Network 面板,勾选 Preserve log 并筛选 XHR 请求。

第二步,点击登录按钮。在调试工具的 Network 面板中找到 login 请求,查看 Response Headers,即可看到服务器返回给浏览器的 Cookie 信息。

第三步,编写 Python 代码实现自动添加 Cookie。这一步骤最容易出现问题,需特别注意。


from selenium import webdriver

driver = webdriver.Chrome()
cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
      'name': 'ketangpai_home_remember'}

driver.add_cookie(cookie_dict=cookies)
driver.get(https://www.ketangpai.com/Main/index.html)

初次运行代码时,可能会遇到报错:Message: unable to set cookie。


Traceback (most recent call last):
 File "D:/python_workshop/python6/selenium_webdriver/add_cookies的使用(二).py", line 9, in <module>
  driver.add_cookie(cookie_dict=cookies)
 File "D:\Program\python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 872, in add_cookie
  self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
 File "D:\Program\python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 312, in execute
  self.error_handler.check_response(response)
 File "D:\Program\python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
  raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unable to set cookie
 (Session info: chrome=66.0.3359.139)
 (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 6.1.7600 x86_64)

第四步,修改代码以解决上述报错。

关键提示:必须首先加载目标网站,Selenium 才能确定 Cookie 所属的域名。即使加载页面的操作本身对功能无直接贡献,这也是必要的步骤。

只需在原有代码中增加一行 driver.get(url),其中 url 填写如 'https://www.ketangpai.com/User/login.html' 或 'https://www.ketangpai.com/Main/index.html' 等同一域名的地址即可。浏览器会自动跳转至登录页面,从而解决域名不匹配的问题。


from selenium import webdriver

driver = webdriver.Chrome()
cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
      'name': 'ketangpai_home_remember'}

driver.get("https://www.ketangpai.com/User/login.html")
driver.add_cookie(cookie_dict=cookies)
driver.get(https://www.ketangpai.com/Main/index.html)

再次运行代码,发现 Cookie 添加成功,程序正常执行。

通过代码获取并复用 Cookie

除了通过浏览器调试工具手动获取,还可以通过抓包工具或代码自动获取 Cookie。

答案是肯定的,可以通过代码自动化获取并复用 Cookie。

参考前述步骤,编写以下代码:首先使用 driver1 发送用户名和密码完成登录,获取并保存 Cookie;然后使用 driver2 添加 driver1 保存的 Cookie,从而实现绕过登录界面直接进入主页的目的。


from selenium import webdriver
import time

#driver1登录网站,获得cookie并保存
driver1 = webdriver.Chrome()
driver1.get("https://www.ketangpai.com/User/login.html")
driver1.maximize_window()
time.sleep(2)

#第一次通过send_keys向输入框发送用户名密码登录
driver1.find_element_by_xpath("//input[@name='account']").send_keys("your username")
driver1.find_element_by_xpath("//input[@name='pass']").send_keys("your password")
time.sleep(2)
driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='auto-login fl']").click()
time.sleep(3)
driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='btn-btn']").click()
time.sleep(6)
#用get_cookies的方法得到登录后的cookie,这个cookie是个列表,列表中两个元素都是字典,第一个是登录前的cookie,第二个是登录后的cookie
#将cookie保存在变量savedCookies中
savedCookies = driver1.get_cookies()
print(savedCookies)

#driver2得到driver1的cookie,先删除自己的所有cookie,再将driver1的cookie添加进来
driver2 = webdriver.Chrome()
#必须首先加载网站,这样selenium才知道cookie是属于哪个网站的
driver2.get("https://www.ketangpai.com/User/login.html")
#一旦加载网站,即使没登录,也会产生一个cookie,所以这个cookie被删除了
driver2.delete_all_cookies()
#遍历savedCookies中的两个元素
for cookie in savedCookies:
  #k代表着add_cookie的参数cookie_dict中的键名,这次我们要传入这5个键
  for k in {'name', 'value', 'domain', 'path', 'expiry'}:
    #cookie.keys()属于'dict_keys'类,通过list将它转化为列表
    if k not in list(cookie.keys()):
      #saveCookies中的第一个元素,由于记录的是登录前的状态,所以它没有'expiry'的键名,我们给它增加
      if k == 'expiry':
        t = time.time()
        cookie[k] = int(t)  #时间戳s
  #将每一次遍历的cookie中的这五个键名和键值添加到cookie
  driver2.add_cookie({k: cookie[k] for k in {'name', 'value', 'domain', 'path', 'expiry'}})

#加载我们想要看到的页面的url
driver2.get("https://www.ketangpai.com/Main/index.html")
#再次打印driver2的cookie
print(driver2.get_cookies())

需要注意,Cookie 分为会话级和持久级(有有效期)。会话级 Cookie 在浏览器会话结束(关闭浏览器或断开连接)后失效,因此无法通过 add_cookie 方法直接复用,必须使用有有效期的 Cookie。

以上介绍了 Selenium 中添加 Cookie 的完整流程及注意事项,希望能为相关学习提供帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表