Для поставки Windows Selenium WebDriver Grid я начал подготовку Dockerfile, который позволил бы выполнять роль узла сетки. Первоначальной причиной было подготовить изображение с управляемой версией Firefox / GeckoDriver. Воодушевленный успешной подготовкой образа Chrome с той же целью, я начал со следующего файла Dockerfile:
FROM mcr.microsoft.com/windows/servercore:1809
# Install chocolatey
RUN @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
RUN choco feature enable -n allowGlobalConfirmation
WORKDIR C:\\tools
# Set driver/browser versions
ARG Selenium_Major_Version="3.141"
ARG Selenium_Version="3.141.59"
ARG GeckoDriver_Version="0.24.0"
ARG Firefox_Version="66.0.3"
# Install Java
RUN choco install jdk8
# Download Selenium
RUN powershell Invoke-WebRequest \
-Uri "https://selenium-release.storage.googleapis.com/$env:Selenium_Major_Version/selenium-server-standalone-$env:Selenium_Version.jar" \
-OutFile ".\\selenium-server-standalone.jar"
# Install Firefox
RUN choco install firefox --version %Firefox_Version%
COPY config.json .
ENTRYPOINT java \
-Dwebdriver.gecko.driver=C:\\tools\\geckodriver.exe \
-jar selenium-server-standalone.jar \
-role node \
-nodeConfig config.json
Теперь, когда контейнер запущен, ответ от порожденного geckodriver в WebDriver (выполняется с журналами на уровне TRACE) висит на:
node_1 | 1555088898615 mozrunner::runner INFO Running command: "C:\\Program Files\\Mozilla Firefox\\firefox.exe" "-marionette" "--headless" "-foreground" "-no-remote" "-profile" "C:\\Users\\ContainerAdministrator\\AppData\\Local\\Temp\\rust_mozprofile.SfT4FwVW8T8s"
node_1 | 1555088898631 geckodriver::marionette DEBUG Waiting 60s to connect to browser on 127.0.0.1:49171
node_1 | 1555088959727 mozrunner::runner DEBUG Killing process 1252
node_1 | 1555088959727 webdriver::server DEBUG <- 500 Internal Server Error {"value":{"error":"unknown error","message":"connection refused","stacktrace":""}}
Таким образом, дело в том, что Firefox не запускается правильно, так как GeckoDriver мог порождать его, но не взаимодействовать с ним. Более того, запуск firefox.exe непосредственно в контейнере приводит к тому, что процесс firefox.exe появляется после выполнения tasklist
, но это всего лишь один процесс, занимающий 6 МБ ОЗУ (в отличие от Chrome, который порождает десятки процессов и не имеет проблем с запуском без заголовка). , то же самое для Firefox, выполненного на Windows 10). Я предполагаю, что существует какое-то препятствие, мешающее открытию Firefox, и, поскольку у Server Core нет графического интерфейса, его нельзя отобразить и не диагностировать. К сожалению, я не нашел никакой информации о журналах Firefox, хранящихся на диске, и не запускаю Firefox в более подробном режиме из командной строки. Вещи, которые я уже пробовал:
- изменить Firefox на 32-битный
- различные версии Firefox
- Установить подмножество DirectX
- Установить Firefox без шоколада
- различные версии Windows Server Core
Подводя итог, даже если это невозможно (но почему? Это было возможно с Chrome), я хотел бы знать, что является настоящей ошибкой и в чем причина отказа. Более подробная информация из самого Firefox также будет полезна.
Я знаю, что самый простой способ сделать это - перейти на Linux, но, если коротко, в настоящий момент это невозможно.
Версия:
- Докер: 18.09.2, сборка 6247962
- Firefox: 66.0.3
- GeckoDriver: 0,24,0