zoukankan      html  css  js  c++  java
  • selenium webdriver 如何添加cookie

    一. webdriver中常用的cookie方法

    webdriver中提供了操作cookie的相关方法:

    • get_cookies()                   获得cookie信息

    • add_cookie(cookie_dict)        添加cookie

    • delete_cookie(name)             删除特定(部分)的cookie

    • delete_all_cookies()              删除所有的cookie

    二. add_cookie()的用法

    1. 源码中的解释

    源码中简略的向我们展示了如何添加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", "domin", "secure", "expiry",其实源码中还漏了一个:"httponly"

    2. cookie中键名的含义

    这些键名都代表什么意思呢?参考博文《selenium3.7+ python3 添加cookie模拟登陆》,罗列如下

    • name:cookie的名称

    • value:cookie对应的值,动态生成的

    • domain:服务器域名

    • expiry:Cookie有效终止日期

    • path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie

    • httpOnly:防脚本攻击

    • secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时

    三. 实例(以课堂派的登录为例)

    第一步:我们先手工做一次登录,打开chrome的调试工具(F12),选择Network—Preserve log—XHR

    第二步:点击登录,打开调试工具中的login,可以看到右边Response Headers下面就出现了服务器返回给浏览器的cookie

    第三步:python代码的实现,最容易出现问题的可能是这一步

    复制代码
    1 from selenium import webdriver
    2 
    3 driver = webdriver.Chrome()
    4 cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
    5            'name': 'ketangpai_home_remember'}
    6 
    7 driver.add_cookie(cookie_dict=cookies)
    8 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:Programpython34libsite-packagesseleniumwebdriver
    emotewebdriver.py", line 872, in add_cookie
        self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
      File "D:Programpython34libsite-packagesseleniumwebdriver
    emotewebdriver.py", line 312, in execute
        self.error_handler.check_response(response)
      File "D:Programpython34libsite-packagesseleniumwebdriver
    emoteerrorhandler.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: Trying to log in with cookies and get the errorMessage - “Can only set cookies for current domain” or "Unable to set Cookie"

    "技术提示:必须首先加载网站,这样Selenium 才能知道cookie 属于哪个网站,即使加载网站的行为对我们没任何用处"

     只需要给原来的代码加上一句(红色部分),这个url填"https://www.ketangpai.com/User/login.html"或"https://www.ketangpai.com/Main/index.html"都行,只要是同一个domain就行,浏览器会自动跳转到登录页面

    复制代码
    1 from selenium import webdriver
    2 
    3 driver = webdriver.Chrome()
    4 cookies = {'value': 'think%3A%7B%22username%210293%31628193MDAwMDAwMLOGpZaIudFqhc6Gl7LQetmZtmfOk2RhbQ%22%2C%22expire%sfdaaswMDAwMDAwMLOGud6Gqb-whbiCmLOmdZ4%22%2C%22token%22%3A%22MDAwMDAwMDAwMMurrpWavLehhs1-3LLfgduEt4OWepuo123456123KZq6HQxtOK0ZCme5p-q6iZu2yrn4uNhJ3KedDYk7ivboS4it6910926YW0%22%7D',
    5            'name': 'ketangpai_home_remember'}
    6
    7 driver.get("https://www.ketangpai.com/User/login.html")
    8 driver.add_cookie(cookie_dict=cookies)
    9 driver.get("https://www.ketangpai.com/Main/index.html")
    复制代码

    再次运行,发现已经成功了

    四. 获取cookie的方法不止一种

    cookie的可以通过浏览器调试来获取,当然也可以通过抓包工具获取,那么能不能用代码来获取呢?答案是肯定的

    参照上面那篇博文,我们完成以下代码,第一次通过driver1发送用户名和密码登录,获取cookie并保存,第二次driver2添加driver1保存的cookie,达到绕过登录的目录

    复制代码
     1 from selenium import webdriver
     2 import time
     3 
     4 #driver1登录网站,获得cookie并保存
     5 driver1 = webdriver.Chrome()
     6 driver1.get("https://www.ketangpai.com/User/login.html")
     7 driver1.maximize_window()
     8 time.sleep(2)
     9 
    10 #第一次通过send_keys向输入框发送用户名密码登录
    11 driver1.find_element_by_xpath("//input[@name='account']").send_keys("your username")
    12 driver1.find_element_by_xpath("//input[@name='pass']").send_keys("your password")
    13 time.sleep(2)
    14 driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='auto-login fl']").click()
    15 time.sleep(3)
    16 driver1.find_element_by_xpath("//div[@class='padding-cont pt-login']//a[@class='btn-btn']").click()
    17 time.sleep(6)
    18 #用get_cookies的方法得到登录后的cookie,这个cookie是个列表,列表中两个元素都是字典,第一个是登录前的cookie,第二个是登录后的cookie
    19 #将cookie保存在变量savedCookies中
    20 savedCookies = driver1.get_cookies()
    21 print(savedCookies)
    22 
    23 #driver2得到driver1的cookie,先删除自己的所有cookie,再将driver1的cookie添加进来
    24 driver2 = webdriver.Chrome()
    25 #必须首先加载网站,这样selenium才知道cookie是属于哪个网站的
    26 driver2.get("https://www.ketangpai.com/User/login.html")
    27 #一旦加载网站,即使没登录,也会产生一个cookie,所以这个cookie被删除了
    28 driver2.delete_all_cookies()
    29 #遍历savedCookies中的两个元素
    30 for cookie in savedCookies:
    31     #k代表着add_cookie的参数cookie_dict中的键名,这次我们要传入这5个键
    32     for k in {'name', 'value', 'domain', 'path', 'expiry'}:
    33         #cookie.keys()属于'dict_keys'类,通过list将它转化为列表
    34         if k not in list(cookie.keys()):
    35             #saveCookies中的第一个元素,由于记录的是登录前的状态,所以它没有'expiry'的键名,我们给它增加
    36             if k == 'expiry':
    37                 t = time.time()
    38                 cookie[k] = int(t)    #时间戳s
    39     #将每一次遍历的cookie中的这五个键名和键值添加到cookie
    40     driver2.add_cookie({k: cookie[k] for k in {'name', 'value', 'domain', 'path', 'expiry'}})
    41 
    42 #加载我们想要看到的页面的url
    43 driver2.get("https://www.ketangpai.com/Main/index.html")
    44 #再次打印driver2的cookie
    45 print(driver2.get_cookies())
    复制代码

    注意:cookie有两种,一种是会话级别的,一种是有有效期的,会话级别的cookie就不能用add_cookie的方法了,因为一次会话过程(从打开浏览器到关闭浏览器,断开连接)结束后它就失效了

  • 相关阅读:
    SQL-排名函数
    SQL-简单查询
    SQL-判断表是否存在
    HDU1557权利选举
    Bresenham画直线,任意斜率
    LCS最长公共子序列HDU1159
    zoj1276矩阵连乘dp
    OJ的文件流操作
    dp题目
    翻纸牌 高校俱乐部 英雄会 csdn
  • 原文地址:https://www.cnblogs.com/sundahua/p/10202494.html
Copyright © 2011-2022 走看看