我试图在Docker中设置使用Selenium Webdriver和Firefox的.NET Core控制台应用程序,但是我很难理解如何实际使用official Selenium docker images。
目前,控制台应用只是一个尝试访问Google.com并成功返回报告的应用。
尝试创建新的FirefoxDriver时,我始终收到以下错误消息:
预期的浏览器二进制文件位置,但无法在默认位置找到二进制文件,未提供'moz:firefoxOptions.binary'功能,并且在命令行上未设置二进制标志(SessionNotCreated)
这是Dockerfile(由VSCode Docker扩展生成,我添加了一行,现在已注释掉):
FROM microsoft/dotnet:2.1-runtime AS base
WORKDIR /app
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["MyAppName.csproj", "./"]
RUN dotnet restore "./MyAppName.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyAppName.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "MyAppName.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
# FROM selenium/standalone-firefox-debug ## where does this go?
ENTRYPOINT ["dotnet", "MyAppName.dll"]
我尝试在各个点插入硒独立映像,尝试从'/ bin / bash /'入口点开始,以尝试查找映像中是否确实存在firefox(看起来好像不是,不在常规位置)。仍然会引发异常。
我真正想要的只是在容器中安装了firefox,以便我可以运行.NET Core控制台应用程序,但是根据某些google搜索,最简单的方法应该是通过硒图像。
如何正确使用硒docker镜像?
答案 0 :(得分:0)
回答我自己的问题,以防其他Docker新手遇到同样的问题并在此处结束。
我知道了。
更好的方法是使用docker-compose运行3个不同的服务:我的C#脚本,一个硒中心服务和一个硒Firefox节点。 (您也许可以使用 just 一个脚本和一个selenium firefox独立图像来完成此操作,但是我只是发布对我有用的第一件事。稍后将尝试其他工作)
我从.NET Core控制台应用Dockerfile中删除了FROM selenium/standalone-firefox-debug
语句,然后将以下docker-compose.yml
文件放在与Dockerfile相同的文件夹中(大部分来自this stackoverflow answer) :
version: '2'
services:
seltest:
build:
context: .
volumes:
- ./temp:/usr/src/app/target
environment:
- HUB_PORT_4444_TCP_ADDR=seleniumhub
- HUB_PORT_4444_TCP_PORT=4444
depends_on:
- seleniumhub
seleniumhub:
image: selenium/hub
ports:
- 4444:4444
firefoxnode:
image: selenium/node-firefox-debug
ports:
- 5900
environment:
- HUB_PORT_4444_TCP_ADDR=seleniumhub
- HUB_PORT_4444_TCP_PORT=4444
现在我必须在C#脚本中进行一些更改。我必须将远程Webdriver连接到正确的URI:
IWebDriver driver = new RemoteWebDriver(new Uri("http://seleniumhub:4444/wd/hub"), firefoxOptions);
( seleniumhub :4444,因为我在docker-compose.yml中创建的服务的名称是 seleniumhub ,而4444是为此服务打开的端口)>
并且由于docker-compose中的depends_on
仅等待the services to start and not until they're 'ready',因此我采取了一种骇人听闻的方法,在尝试使用它们之前,请确保selenium hub和firefox服务已准备就绪,并且做到了:
Thread.Sleep(10000);
在调用远程Webdriver之前。如果我不这样做,则在尝试调用Webdriver时出现以下错误:
未处理的异常:OpenQA.Selenium.WebDriverException:引发了具有空响应的异常,该异常将HTTP请求发送到远程WebDriver服务器以获取URL http://seleniumhub:4444/wd/hub/session。异常的状态为UnknownError,消息为:连接被拒绝连接被拒绝---> System.Net.WebException:连接被拒绝连接被拒绝---> System.Net.Http.HttpRequestException:连接被拒绝--->系统.Net.Sockets.SocketException:连接被拒绝
然后,我只是从命令行运行docker compose up
以启动服务,并且我可以验证我的C#脚本是否成功将其保存到https://www.google.com。
似乎整个过程可以通过许多方式进行优化,但是对我而言,概念证明已经完成!