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
Я не уверен, куда двигаться дальше.