为了提供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会导致执行tasklist
后出现firefox.exe进程,但这只是占用6MB RAM的一个进程(与Chrome不同,Chrome产生了数十个进程,并且在Windows中没有问题无头运行,与Windows 10上执行的Firefox相同)。我认为存在某种阻碍打开Firefox的障碍,并且由于Server Core没有GUI,因此无法显示和诊断它。遗憾的是,我没有找到有关存储在磁盘上的Firefox日志的任何信息,也没有从命令行以更详细的模式运行Firefox。我已经尝试过的东西:
总而言之,即使不可能(但是为什么?Chrome可以做到),我想知道实际的错误是什么,失败的原因是什么。 Firefox本身提供的更多详细信息也很方便。
我知道最简单的方法是切换到Linux,但是长话短说,目前尚不可能。
版本:
答案 0 :(得分:0)
我认为您正在耗尽共享内存(没有发现如何运行docker,而是在猜测)。问题是geckodriver
阻塞了共享内存。原因尚未完全了解yet。您有两个选择。挂载共享内存或设置固定大小。
如果要设置修复大小,请使用--shm-size
(共享内存大小)开关进行设置。您必须将其至少设置为ShmSize: 1800000000
(1.8g)。通常为简单起见,将其设置为2G:
--shm-size 2g
如果您查看github文档running images,甚至可以看到以下警告:
❗️在执行docker时使用Chrome或Firefox运行图像 请安装-v / dev / shm:/ dev / shm或使用标志--shm-size = 2g 使用主机的共享内存。
对于Firefox,它将是:
$ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-firefox:3.141.59-mercury
OR
$ docker run -d -p 4444:4444 --shm-size 2g selenium/standalone-firefox:3.141.59-mercury
有些报告说,即使提高限制也无济于事。如果是这种情况,您可以破解about:config
引用:
通过关闭选项卡,我可以解决此问题 退出主标签。还将URL设置为about:config / blank 在关闭之前,
while (this.WindowHandles.Count > 1)
{
this.Navigate().GoToUrl("about:config");
this.Navigate().GoToUrl("about:blank");
this.Close(); //Close Tab
this.SwitchTo().Window(this.WindowHandles.Last());
}
this.Navigate().GoToUrl("about:config");
this.Navigate().GoToUrl("about:blank");
this.Quit(); //Then main window