在带有 .NET Core 的库 csproj 中使用 Selenium WebDriver

Using Selenium WebDriver in library csproj with .NET Core

我正在尝试使用 Selenium 和 .NET Core 构建一个网络抓取应用程序,但我无法找到我的 WebDriver exes。

我有一个 .csproj 将 运行 项目的 API,它调用(除其他外)另一个将处理网络抓取的 .csproj。 所有都在一个 .sln 中,并且都是 运行ning .NET Core 2.1

在抓取项目中,我安装了 nuget Selenium.WebDriverSelenium.WebDriver.ChromeDriver

我在 API 中创建了一个端点,它调用了抓取项目,运行 是一个尝试调用 new ChromeDriver() 的方法。它不起作用 :( 具体来说,我得到:

The chromedriver.exe file does not exist in the current directory or in a directory on the PATH environment variable. The driver can be downloaded at ... <url>

看起来相当清楚(虽然令人失望的是它没有告诉你 "current directory" 是什么意思。我会立即提交 PR)


通过观察重建期间的变化以及其他在线研究,我发现:


我想到了几个解决方案,none 其中非常有吸引力:


有没有好的、简单的方法来解决这个问题。这将产生一个 JustWorks 的 git 回购,并且将来部署到服务器会相对轻松吗?

我上面描述的任何事情是否有误或配置错误?

据我了解,您有一个 API 项目依赖于一个 Scraping 项目。

Scraping.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>  
    <LangVersion>7.2</LangVersion>
    <PublishChromeDriver>true</PublishChromeDriver>    
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
    <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="2.46.0" />
  </ItemGroup>
</Project>

API.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <ProjectReference Include="..\Scraping\Scraping.csproj" />
  </ItemGroup>

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <LangVersion>7.2</LangVersion>
  </PropertyGroup>

</Project>

诀窍是将 <PublishChromeDriver>true</PublishChromeDriver> 添加到传递项目以使其在 运行 dotnet publish API.csproj 时发布 chromedriver ChromeDriver 包在 NuGet 包中具有自定义构建目标,因此它是 自定义.

您现在可以使用

new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));

dotnet run API.csproj

如有错误请指正。您有某种引用了 Selenium 的 Class 库,并且您想使用 ChromeDriver.exe,但您收到一个错误消息,指出无法在以下位置找到它。这相当简单。 当前您正在引用 Class 库让 API 说 Foo。您的组装位置将指向 API 库位置,而 chromedriver.exe 位于 Class 库库下方。 如果是这种情况,您唯一需要做的就是将 chromedriver.exe 之后的内容复制到最终的 bin 目录,即 API.

将以下 Post 构建事件添加到您的 API 项目以复制 chromedriver:

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="copy $(SolutionDir)\ClassLibrary\bin\Debug\netstandard2.0\chromedriver.exe $(TargetDir)" />
  </Target>

这会将您的 chromedriver.exe 复制到 API 垃圾箱。稍后在初始化 ChromeDriver 时使用:

        var options = new ChromeOptions();
        var service = ChromeDriverService.CreateDefaultService(AppDomain.CurrentDomain.BaseDirectory);

        WebDriver = new ChromeDriver(service, options);

AppDomain.CurrentDomain.BaseDirectory 将指向您的 API bin 目录。