Запуск тестов django с селеном в докере

Для выполнения тестов я обычно запускаю отдельный контейнер с:

docker-compose run --rm web /bin/bash 

Где сеть – контейнер с джанго. Из оболочки я выполняю py.test время от времени.

Чтобы иметь возможность достичь селена из контейнера с помощью django и позволить браузеру из контейнера селена достичь сервера жизни django, я решил использовать параметр «net», который позволяет контейнерам делиться сетью. Поэтому я добавил его в yml:

 selenium: image: selenium/standalone-firefox net: "container:web" 

К сожалению, это не работает. Я не вижу порт 4444 в контейнере django.

Он работает только в том случае, если вместо net:"container:web" я указываю имя автогенерируемого контейнера, например net:"container:project_web_run_1" .

Также я попытался вместо docker-compose run --rm .... использовать docker-compose up --no-deps изменить параметр command в py.test functional_tests но это тоже не сработало.

Является ли это правом использовать селен с контейнерами?

2 Solutions collect form web for “Запуск тестов django с селеном в докере”

Вот как я это делаю. Основная проблема заключается в том, что запуск docker-compose будет генерировать другое имя хоста (project_container_run_x), где x трудно понять. В итоге я просто ушел от ip-адреса. Я также гарантирую, что DEBUG является ложным, иначе я получаю плохую просьбу.

Я использую StaticLiveServerTestCase следующим образом:

 import os import socket os.environ['DJANGO_LIVE_TEST_SERVER_ADDRESS'] = '0.0.0.0:8000' class IntegrationTests(StaticLiveServerTestCase): live_server_url = 'http://{}:8000'.format( socket.gethostbyname(socket.gethostname()) ) def setUp(self): settings.DEBUG = True self.browser = webdriver.Remote( command_executor="http://selenium:4444/wd/hub", desired_capabilities=DesiredCapabilities.CHROME ) def tearDown(self): self.browser.quit() super().tearDown() def test_home(self): self.browser.get(self.live_server_url) 

Мой файл для создания докеров имеет это для селена и расширяет веб-контейнер (где работает django). Порт 5900 открыт для VNC. Мне нравится держать это изолированным в чем-то вроде docker-compose.selenium.yml

 version: '2' services: web: environment: SELENIUM_HOST: http://selenium:4444/wd/hub TEST_SELENIUM: 'yes' depends_on: - selenium selenium: image: selenium/standalone-chrome-debug ports: - "5900:5900" - version: '2' services: web: environment: SELENIUM_HOST: http://selenium:4444/wd/hub TEST_SELENIUM: 'yes' depends_on: - selenium selenium: image: selenium/standalone-chrome-debug ports: - "5900:5900" 

Я могу запускать тесты вроде

 docker-compose run --rm web ./manage.py test 

Таким образом, мой веб-контейнер получает доступ к селену через хост «селен». Затем Selenium обращается к веб-контейнеру по ip-адресу, который определяется «на лету».

Еще одна проблема заключается в том, что заманчиво просто использовать «сеть» в качестве имени хоста. Если ваша команда запуска команды docker запускает отдельный веб-контейнер – это будет работать. Однако он не будет использовать вашу тестовую базу данных, что сделало бы ее отличным испытанием.

Я только что указал host='web' для LiveServerTestCase . Вот мое рабочее решение.

test.py

 from django.test import LiveServerTestCase from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities class FunctionalTestCase(LiveServerTestCase): host = 'web' def setUp(self): self.browser = webdriver.Remote( command_executor="http://selenium:4444/wd/hub", desired_capabilities=DesiredCapabilities.FIREFOX ) def test_user_registration(self): self.browser.get(self.live_server_url) self.assertIn('Django', self.browser.title) def tearDown(self): self.browser.close() 

docker-compose.yml

 version: '3' services: db: image: postgres web: build: . ports: - "8000:8000" depends_on: - db - selenium selenium: image: selenium/standalone-firefox - version: '3' services: db: image: postgres web: build: . ports: - "8000:8000" depends_on: - db - selenium selenium: image: selenium/standalone-firefox 
  • Как отправить HTTP-аутентификацию с помощью Selenium python-binding webdriver
  • Найти xth td с td содержит в одном и том же tr xpath python
  • Перейти к веб-диалоговому окну в selenium webdriver: Python
  • Вход в веб-сайт с помощью веб-скребок в Python
  • Как сформулировать выражение Xpath в python найти все элементы в круговой диаграмме (кольцо лука)?
  • Автоматические скриншоты при неудаче теста Selenium Webdriver в Python
  • Как извлечь данные с динамических сайтов, таких как Flipkart, используя селен и Scrapy?
  • Сделайте съемку страницы с помощью веб-драйвера Selenium
  • Python - лучший язык программирования в мире.