Пытаюсь выполнить тестирование Selenium в Django в Docker, получаю ошибку ERR_CONNECTION_REFUSED

Я пытаюсь запустить тестирование Selenium в Docker с помощью Django. Но я продолжаю получать ошибку ERR_CONNECTION_REFUSED при использовании live_server_url. Я пытался использовать контейнер django с помощью f"http://django:{self.port}{reverse('account_login')}" Я также пытался использовать ip-адрес контейнера django, но это тоже не сработало.

Часть selenium в файле docker compose взята из https://github.com/SeleniumHQ/docker-selenium/blob/trunk/docker-compose-v3.yml

файл создания в docker

services:
  django:
    container_name: django_dev
    env_file:
      - ../environments/example.env
    image: &django django
    build:
      context: ..
      dockerfile: docker_development/Dockerfile
    command: python manage.py runserver 0.0.0.0:8006

    volumes:
      - ../site:/code
    ports:
      - "8006:8006"
    depends_on:
      - db

  celery:
    container_name: celery_dev
    image: *django
    restart: 'no'
    entrypoint: celery -A project worker --beat --scheduler django --loglevel=info
    volumes:
      - ../site:/code
    env_file:
      - ../environments/example.env
    depends_on:
      - db
      - rabbitmq3
      - django

  db:
    command: postgres
    container_name: devdb
    image: postgres:17
    restart: 'no' #always
    env_file:
      - ../environments/example.env
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data


  rabbitmq3:
    container_name: "rabbitmq_dev"
    image: rabbitmq:3-management-alpine
    env_file:
      - ../environments/example.env
    ports:
      - "5672:5672"
      - "15672:15672"

  chrome:
    image: selenium/node-chrome:4.35.0-20250808
    platform: linux/amd64
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub

  edge:
    image: selenium/node-edge:4.35.0-20250808
    platform: linux/amd64
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub

  firefox:
    image: selenium/node-firefox:4.35.0-20250808
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub

  selenium-hub:
    image: selenium/hub:4.35.0-20250808
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

networks:
  default:
    name: "my-net"
    driver: bridge
    ipam:
      config:
      - subnet: 172.16.58.0/24

volumes:
  postgres-data:
  staticfiles:

Селеновый тест:

Мы были бы очень признательны за любую помощь.

В вашем случае:

  1. Ваш тестовый сервер Django запущен внутри контейнера django, предоставляя доступ к порту 8006.

  2. Ваш контейнер Selenium представляет собой отдельный контейнер, и ему необходим доступ к серверу Django через сеть Docker, а не через localhost или IP-адрес хост-машины.

  3. live_server_url по умолчанию используется localhost и указанный вами порт (8086 в вашем тесте), но этот localhost является Сам контейнер Selenium, который не запускает Django.

  4. Вы пытались использовать http://django:<port>, но он подключен неправильно, или порт может быть закрыт, или сервер Django не прослушивает нужный интерфейс/порт.

Пожалуйста, попробуйте ниже:

Измените свой тестовый класс port, чтобы он соответствовал порту runserver (8006), или наоборот.

class BaseSeleniumTests(StaticLiveServerTestCase):
    port = 8006  # must match runserver port

В качестве альтернативы, измените свой Docker command, чтобы запустить Django на порту 8086, если вы хотите сохранить этот порт в тестах:

command: python manage.py runserver 0.0.0.0:8086
ports:
  - "8086:8086"

Переопределите live_server_url, чтобы использовать django имя хоста (имя службы в сети Docker), чтобы контейнер Selenium мог подключаться:

@classmethod
def setUpClass(cls):
    super().setUpClass()
    cls.live_server_url = f"http://django:{cls.port}"
    options = Options()
    options.add_argument("--no-sandbox")
    cls.selenium = Remote("http://selenium-hub:4444/wd/hub", options=options)
    cls.selenium.implicitly_wait(10)
    cls.actions = ActionChains(cls.selenium)

Убедитесь, что контейнер Selenium находится в той же сети Docker, что и Django.

Используйте правильный URL-адрес WebDriver (вы можете попробовать использовать приведенный ниже, но):

self.selenium = Remote("http://localhost:4444/wd/hub", options=options)

Ваш контейнер Django недоступен через localhost из Selenium.
Внутри Docker используйте имя службы (django:8006) вместо localhost и укажите в своем WebDriver значение http://selenium-hub:4444/wd/hub. Также убедитесь, что ваш тест port соответствует порту сервера запуска Django.

Я нашел ответ https://marcgibbons.com/posts/selenium-in-docker

@override_settings(ALLOWED_HOSTS=['*'])
class BaseSeleniumTests(StaticLiveServerTestCase):
    fixtures = ["f1"]
    host = '0.0.0.0'
    port = 8086

    @classmethod
    def setUpClass(self):
        super().setUpClass()
        self.host = socket.gethostbyname(socket.gethostname())
        options = Options()
        options.add_argument("--no-sandbox")
        self.selenium = Remote("http://selenium-hub:4444/wd/hub", options=options)
        # cls.selenium
        self.selenium.implicitly_wait(10)

        self.actions = ActionChains(self.selenium)

Установка значения host = '0.0.0.0' означает, что тестовый сервер прослушивает внешние устройства, такие как selenium.

@override_settings(ALLOWED_HOSTS=['*']) означает, что Django не будет блокировать IP-адрес.

Установка self.host = socket.gethostbyname(socket.gethostname()) после super().setUpClass() устанавливает live_server_url для использования IP-адреса контейнера приложения "django" в моем случае.

Это позволяет запускать тесты в тестовой среде по желанию.

Вернуться на верх