web-dev-qa-db-ja.com

Selenium WebdriverでCookieを設定できません

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

関連するソリューションを手伝ってください。

16
David.M

サイトに移動する前にCookieを作成しています。ドメインwww.example.comでCookieを作成しようとしている場合、そのドメインの一部のページに移動し、Cookieを作成してからテストを開始します。

しばらく前に読んだことから、これを行う最良の方法は、ドメインには存在しないとわかっているページに移動することです。 www.example.com/this404pageから、Cookieを作成します。エラーページであり、多くのコンテンツが含まれていないため、読み込みがずっと速くなります。 404ページでCookieを作成したら、テストを開始します。

20
JeffC

WebDriverの仕様では、Cookieを設定しようとしているドメインにブラウザを設定する必要があるため、これを行うことはできません。

前述の回避策は、Cookieを設定する前にページに移動することです。しかし、それはいくつかの問題を引き起こします:

これにより、残念ながら次の2つの主要なユースケースが防止されます。

  1. 新しいセッションで別のWebdriverセッションからのCookieを再利用して、Cookieを取得するために必要な作業を繰り返さないようにします。ログインを繰り返す必要があるなど。
  2. Webdriverプールを、各スレッドが独自のCookieを持つ可能性のある無関係なスレッド間で共有できるようにします。

ウェブドライバーの仕様では、明らかにこれを考慮する必要があります。私はここで問題を開きました:

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

投票してください。すべてのブラウザは、これを処理する方法を開始する必要があります。

9

最初に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);
5
iamsankalp89

ドメインに移動する前にCookieを追加することは、ドメインレスCookieと呼ばれますが、これは不可能だと思います。

URLの前にCookieをドロップする方法を見つけていませんが、以下のシナリオがあなたを助けるかもしれないと思います。

  1. ファクトリクラスを作成してWebdriverインスタンスを作成する
  2. Webdriverインスタンスを返す前に、テスト中のドメインの任意のページに移動し、Cookieをドロップしてから、ブラウザーに戻ります。
  3. これで、ナビゲーションとCookieドロップが行われたことに気付かずにテストを開始できます
2
Kapil

これがより簡単な場合に備えて、ファクトリクラスを作成する必要はなく、サイトからルートページを読み込むだけです(Cookieを要求しませんでした)。

最初に上記のようにCookieを収集します

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

次に、Cookieを必要としないWebサイトのルートを取得します(私の場合)

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)

このアプローチに問題がある場合は投稿してください

1
nerak99