web-dev-qa-db-fra.com

Impossible de définir des cookies dans Selenium Webdriver

J'essaie d'ajouter des cookies à un lien avant de l'ouvrir avec Webdriver, mais il continue de me donner l'erreur suivante:

org.openqa.Selenium.UnableToSetCookieException: impossible de définir un cookie (AVERTISSEMENT: le serveur n'a fourni aucune information sur le chemin de pile)

Veuillez trouver mon code ci-dessous: 

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

S'il vous plaît aider avec une solution pertinente. 

4
David.M

Vous créez le cookie avant de naviguer sur le site. Si vous essayez de créer un cookie sur le domaine www.example.com, vous souhaitez naviguer vers une page de ce domaine, créer le cookie, puis lancer votre test.

D'après ce que j'ai lu il y a quelque temps, la meilleure façon de le faire est de naviguer vers une page dont vous savez qu'elle n'existe pas sur le domaine, par exemple. www.example.com/this404page, puis créez le cookie. Il devrait se charger beaucoup plus rapidement car c'est une page d'erreur et ne devrait pas contenir beaucoup de contenu. Après avoir créé le cookie sur la page 404, démarrez votre test.

9
JeffC

Vous ne pouvez pas effectuer cette opération car la spécification WebDriver requiert que le navigateur se trouve sur le domaine pour lequel vous essayez de définir des cookies. 

La solution consiste à aller sur la page avant de définir le cookie. Mais cela cause quelques problèmes:

Cela empêche malheureusement 2 cas d'utilisation clés:

  1. Vous souhaitez réutiliser les cookies d'une autre session webdriver dans une nouvelle session pour éviter de répéter le travail nécessaire à l'obtention des cookies. Tels que devoir répéter une connexion.
  2. Autoriser le partage d'un pool de pilotes Web entre des threads sans lien, chaque thread pouvant posséder ses propres cookies.

La spécification Webdriver doit clairement en tenir compte. J'ai ouvert un problème ici: 

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

Donnez-lui des votes. Tous les navigateurs devraient commencer à trouver un moyen de gérer cela. 

6
Nicholas DiPiazza

Naviguez d'abord vers l'URL, puis essayez d'ajouter des cookies, essayez le code ci-dessous: 

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 

Remplacez votre code par ceci:

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

L'ajout de cookies avant d'accéder au domaine s'appelle des cookies sans domaine, ce qui, à mon avis, n'est pas possible.

Je n'ai pas trouvé de moyen de déposer un cookie avant l'URL, mais je pense que le scénario ci-dessous pourrait vous aider à sortir.

  1. Créer une classe de fabrique pour créer des instances webdriver
  2. Avant de renvoyer l'instance webdriver, accédez à une page du domaine à tester, supprimez le cookie, puis naviguez dans le navigateur.
  3. Votre test peut maintenant commencer, ignorant que la navigation et la suppression des cookies ont eu lieu
2
Kapil

Au cas où cela serait plus simple, je n’aurais pas besoin de créer une classe d’usine, mais simplement de charger la page racine du site (ce qui n’exigeait pas de cookie)

Commencez par collecter le cookie comme décrit ci-dessus

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

Ensuite, obtenez la racine du site Web qui ne nécessite pas de cookie (dans mon cas)

driver.get(url_root)

Puis exécutez le chargement de cookies

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

Ensuite, allez à la page que je voulais réellement accéder

driver.get(url_not_root_demanding_cookie_which_is_now_there)

S'il vous plaît, postez s'il y a un problème avec cette approche

0
nerak99