selenium.common.exceptions.InvalidCookieDomainException: Сообщение: недопустимый домен cook ie при выполнении тестов в Django с Selenium - PullRequest
2 голосов
/ 23 января 2020

Я настраиваю тесты для chrome и firefox с использованием seleniumgrid. Я использую docker images, селен-концентратор и узел селена- chrome и узел- 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

1 Ответ

3 голосов
/ 23 января 2020

Это сообщение об ошибке ...

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

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


Подробности

В соответствии со стандартными спецификациями HTML a Document Object могут быть отнесены к объекту Document * -averse, относящемуся к готовке, в следующих случаях:

  • Документ, который не имеет Browsing Context.
  • Документ, схема URL которого не является сетевой схемой.

Глубокое погружение

Согласно Недопустимый повар ie домен эта ошибка может возникать, если текущий домен будет example.com, поэтому невозможно добавить повар ie для домена example.org.

Например:

  • Пример кода:

    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/
    

Решение

Если вы сохранили повар ie из домена example.com, эти сохраненные куки могут ' т быть протолкнутым Сессия веб-драйвера для любого другого домена, например example.edu. Сохраненные куки могут быть использованы только в пределах example.com. Кроме того, чтобы автоматически войти в систему в будущем, необходимо сохранять файлы 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()

Позже, если вы хотите, чтобы пользователь автоматически войдя в систему, вам необходимо сначала перейти к указанному c домену / 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 . В идеале вам необходимо убедиться, что:


Ссылка

Подробное обсуждение можно найти в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...