无法在 Selenium Webdriver 中设置 cookie

Posted

技术标签:

【中文标题】无法在 Selenium Webdriver 中设置 cookie【英文标题】:Unable to set cookies in Selenium Webdriver 【发布时间】:2018-02-01 05:17:04 【问题描述】:

我正在尝试在使用 webdriver 打开链接之前将 cookie 添加到链接中,但它一直给我这个错误:

org.openqa.selenium.UnableToSetCookieException:无法设置cookie(警告:服务器未提供任何堆栈跟踪信息)

请在下面找到我的代码:

System.setProperty("webdriver.edge.driver","C:\\Program Files\\Latest Webdriver\\MicrosoftWebDrive.exe" );
EdgeDriver = new EdgeDriver();
Thread.sleep(2000);
Cookie cookie = new Cookie("Testing", "11111");
EdgeDriver.manage().addCookie(cookie);
EdgeDriver.get("https://www.google.ca/?gws_rd=ssl"); // The link is an example

请提供相关解决方案。

【问题讨论】:

【参考方案1】:

您在导航到该站点之前创建了 cookie。如果您尝试在域 www.example.com 上创建 cookie,那么您需要导航到该域上的某个页面,创建 cookie,然后开始测试。

从我不久前的阅读来看,最好的方法是导航到您知道该域中不存在的某个页面,例如www.example.com/this404page,然后创建 cookie。它应该加载得更快,因为它是一个错误页面并且不应该包含太多内容。在 404 页面上创建 cookie 后,开始测试。

【讨论】:

如此明显,但我犯了同样的错误...... :) 对我来说这是解决方案。谢谢杰夫!【参考方案2】:

您无法执行此操作,因为 WebDriver 规范要求您将浏览器登录到您尝试为其设置 cookie 的域。

上述解决方法是在设置 cookie 之前转到该页面。但这会导致一些问题:

不幸的是,这阻止了 2 个关键用例:

    您希望在新会话中重复使用来自另一个 webdriver 会话的 cookie,以避免重复获取 cookie 所需的工作。例如必须重复登录。 允许在不相关的线程之间共享 webdriver 池,其中每个线程可能有自己的 cookie。

webdriver 规范显然需要考虑到这一点。我在这里打开了一个问题:

https://github.com/w3c/webdriver/issues/1238

给它一些投票。所有浏览器都应该开始携带一种方法来处理这个问题。

【讨论】:

【参考方案3】:

首先导航到 URL,然后尝试添加 cookie,试试下面的代码:

System.setProperty("webdriver.edge.driver","C:\\Program Files\\Latest Webdriver\\MicrosoftWebDrive.exe" );
EdgeDriver = new EdgeDriver();
Thread.sleep(2000);
Cookie cookie = new Cookie("Testing", "11111");
EdgeDriver.manage().addCookie(cookie);
EdgeDriver.get("https://www.google.ca/?gws_rd=ssl"); // The link is an example 

将您的代码替换为:

System.setProperty("webdriver.edge.driver","C:\\Program Files\\Latest Webdriver\\MicrosoftWebDrive.exe" );
EdgeDriver = new EdgeDriver();
Thread.sleep(2000);
EdgeDriver.get("https://www.google.ca/?gws_rd=ssl"); // The link is an example 
Cookie cookie = new Cookie("Testing", "11111");
EdgeDriver.manage().addCookie(cookie);

【讨论】:

【参考方案4】:

在导航到域之前添加 cookie 称为无域 cookie,我认为这是不可能的。

我还没有找到在 url 之前放置 cookie 的方法,但我认为下面的场景可能会对您有所帮助-

    创建工厂类以创建 webdriver 实例 在返回 webdriver 实例之前,导航到被测域上的任何页面,然后删除 cookie,然后返回浏览器。 您的测试现在可以开始了,但您并不知道导航和 cookie 已发生删除

【讨论】:

【参考方案5】:

以防万一这更简单,我不需要创建工厂类,只需从站点加载根页面(不需要 cookie)

首先按上述方式收集cookie

pickle.dump(driver.get_cookies(), open("ChromeCookies.pkl", "wb"))

然后获取不需要cookie的网站根目录(在我的情况下)

driver.get(url_root)

然后执行cookie加载

for cookie in pickle.load(open("ChromeCookies.pkl", "rb")):
driver.add_cookie(cookie)

然后转到我真正想访问的页面

driver.get(url_not_root_demanding_cookie_which_is_now_there)

如果这种方法有问题,请发帖

【讨论】:

以上是关于无法在 Selenium Webdriver 中设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Selenium WebDriver 中设置浏览器宽度和高度?

Selenium Webdriver - 设置首选浏览器语言DE

远程 Selenium WebDriver 不响应 Cucumber 测试

无法使用 Selenium 和页面工厂在页面对象类中调用“org.openqa.selenium.WebDriver.getTitle()”

如何在不同浏览器中运行Selenium WebDriver?

无法在 python selenium 中使用 selenium chrome webdriver 定位元素