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 来分隔线程。因此,工作目录不是输出目录。
你有两个选择:
- 通过 API 从 SpecFlow+ Runner
获取文件夹
我们有一个 API 来获取输出文件夹。通过上下文注入获取 TestRunContext 的实例并使用 TestDirectory 属性 (https://docs.specflow.org/projects/specflow-runner/en/latest/Usage/SpecFlow-Runner-APIs.html#string-testdirectory-get).
- 切换到 shared appdomain
如果您不需要在测试线程之间进行隔离,我只会这样做。
把你的Default.srProfile
这个
<Environment testThreadIsolation="SharedAppDomain" />
全面披露:我是 SpecFlow 和 SpecFlow+ 的社区管理员
我正在进行一个测试自动化项目,该项目需要 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 来分隔线程。因此,工作目录不是输出目录。
你有两个选择:
- 通过 API 从 SpecFlow+ Runner 获取文件夹
我们有一个 API 来获取输出文件夹。通过上下文注入获取 TestRunContext 的实例并使用 TestDirectory 属性 (https://docs.specflow.org/projects/specflow-runner/en/latest/Usage/SpecFlow-Runner-APIs.html#string-testdirectory-get).
- 切换到 shared appdomain
如果您不需要在测试线程之间进行隔离,我只会这样做。
把你的Default.srProfile
这个
<Environment testThreadIsolation="SharedAppDomain" />
全面披露:我是 SpecFlow 和 SpecFlow+ 的社区管理员