Пытаюсь выполнить тестирование 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:
Селеновый тест:
Мы были бы очень признательны за любую помощь.
В вашем случае:
Ваш тестовый сервер Django запущен внутри контейнера
django
, предоставляя доступ к порту8006
.Ваш контейнер Selenium представляет собой отдельный контейнер, и ему необходим доступ к серверу Django через сеть Docker, а не через
localhost
или IP-адрес хост-машины.live_server_url
по умолчанию используетсяlocalhost
и указанный вами порт (8086
в вашем тесте), но этотlocalhost
является Сам контейнер Selenium, который не запускает Django.Вы пытались использовать
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" в моем случае.
Это позволяет запускать тесты в тестовой среде по желанию.