我有一个关于selenium的代码来测试表单。但首先我转到另一个页面,然后重定向到我的页面。当我将cookie设置为新域时,我收到错误:
Exception in thread "main" org.openqa.selenium.InvalidCookieDomainException: You may only set cookies for the current domain
我的代码:
//it is going to example.com and example redirect me to the "example.com" all cookie domains is "example.com"
driver.get("http://www.example.com?id=1");
Set<Cookie> cookies = driver.manage().getCookies();
Iterator<Cookie> itr = cookies.iterator();
while (itr.hasNext()){
Cookie c = itr.next();
System.out.println("Cookie Name: " + c.getName() + " --- " + "Cookie Domain: " + c.getDomain() + " --- " + "Cookie Value: " + c.getValue());
driver.manage().addCookie(c);
}
我该如何管理?我必须为example.com获取/设置cookie
答案 0 :(得分:7)
为什么不将浏览器重定向到&#34; example.com&#34;在添加cookie之前。进入该域后,添加您从&#34; example.com&#34;中获取的Cookie值。并刷新页面?
根据项目跟踪器上的the answer by the team on this issue,
Cookie方法仅对可见的cookie起作用 是唯一能够在所有方面始终如一地工作的东西 浏览器。您看到的行为是预期的行为。
答案 1 :(得分:3)
如前面的答案所述,这是预期的行为。
迄今为止唯一的工作是driver.get("domain.com/404")
页面。但由于SSO经常保护domain.com/*
我在规范https://github.com/w3c/webdriver/issues/1238
上发布了新的功能请求使404 404解决方法始终有效。
webdriver规范 https://w3c.github.io/webdriver/webdriver-spec.html#add-cookie部队 当前浏览器会话将在您要添加的域中 饼干给。
这很有意义,我也同意。
这不幸地阻止了两个关键用例:
您希望重新使用其他webdriver会话中的Cookie 会话,以避免重复获取cookie所需的工作。这样 因为必须重复登录。允许共享webdriver池 在不相关的线程中,每个线程可能有自己的线程 饼干。目前唯一的解决办法就是试图逼迫 webdriver转到404错误页面,例如: webdriver.get( “http://the-cookie-domain.com/404adsfasdf”)。这个会 导致页面转到域并允许您添加cookie 的addCookie。但这几乎没有用。因为页面很常见 受SSO保护,任何企图转到http://the-cookie-domain.com/ * 发送到SSO登录页面,例如http://login.ssodomain.com现在 你有同样的问题。
我们应该在规范webdriver.goTo404Page(域)中添加一个新方法 允许这个用例。此方法应模拟404 HTTP状态 来自浏览器中域的代码响应。
或许可能是addCookie允许的新重载, 例如:void addCookie(Cookie var1,String goTo404PageOfDomain);
通过允许用户访问任何给定域的假404页面,这个 保证404页面的解决方法适用于任何页面和这两个使用 案件现在可以。
对于firefox,您可以稍微修改Marionette以删除此项检查。
diff --git a/testing/marionette/cookie.js b/testing/marionette/cookie.js
--- a/testing/marionette/cookie.js
+++ b/testing/marionette/cookie.js
@@ -144,14 +144,14 @@ cookie.add = function(newCookie, {restri
newCookie.domain = "." + newCookie.domain;
}
- if (restrictToHost) {
- if (!restrictToHost.endsWith(newCookie.domain) &&
- ("." + restrictToHost) !== newCookie.domain &&
- restrictToHost !== newCookie.domain) {
- throw new InvalidCookieDomainError(`Cookies may only be set ` +
- `for the current domain (${restrictToHost})`);
- }
- }
+// if (restrictToHost) {
+// if (!restrictToHost.endsWith(newCookie.domain) &&
+// ("." + restrictToHost) !== newCookie.domain &&
+// restrictToHost !== newCookie.domain) {
+// throw new InvalidCookieDomainError(`Cookies may only be set ` +
+// `for the current domain (${restrictToHost})`);
+// }
+// }
// remove port from domain, if present.
// unfortunately this catches IPv6 addresses by mistake
diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -2638,9 +2638,9 @@ GeckoDriver.prototype.addCookie = functi
let {protocol, hostname} = this.currentURL;
const networkSchemes = ["ftp:", "http:", "https:"];
- if (!networkSchemes.includes(protocol)) {
- throw new InvalidCookieDomainError("Document is cookie-averse");
- }
+// if (!networkSchemes.includes(protocol)) {
+// throw new InvalidCookieDomainError("Document is cookie-averse");
+// }
let newCookie = cookie.fromJSON(cmd.parameters.cookie);
diff --git a/testing/marionette/test_cookie.js b/testing/marionette/test_cookie.js
--- a/testing/marionette/test_cookie.js
+++ b/testing/marionette/test_cookie.js
@@ -190,10 +190,10 @@ add_test(function test_add() {
});
equal(2, cookie.manager.cookies.length);
- Assert.throws(() => {
- let biscuit = {name: "name3", value: "value3", domain: "domain3"};
- cookie.add(biscuit, {restrictToHost: "other domain"});
- }, /Cookies may only be set for the current domain/);
+// Assert.throws(() => {
+// let biscuit = {name: "name3", value: "value3", domain: "domain3"};
+// cookie.add(biscuit, {restrictToHost: "other domain"});
+// }, /Cookies may only be set for the current domain/);
cookie.add({
name: "name4",