specflow + selenium .NET Core 项目中缺少 Chromedriver

Chromedriver missing in specflow + selenium .NET Core project

我正在进行一个测试自动化项目,该项目需要 UI 在浏览器中进行测试。对于这个项目,我设置了一个 .NET Core 3.1 项目,其中包含以下包:

<PackageReference Include="FluentAssertions" Version="5.10.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.8" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
<PackageReference Include="Microsoft.TestPlatform.TestHost" Version="16.8.3" />
<PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="87.0.4280.8800" />
<PackageReference Include="Selenium.WebDriver.GeckoDriver" Version="0.27.0" />
<PackageReference Include="Selenium.WebDriver.IEDriver" Version="3.150.1.2" />
<PackageReference Include="SpecFlow" Version="3.5.14" />
<PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.5.14" />
<PackageReference Include="SpecRun.SpecFlow" Version="3.5.22" />

当我尝试 运行 我的任何测试时,我收到以下错误:

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 http://chromedriver.storage.googleapis.com/index.html.

然而,chromedriver 包含在 Selenium.WebDriver.ChromeDriver 包中。它应该在构建过程中被复制到 bin 文件夹,所以我检查了该文件夹并且它存在。

所以我认为当前目录不是 bin 文件夹而是其他文件夹,所以我更改了代码并将当前目录作为参数传递给 chromedriver,如下所示:

...
var driver new ChromeDriver(System.IO.Directory.GetCurrentDirectory());
...

现在我得到以下错误:

The file C:\path\to\project\TestResults\chromedriver.exe does not exist. The driver can be downloaded at http://chromedriver.storage.googleapis.com/index.html

说明当前目录不是bin文件夹,而是我测试结果的输出文件夹

如何更改此行为以使其自动查找正确的文件夹?

顺便说一句:我发现the following solution有类似的问题。但是,此解决方案依赖于对路径进行硬编码,即完整路径/驱动程序版本或 platform/configuration。这不是一个选项,因为我打算在不同的环境中使用相同的代码。

您正在使用 SpecFlow+ Runner,它默认使用 process isolation 来分隔线程。因此,工作目录不是输出目录。

你有两个选择:

  1. 通过 API 从 SpecFlow+ Runner
  2. 获取文件夹

我们有一个 API 来获取输出文件夹。通过上下文注入获取 TestRunContext 的实例并使用 TestDirectory 属性 (https://docs.specflow.org/projects/specflow-runner/en/latest/Usage/SpecFlow-Runner-APIs.html#string-testdirectory-get).

  1. 切换到 shared appdomain

如果您不需要在测试线程之间进行隔离,我只会这样做。

把你的Default.srProfile这个

<Environment testThreadIsolation="SharedAppDomain" />

整个文件应如下所示:https://github.com/SpecFlowOSS/Streaming-Projects/blob/main/CommunityContentSubmissionPage/CommunityContentSubmissionPage.Specs/Default.srprofile


全面披露:我是 SpecFlow 和 SpecFlow+ 的社区管理员