org.openqa.selenium.InvalidCookieDomainException:文档是使用 Selenium 和 WebDriver 的 cookie-averse
Posted
技术标签:
【中文标题】org.openqa.selenium.InvalidCookieDomainException:文档是使用 Selenium 和 WebDriver 的 cookie-averse【英文标题】:org.openqa.selenium.InvalidCookieDomainException: Document is cookie-averse using Selenium and WebDriver 【发布时间】:2018-06-29 08:39:06 【问题描述】:我正在尝试将 cookie 推送到之前会话中存储的 selenium firefox webdriver,但出现错误:
org.openqa.selenium.InvalidCookieDomainException: Document is cookie-averse
我读了这个html Standard Cookie-averse,但什么都不懂。
那么,问题是如何将 cookie 推送到之前存储的 webdriver session 中?
【问题讨论】:
【参考方案1】:谢谢DebanjanB! 我尝试在驱动程序启动后和在打开 URL 选项卡之后推送 cookie。
工作解决方案:
driver.get('http://mydomain')
driver.manage.addCookie(....)
driver.get('http://mydomain')
只需打开一个标签,添加 cookie 并再次重新打开一个标签
【讨论】:
有没有办法避免两次调用.get()
?【参考方案2】:
此错误消息...
org.openqa.selenium.InvalidCookieDomainException: Document is cookie-averse
...表示非法尝试在与当前文档不同的域下设置 cookie。
详情
根据HTML-Living Standard Specification,Document Object
在以下情况下可能被归类为 cookie-averse Document 对象:
Browsing Context
的文档。
其 URL 方案不是网络方案的文档。
深入研究
根据Invalid cookie domain,当您访问不喜欢 cookie 的文档(例如本地磁盘上的文件)时,可能会发生此错误。
举个例子:
示例代码:
from selenium import webdriver
from selenium.common import exceptions
session = webdriver.Firefox()
session.get("file:///home/jdoe/document.html")
try:
foo_cookie = "name": "foo", "value": "bar"
session.add_cookie(foo_cookie)
except exceptions.InvalidCookieDomainException as e:
print(e.message)
控制台输出:
InvalidCookieDomainException: Document is cookie-averse
解决方案
如果您存储了来自域 example.com
的 cookie,这些存储的 cookie不能通过 webdriver 会话推送到任何其他不同的域,例如example.edu
。存储的 cookie 只能在 example.com
内使用。此外,为了将来自动登录用户,您只需存储一次 cookie,即用户登录时。在添加回 cookie 之前,您需要浏览到收集 cookie 的同一域。
示例
例如,您可以在用户登录应用程序后存储 cookie,如下所示:
from selenium import webdriver
import pickle
driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/selenium_aut.php')
driver.find_element_by_name("username").send_keys("abc123")
driver.find_element_by_name("password").send_keys("123xyz")
driver.find_element_by_name("submit").click()
# storing the cookies
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))
driver.quit()
以后如果你想让用户自动登录,你需要先浏览到特定的域/url,然后你必须添加cookies,如下所示:
from selenium import webdriver
import pickle
driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/selenium_aut.php')
# loading the stored cookies
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
# adding the cookies to the session through webdriver instance
driver.add_cookie(cookie)
driver.get('http://demo.guru99.com/test/cookie/selenium_cookie.php')
参考
您可以在以下位置找到详细讨论:
Error when loading cookies into a Python request session【讨论】:
【参考方案3】:我猜你的情况是你用driver.manage.addCookie(....)
设置cookie,然后用driver.get('http://mydomain')
获取url。
Cookie can be only add to the request with same domain. When webdriver init, it's request url is `data:` so you cannot add cookie to it. So first make a request to your url then add cookie, then request you url again.
【讨论】:
如果没有cookie就不能发出请求怎么办?通常,您的浏览器会在后续会话的第一次请求期间提供已存储的 cookie。不幸的是,浏览器使用了临时配置文件,因此不会保存 cookie。 嗯,像driver.Url = "https://<domain>/robots.txt";
这样的东西在大多数情况下是可能的。以上是关于org.openqa.selenium.InvalidCookieDomainException:文档是使用 Selenium 和 WebDriver 的 cookie-averse的主要内容,如果未能解决你的问题,请参考以下文章