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,源码如下:
defadd_cookie(self,cookie_dict): """ Addsacookietoyourcurrentsession. :Args: -cookie_dict:Adictionaryobject,withrequiredkeys-"name"and"value"; optionalkeys-"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中键名的含义
- name:cookie的名称
- value:cookie对应的值,动态生成的
- domain:服务器域名
- expiry:Cookie有效终止日期
- path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
- httpOnly:防脚本攻击
- secure:在Cookie中标记该变量,表明只有当浏览器和WebServer之间的通信协议为加密认证协议时
三.实例
第一步:我们先手工做一次登录,打开chrome的调试工具(F12),选择Network—Preservelog—XHR
第二步:点击登录,打开调试工具中的login,可以看到右边ResponseHeaders下面就出现了服务器返回给浏览器的cookie
第三步:python代码的实现,最容易出现问题的可能是这一步
fromseleniumimportwebdriver 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:unabletosetcookie
Traceback(mostrecentcalllast): File"D:/python_workshop/python6/selenium_webdriver/add_cookies的使用(二).py",line9,indriver.add_cookie(cookie_dict=cookies) File"D:\Program\python34\lib\site-packages\selenium\webdriver\remote\webdriver.py",line872,inadd_cookie self.execute(Command.ADD_COOKIE,{'cookie':cookie_dict}) File"D:\Program\python34\lib\site-packages\selenium\webdriver\remote\webdriver.py",line312,inexecute self.error_handler.check_response(response) File"D:\Program\python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py",line242,incheck_response raiseexception_class(message,screen,stacktrace) selenium.common.exceptions.WebDriverException:Message:unabletosetcookie (Sessioninfo:chrome=66.0.3359.139) (Driverinfo:chromedriver=2.35.528161(5b82f2d2aae0ca24b877009200ced9065a772e73),platform=WindowsNT6.1.7600x86_64)
第四步:修改代码,解决问题
"技术提示:必须首先加载网站,这样Selenium才能知道cookie属于哪个网站,即使加载网站的行为对我们没任何用处"
只需要给原来的代码加上一句(红色部分),这个url填"https://www.ketangpai.com/User/login.html"或"https://www.ketangpai.com/Main/index.html"都行,只要是同一个domain就行,浏览器会自动跳转到登录页面:
fromseleniumimportwebdriver 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的可以通过浏览器调试来获取,当然也可以通过抓包工具获取,那么能不能用代码来获取呢?答案是肯定的
参照上面那篇博文,我们完成以下代码,第一次通过driver1发送用户名和密码登录,获取cookie并保存,第二次driver2添加driver1保存的cookie,达到绕过登录的目录
fromseleniumimportwebdriver importtime #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("yourusername") driver1.find_element_by_xpath("//input[@name='pass']").send_keys("yourpassword") time.sleep(2) driver1.find_element_by_xpath("//div[@class='padding-contpt-login']//a[@class='auto-loginfl']").click() time.sleep(3) driver1.find_element_by_xpath("//div[@class='padding-contpt-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中的两个元素 forcookieinsavedCookies: #k代表着add_cookie的参数cookie_dict中的键名,这次我们要传入这5个键 forkin{'name','value','domain','path','expiry'}: #cookie.keys()属于'dict_keys'类,通过list将它转化为列表 ifknotinlist(cookie.keys()): #saveCookies中的第一个元素,由于记录的是登录前的状态,所以它没有'expiry'的键名,我们给它增加 ifk=='expiry': t=time.time() cookie[k]=int(t)#时间戳s #将每一次遍历的cookie中的这五个键名和键值添加到cookie driver2.add_cookie({k:cookie[k]forkin{'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的方法了,因为一次会话过程(从打开浏览器到关闭浏览器,断开连接)结束后它就失效了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。