webentwicklung-frage-antwort-db.com.de

Cookies können in Selenium Webdriver nicht gesetzt werden

Ich versuche, Cookies zu einem Link hinzuzufügen, bevor ich ihn mit einem Webtreiber öffne, aber es wird mir immer diese Fehlermeldung angezeigt:

org.openqa.Selenium.UnableToSetCookieException: Cookie kann nicht gesetzt werden (WARNUNG: Der Server hat keine Stacktrace-Informationen bereitgestellt.)

Bitte finden Sie meinen Code unten: 

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

Bitte helfen Sie mit einer entsprechenden Lösung. 

4
David.M

Sie erstellen den Cookie, bevor Sie zur Site navigieren. Wenn Sie versuchen, ein Cookie in der Domäne www.example.com zu erstellen, möchten Sie zu einer Seite dieser Domäne navigieren, das Cookie erstellen und dann den Test starten.

Nach meiner Lektüre vor einer Weile ist es am besten, zu einer Seite zu navigieren, von der Sie wissen, dass sie auf der Domain nicht vorhanden ist, z. www.example.com/this404page und erstellen Sie dann den Cookie. Es sollte viel schneller geladen werden, da es sich um eine Fehlerseite handelt und nicht viel Inhalt enthalten sollte. Starten Sie nach dem Erstellen des Cookies auf der 404-Seite den Test.

9
JeffC

Sie können dies nicht tun, da die WebDriver-Spezifikation es erfordert, dass der Browser bei der Domäne gelandet ist, für die Sie Cookies setzen möchten. 

Die genannte Problemumgehung besteht darin, vor dem Setzen des Cookies die Seite aufzurufen. Aber das verursacht einige Probleme:

Dies verhindert leider zwei wichtige Anwendungsfälle:

  1. Sie möchten in einer neuen Sitzung Cookies aus einer anderen Webdriver-Sitzung wiederverwenden, um zu vermeiden, dass die zum Abrufen der Cookies erforderliche Arbeit wiederholt wird. Zum Beispiel muss ein Login wiederholt werden.
  2. Erlauben, dass ein Webdriver-Pool von nicht verwandten Threads gemeinsam genutzt wird, wobei jeder Thread über eigene Cookies verfügen kann.

Die Web-Treiber-Spezifikation muss dies eindeutig berücksichtigen. Ich habe hier eine Ausgabe geöffnet: 

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

Gib ein paar Stimmen. Alle Browser sollten eine Möglichkeit entwickeln, um damit umzugehen. 

6

Navigieren Sie zuerst zu URL und versuchen Sie dann, Cookies hinzuzufügen. 

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 

Ersetzen Sie Ihren Code durch:

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
iamsankalp89

Das Hinzufügen von Cookies vor dem Navigieren zur Domäne wird als domänenlose Cookies bezeichnet, die meines Erachtens nicht möglich sind.

Ich habe keinen Weg gefunden, einen Cookie vor der URL abzulegen, aber ich denke, das folgende Szenario kann Ihnen helfen,

  1. Erstellen Sie eine Factory-Klasse, um Web-Treiber-Instanzen zu erstellen
  2. Bevor Sie die Webdriver-Instanz zurückgeben, navigieren Sie zu einer beliebigen Seite in der getesteten Domäne, legen Sie den Cookie ab und navigieren Sie im Browser zurück.
  3. Ihr Test kann jetzt beginnen, ohne zu wissen, dass die Navigation und das Löschen von Cookies stattgefunden haben
2
Kapil

Für den Fall, dass dies einfacher ist, musste ich keine Factory-Klasse erstellen, sondern nur die Stammseite von der Site laden (die kein Cookie erfordert).

Sammeln Sie zuerst den Cookie wie oben beschrieben

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

Holen Sie sich dann das Website-Stammverzeichnis, für das kein Cookie erforderlich ist (in meinem Fall).

driver.get(url_root)

Führen Sie dann das Laden des Cookies aus

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

Dann gehe auf die Seite, auf die ich eigentlich zugreifen wollte

driver.get(url_not_root_demanding_cookie_which_is_now_there)

Bitte posten Sie, wenn ein Problem mit diesem Ansatz vorliegt

0
nerak99