首页 > 解决方案 > 如何在 Docker 中使用 Selenium 运行 dotnet core 应用程序

问题描述

我在 Docker 容器中运行 dotnet core 2.2 (aspnet core) 应用程序。我正在使用您可以在任何基本教程中找到的最简单的 Dockerfile:

现在我想从另一个网站获取一些数据。它是一个 SPA,所以我需要先使用浏览器来呈现页面——我决定将 Selenium 与 ChromeDriver 一起使用,因为我已经对它们有点熟悉了。

我已经添加Selenium.WebDriver v3.141Selenium.WebDriver.ChromeDriver v73.0我的项目中,在那里设置了 Selenium。在 Windows 上本地运行良好。但是当我通过 Docker 运行它时,我得到:

The file /app/chromedriver does not exist. The driver can be downloaded at http://chromedriver.storage.googleapis.com/index.html

所以现在我想知道如何在 Docker 中使用 dotnet core 2.2 运行 Selenium + 单实例 Chrome(无需为我的目的设置 Selenium Grid)。

我想我需要创建自定义 Dockerfile :

但我不确定如何做到这一点。尤其是如何“嵌套”Dockerfile。我应该在单个 Dockerfile 中进行此组合吗?我应该为 Selenium + ChromeDriver 创建 Dockerfile 并将其用作下一步的基本映像吗?

标签: c#seleniumdocker.net-coreselenium-chromedriver

解决方案


所以我最近遇到了同样的问题。

TL;博士; 您必须通过将命令放入 Docker 文件中来将 chrome 安装到 docker 映像中。

 FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch

 # Install Chrome
 RUN apt-get update && apt-get install -y \
 apt-transport-https \
 ca-certificates \
 curl \
 gnupg \
 hicolor-icon-theme \
 libcanberra-gtk* \
 libgl1-mesa-dri \
 libgl1-mesa-glx \
 libpango1.0-0 \
 libpulse0 \
 libv4l-0 \
 fonts-symbola \
 --no-install-recommends \
 && curl -sSL https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
 && echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list \
 && apt-get update && apt-get install -y \
 google-chrome-stable \
 --no-install-recommends \
 && apt-get purge --auto-remove -y curl \
 && rm -rf /var/lib/apt/lists/*

 # Add your dotnet core project build stuff here

更简单的解决方案 - 我将它作为 docker 镜像推送到我的 docker hub 存储库中,以便您可以将其用作基础镜像。请参阅我的 dotnet core 2.2 示例

 FROM masteroleary/selenium-dotnetcore2.2-linux:v2 AS base

 WORKDIR /app

 EXPOSE 80

 EXPOSE 443

 FROM masteroleary/selenium-dotnetcore2.2-linux:v2 AS build WORKDIR /src

 COPY ["MyProject.csproj", ""]

 RUN dotnet restore "MyProject.csproj"

 COPY . .

 WORKDIR "/src/"

 RUN dotnet build "MyProject.csproj" -c Prod -o /app

 FROM build AS publish

 RUN dotnet publish "MyProject.csproj" -c Prod -o /app

 FROM base AS final

 WORKDIR /app

 COPY --from=publish /app .

 ENTRYPOINT ["dotnet", "MyProject.dll"]

这怎么发生的?

基本上在 Visual Studio 中为具有 docker 支持的 dotnet core 2.2 mvc 创建了一个新项目。

意图是在 linux 容器中运行我的 dotnet 核心应用程序

假设通过安装 nuget 包 Selenium.Support、Selenium.WebDriver、Selenium.WebDriver.ChromeDriver,我需要的任何东西都会自动包含在 docker 容器中,因为 Selenium.WebDriver 支持 .NetStandard 2.0(顺便说一句,其他人不支持,只是意识到了这一点)

事实证明,您必须通过将命令放入 Docker 文件中来将 chrome 安装到 docker 映像中。

我在这里解释了整个学习过程,包括我是如何找到这个工作代码的:https ://hub.docker.com/r/masteroleary/selenium-dotnetcore2.2-linux


推荐阅读