Selenium cookie с другим доменом

у меня есть код на Selenium для тестирования формы. Но сначала я перехожу на другую страницу, а затем перенаправляю на мою страницу. Когда я установил cookies в новый домен, я получил ошибку:

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);
    }

Как я могу это сделать ? Я должен получить / установить cookies для example.com

2 ответов


Почему бы не перенаправить браузер на "example.com-перед добавлением печенья. После того, как в этом домене, добавьте значения cookie, которые вы взяли из "example.com - а обновление страницы?

по состоянию на ответ команды по этому вопросу на трекере проекта,

методы cookies действуют только на cookies, которые будут видны как это это единственное, что можно сделать, чтобы работать последовательно во всех броузеры. Поведение, которое вы см. ожидаемое поведение.


как уже упоминалось в предыдущем ответе, это ожидаемое поведение.

единственная работа вокруг на сегодняшний день является driver.get("domain.com/404") страница. Но это не всегда работает из-за SSO часто защищает domain.com/*

Я сделал новый запрос функции на спецификации:https://github.com/w3c/webdriver/issues/1238

сделать так, чтобы 404 обходной всегда может работать.

спецификация webdriver https://w3c.github.io/webdriver/webdriver-spec.html#add-cookie силы текущий сеанс браузера для домена, в который вы добавляете файл cookie.

Это имеет смысл, и я согласен с этим.

Это, к сожалению, мешает 2 ключевых случаях:

вы хотите повторно использовать cookies из другого сеанса webdriver в новом сессия, чтобы избежать повторения работы, необходимой для получения куки. Такие как повторять логин. Разрешить общий доступ к пулу webdriver среди несвязанных потоков, где каждый поток может иметь собственную cookies. Единственная текущая работа - попытаться заставить webdriver, чтобы перейти на страницу ошибки 404 с чем-то вроде: с WebDriver.вам("http://the-cookie-domain.com/404adsfasdf"). Это заставьте страницу перейти в домен и позволит вам добавить cookies с addcookie метод. Но это почти никогда не работает. Потому что страница очень часто защищенный SSO, любая попытка перейти к http://the-cookie-domain.com/* отправляет вас на страницу входа SSO, например http://login.ssodomain.com и теперь у вас та же проблема.

мы должны добавить новый метод в spec webdriver.goTo404Page (домен) чтобы разрешить этот случай. Этот метод должен имитировать состояние HTTP 404 код ответа от домена в браузере.

альтернативно, возможно, новая перегрузка для addCookie может позволить это, например: void addCookie (Cookie var1, строка goTo404PageOfDomain);

позволяя пользователям перейти на поддельную страницу 404 любого данного домена, это гарантирует, что обходной путь 404-страницы работает для любой страницы, и эти 2 используют теперь возможны случаи.

для firefox вы можете немного изменить марионетку, чтобы просто удалить эту проверку.

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",