如何使用官方的Selenium Docker镜像?

时间:2018-12-05 20:36:59

标签: selenium docker .net-core

我试图在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镜像?

1 个答案:

答案 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

似乎整个过程可以通过许多方式进行优化,但是对我而言,概念证明已经完成!