OpenQA.Selenium.WebDriverException:未知错误:找不到Chrome二进制文件

时间:2019-09-11 08:15:32

标签: azure-devops automated-tests selenium-chromedriver

我试图在Azure Devops管道上运行测试,但遇到以下错误。大多数解决方案要求指定(硬编码)二进制路径,但是不能在服务器上实现。此外,测试在本地运行良好。

似乎这些代理没有安装chrome,但是不久之后,这些测试再次在同一个代理池上运行良好。

NUnit Adapter 3.15.0.0: Test execution complete
      X CreateAgentApp [< 1ms]
      Error Message:
       OneTimeSetUp: OpenQA.Selenium.WebDriverException : unknown error: cannot find Chrome binary

      X CreateProject [< 1ms]
      Error Message:
       OneTimeSetUp: OpenQA.Selenium.WebDriverException : unknown error: cannot find Chrome binary

      X CreateSPAApp [< 1ms]
      Error Message:
       OneTimeSetUp: OpenQA.Selenium.WebDriverException : unknown error: cannot find Chrome binary

我正在使用以下选项初始化ChromeDriver:

{
    ChromeOptions options = new ChromeOptions();
    options.AddArgument("--disable-features=VizDisplayCompositor");
    return options;
}

第二,是否可以在管道设置中添加需求变量以检查Chrome是否存在。

2 个答案:

答案 0 :(得分:1)

由于demands语法无法检测到Chrome的存在。 我手动检查了this site。发现在Microsoft托管的代理池带有VS2019的Windows 2019 托管VS2017 中安装了Chrome和chromedriver.exe。

您可以仅对这些代理程序池运行selenium ui测试。

不知道如何设置chromedriver路径?但是我找到了一种使用以下Powershell脚本获取代理的chromedriver.exe路径的方法。路径是    C:\SeleniumWebDrivers\ChromeDriver在代理商上。

$driverpath = Get-ChildItem Env:ChromeWebDriver

出于测试目的,我在代码中的驱动程序路径上方硬编码。测试在托管代理上按预期运行。

如果您不想对路径进行硬编码,则可以将Powershell任务添加到output driver path中,并用测试.runsettings文件中的参数替换测试代码中的驱动程序路径

echo "##vso[task.setvariable variable=chromedriverpath;isOutput=true]$driverpath" 

答案 1 :(得分:0)

我遇到了同样的问题,发现chromedriver和Chrome的版本应该兼容。 MS托管代理都已按照其他答案(参考文献:MS-Hosted AgentsWindows-2019/latest)中的说明预先安装。

为确保版本正常工作,根据情况,很少有选择。

如果chromedriver应该位于输出目录中,例如使用Selenium.WebDriver.ChromeDriver,然后选择其中一个;

  • 在代码中使用相同版本的chromedriver和构建服务器的Chrome(请参见上面的参考);或
  • 在构建期间使用环境变量chromedriver$Env:ChromeWebDriver从构建服务器复制到输出目录。
Copy-Item "$env:ChromeWebDriver/chromedriver.exe" -Force -Destination "**/bin/Release/*/"

或者,动态设置驱动程序路径;也许检查环境变量ChromeWebDriver

仅用于说明的伪代码


...
var driverDir = Environment.GetEnvironmentVariable("ChromeWebDriver");
var driverPath = !string.IsNullOrWhiteSpace(driverDir)
    ? Path.Combine(driverDir, "chromedriver.exe")
    : "relative/path"; // see below 

// init the driver or add to options
var driver = new ChromeDriver(driverPath)

...

有关相对路径,请参见此问题How can I instantiate a new ChromeDriver using a relative path in C#?