【问题标题】:Chromedriver missing in specflow + selenium .NET Core projectSpecflow + selenium .NET Core 项目中缺少 Chromedriver
【发布时间】:2023-03-10 11:40:02
【问题描述】:

我正在处理一个测试自动化项目,需要在浏览器中进行 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" />

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

chromedriver.exe 文件不存在于当前目录或 PATH 环境变量的目录中。驱动可以在http://chromedriver.storage.googleapis.com/index.html下载。

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

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

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

现在我收到以下错误:

文件 C:\path\to\project\TestResults\chromedriver.exe 不存在。驱动可以在http://chromedriver.storage.googleapis.com/index.html下载

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

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

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

【问题讨论】:

    标签: selenium asp.net-core selenium-webdriver selenium-chromedriver specflow


    【解决方案1】:

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

    你有两个选择:

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

    我们有一个 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+ 的社区经理

    【讨论】:

    • 对于选项一,您是指TestRunContext 类吗?
    • 是的。我记错了名字。
    • 我已经尝试过解决方案 n。 1,它可以正常工作。我已经为检索目录编写了一个相当 hacky 的工作,但这绝对是一个更好的解决方案。我会将其标记为已解决。然而,我并不完全理解解决方案 n 中进程隔离的概念。 2、因此不能决定是否解n。 2对于我的情况来说是一个合适的解决方案。您是否有可能将其合并到答案中的进程隔离(使用 specflow)资源?再次感谢。
    • 当然可以。有关不同隔离模式的文档在这里:docs.specflow.org/projects/specflow-runner/en/latest/Usage/… 我将在答案中添加此信息。
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 2019-05-14
    • 2021-03-14
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多