为了提供 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
现在,一旦容器启动,WebDriver 中生成的 geckodriver 的响应(使用 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
执行后出现,但它只是一个占用 6MB RAM 的进程(不像 Chrome,它会产生数十个进程并且无头运行没有问题,对于在 Windows 10 上执行的 Firefox)。我假设有某种障碍阻止 Firefox 被打开,并且由于 Server Core 没有 GUI,它无法显示并且无法诊断。遗憾的是,我没有找到任何有关存储在磁盘上的 Firefox 日志的信息,也没有从命令行以更详细的模式运行 Firefox。我已经尝试过的事情:
- 将 Firefox 更改为 32 位
- 各种火狐版本
- 安装 DirectX 的子集
- 在没有巧克力的情况下安装 Firefox
- 各种 Windows Server Core 版本
总而言之,即使不可能(但为什么?Chrome 可能),我想知道实际错误是什么以及失败的原因是什么。来自 Firefox 本身的更多详细信息也会很方便。
我知道最简单的方法是切换到 Linux,但长话短说,目前还不可能。
版本:
- 泊坞窗:18.09.2,内部版本 6247962
- 火狐:66.0.3
- 壁虎驱动程序:0.24.0