web-dev-qa-db-ja.com

selenium.common.exceptions.InvalidCookieDomainException:メッセージ:テストをDjango= Seleniumで実行中に無効なcookieドメイン

chromeとseleniumgridを使用したfirefoxの両方のテストを設定しています。以下のようにdockerイメージSelenium-hubとSelenium node-chromeとnode-firefoxを使用しています。

  app:
    build: .
    command: gunicorn --reload --capture-output --log-level debug --access-logfile - -w 3 -b 0.0.0.0 app.wsgi
    restart: always
    volumes_from:
        - initialize
    ports:
      - "8000:8000"
    links:
      - db
      - rabbitmq
      - Selenium_hub
    env_file: secrets.env
    volumes:
        - ./app/:/code/

  Selenium_hub:
    image: Selenium/hub
    ports:
      - 4444:4444
    expose:
      - 4444
    tty: true
    environment:
      - GRID_MAX_SESSION=20
      - GRID_NEW_SESSION_WAIT_TIMEOUT=60000
      - GRID_BROWSER_TIMEOUT=300
      - GRID_TIMEOUT=300
      - TIMEOUT=300
  node_1:
    image: Selenium/node-chrome
    depends_on:
      - Selenium_hub
    environment:
      - HUB_Host=Selenium_hub
      - HUB_PORT=4444
      - NODE_MAX_SESSION=3
      - NODE_MAX_INSTANCES=2
    shm_size: 2GB
  node_2:
    image: Selenium/node-firefox
    environment:
      - HUB_Host=Selenium_hub
      - HUB_PORT=4444
      - NODE_MAX_SESSION=3
      - NODE_MAX_INSTANCES=2
    shm_size: 2GB
    depends_on:
      - Selenium_hub

テストを実行しようとすると、常にこのエラーInvalidCookieDomainException: Message: invalid cookie domainが発生します。すでにドメインをself.live_server_urlに設定しています。以下は、テスト設定での完全なトレースバックです。

  Traceback (most recent call last):
    File "/code/frontend/tests/test_user_auth.py", line 75, in setUp
        "port": "8082",
    File "/usr/local/lib/python3.5/site-packages/Selenium/webdriver/remote/webdriver.py", line 894, in add_cookie
        self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
    File "/usr/local/lib/python3.5/site-packages/Selenium/webdriver/remote/webdriver.py", line 321, in execute
        self.error_handler.check_response(response)
    File "/usr/local/lib/python3.5/site-packages/Selenium/webdriver/remote/errorhandler.py", line 242, in check_response
        raise exception_class(message, screen, stacktrace)
    Selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
    (Session info: chrome=77.0.3865.75)

テスト リファレンスチュートリアル

class TestUserCreate(StaticLiveServerTestCase):
    fixtures = ["test.json"]
    port = 8082

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        caps = {
            "browserName": os.getenv("BROWSER", "chrome"),
            "javascriptEnabled": True,
         }
        cls.driver = webdriver.Remote(
            command_executor="http://Selenium_hub:4444/wd/hub",
            desired_capabilities=caps,
         )
        cls.driver.implicitly_wait(10)

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()
        super().tearDownClass()

    def setUp(self):
        # Login the user
        self.assertTrue(self.client.login(username="james", password="changemequick"))

        # Add cookie to log in the browser
        cookie = self.client.cookies["sessionid"]
        self.driver.get(self.live_server_url + reverse("find_patient"))
        self.driver.add_cookie(
            {
                "name": "sessionid",
                "value": cookie.value,
                "domain": "localhost"
            }
         )
        super().setUp()

    def test_form_loader(self):
        # test forms loader is functioning properly

        driver = self.driver
        driver.get(self.live_server_url + "/accounts/login/")

        driver.find_element_by_xpath("//input[@type='submit']").click()
        driver.get_screenshot_as_file("login.png")
        assert len(driver.find_elements_by_css_selector(".loading")) == 0
3
StackEdd

このエラーメッセージ...

Selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain

...現在のドキュメントとは異なるドメインでCookieを設定しようとする違法な試みが行われたことを意味します。


細部

HTML-Living Standard Specs のとおり、Document Objectは、次の状況ではcookie-averse Documentオブジェクトとして分類される場合があります。

  • Browsing Contextがないドキュメント。
  • URLのスキームがネットワークスキームではないドキュメント。

ディープダイブ

Invalid cookie domain のように、現在のドメインがexample.comである場合、このエラーが発生する可能性があります。ドメインexample.orgにCookieを追加することはできません。

例として:

  • サンプルコード:

    from Selenium import webdriver
    from Selenium.common import exceptions
    
    session = webdriver.Firefox()
    session.get("https://example.com/")
    try:
        cookie = {"name": "foo",
              "value": "bar",
              "domain": "example.org"}
        session.add_cookie(cookie)
    except exceptions.InvalidCookieDomainException as e:
        print(e.message)
    
  • コンソール出力:

    InvalidCookieDomainException: https://example.org/
    

解決

ドメインexample.comからCookieを保存した場合、これらの保存されたCookieは、Webドライバーセッションを介して他の異なるドメインにプッシュできませんexample.edu。保存されたCookieはexample.com内でのみ使用できます。さらに、今後ユーザーを自動的にログインするには、Cookieを1回だけ保存する必要があります。そのとき、ユーザーはログインします。Cookieを追加する前に、Cookieが収集されたのと同じドメインにアクセスする必要があります。


例として、ユーザーがアプリケーション内で次のようにログインしたら、Cookieを保存できます。

from Selenium import webdriver
import pickle

driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/Selenium_aut.php')
driver.find_element_by_name("username").send_keys("abc123")
driver.find_element_by_name("password").send_keys("123xyz")
driver.find_element_by_name("submit").click()

# storing the cookies
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))
driver.quit()

後でユーザーが自動的にログインできるようにする場合は、最初に特定のドメイン/ urlを参照する必要があり、次に次のようにCookieを追加する必要があります。

from Selenium import webdriver
import pickle

driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/Selenium_aut.php')

# loading the stored cookies
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    # adding the cookies to the session through webdriver instance
    driver.add_cookie(cookie)
driver.get('http://demo.guru99.com/test/cookie/Selenium_cookie.php')

追加の考慮事項

chrome = 77.0.3865.75を使用しているようです。理想的には、次のことを確認する必要があります。


参照

詳細なディスカッションは次の場所にあります。

5
DebanjanB