Django в контейнере Docker не работает с Selenium Grid 4

Недавно я начал пытаться контейнеризировать приложение django. Несколько дней я безуспешно пытался заставить тесты работать. У меня нет опыта работы с Selenium Grid, но кажется, что это способ работы с Django в контейнере docker, особенно если мне нужно иметь возможность просматривать происходящее.

# docker-compose.yml
version: "3.9"

services:
  myapp:
    build: .
    command: bash -c "
        npm run build
        && python manage.py migrate
        && python manage.py runserver 0.0.0.0:8000"

    volumes:
      - ./:/myapp
    env_file:
      - .env
    container_name: myapp-container
    ports:
      - "8000:8000"
    networks:
      mynetwork:
        ipv4_address: 171.20.0.3
  selenium-hub:
    image: selenium/hub:4.1
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"
    networks:
      mynetwork:
        ipv4_address: 171.20.0.4

  chrome:
    image: selenium/node-chrome:4.1
    container_name: chrome-worker
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

    networks:
      mynetwork:
        ipv4_address: 171.20.0.8


networks:
    mynetwork:
      ipam:
        config:
          - subnet: 171.20.0.0/24
            gateway: 171.20.0.1

В моем коде это должно быть просто вопросом изменения context.selenium = webdriver.Chrome(chrome_options=chrome_options) на следующий:

def before_all(context):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--window-size=3840,2160")
    chrome_options.add_argument("--allow-insecure-localhost")
    # chrome_options.add_experimental_option("detach", True)
    # context.selenium = webdriver.Chrome(chrome_options=chrome_options)
    context.selenium = webdriver.Remote(command_executor='http://localhost:4444', options=chrome_options)
    context.selenium.implicitly_wait(1)
    TransactionTestCase.serialized_rollback = True

Однако это приводит к такой ошибке:

HOOK-ERROR in before_all: MaxRetryError: HTTPConnectionPool(host='localhost', port=4444): Max retries exceeded with url: /session (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fb9ddfe15b0>: Failed to establish a new connection: [Errno 111] Connection refused'))

Я обновляю command_executer для использования имени хоста службы следующим образом:

   context.selenium = webdriver.Remote(command_executor='http://selenium-hub:4444', options=chrome_options)

Это кажется прогрессом, и тесты начинают запускаться, но я получаю разные ошибки подключения для каждого отдельного теста:

raise exception_class(message, screen, stacktrace)
 selenium.common.exceptions.WebDriverException: Message: unknown error: 
net::ERR_CONNECTION_REFUSED (Session info: headless chrome=96.0.4664.45)

Дополнительно теперь наблюдается активность со стороны selenium-hub и службы chrome

selenium-hub     | 16:07:16.940 INFO [LocalDistributor.newSession] - Session created by the distributor. Id: 444dbca185db76e7e8780c98680b7859, Caps: Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 96.0.4664.45, chrome: {chromedriverVersion: 96.0.4664.45 (76e4c1bb2ab46..., userDataDir: /tmp/.com.google.Chrome.2RTzs7}, goog:chromeOptions: {debuggerAddress: localhost:40633}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: ANY, proxy: {}, se:cdp: ws://171.20.0.8:4444/sessio..., se:cdpVersion: 96.0.4664.45, se:vnc: ws://171.20.0.8:4444/sessio..., se:vncEnabled: true, se:vncLocalAddress: ws://171.20.0.8:7900, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
chrome-worker    | 16:07:28.510 WARN [SeleniumSpanExporter$1.lambda$export$0] - {"traceId": "ae4768e55f596539cf20032361104584","eventTime": 1637770048509670200,"eventName": "HTTP request execution complete","attributes": {"http.flavor": 1,"http.handler_class": "org.openqa.selenium.remote.http.Route$PredicatedRoute","http.host": "171.20.0.4:4444","http.method": "POST","http.request_content_length": "41","http.scheme": "HTTP","http.status_code": 500,"http.target": "\u002fsession\u002f444dbca185db76e7e8780c98680b7859\u002furl","http.user_agent": "selenium\u002f3.141.0 (python linux)"}}
chrome-worker    | 
chrome-worker    | 16:07:51.014 WARN [SeleniumSpanExporter$1.lambda$export$0] - {"traceId": "338e4e8e48d62681ed1cb1e729d490d6","eventTime": 1637770071013768000,"eventName": "HTTP request execution complete","attributes": {"http.flavor": 1,"http.handler_class": "org.openqa.selenium.remote.http.Route$PredicatedRoute","http.host": "171.20.0.4:4444","http.method": "POST","http.request_content_length": "41","http.scheme": "HTTP","http.status_code": 500,"http.target": "\u002fsession\u002f444dbca185db76e7e8780c98680b7859\u002furl","http.user_agent": "selenium\u002f3.141.0 (python linux)"}}

Я пробовал удалить пользовательскую сеть, которую я добавил для решения другой проблемы, но это не помогло. Я также пробовал использовать определенные IP-адреса. Когда я пытаюсь подключиться к другим контейнерам из контейнера myapp с помощью curl -I http://selenium-hub/4444

HTTP/1.1 302 Found
content-length: 0
Location: /ui/index.html

Я не уверен, куда двигаться дальше.

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