【问题标题】:Unable to create new service: ChromeDriverService无法创建新服务:ChromeDriverService
【发布时间】:2019-02-26 17:45:20
【问题描述】:

我已经全局安装了 Selenium Standalone:

npm install selenium-standalone -g
selenium-standalone install --singleDriverInstall=chrome

我还将code from this page 混入了这个 dotnet core / XUnit 测试:

using System.Threading;
using System;
using Xunit;
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Chrome;
using System.Diagnostics;

namespace XunitTestLib.Unit
{
    public class BasicBrowserTest : IDisposable
    {
        public Process _process;
        public IWebDriver Browser { get; }

        public BasicBrowserTest()
        {
            _process = new Process()
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "selenium-standalone",
                    Arguments = "start --drivers=chrome",
                    UseShellExecute = true
                }
            };
            _process.Start();

            var options = new ChromeOptions();
            // options.AddArgument("--headless");
            options.AddArgument("--disable-gpu");
            options.AddArgument("--no-sandbox");
            options.AddArgument("--ignore-certificate-errors");
            options.AddArgument("--allow-insecure-localhost");
            options.AddArgument("--acceptInsecureCerts=true");
            options.AddArgument("--proxy-server='direct://'");
            options.AddArgument("--proxy-bypass-list=*");
            options.SetLoggingPreference(OpenQA.Selenium.LogType.Browser, LogLevel.All);

            Thread.Sleep(4000);
            Browser = new RemoteWebDriver(options);
        }

        public void Dispose()
        {
            Browser.Dispose();
            _process.CloseMainWindow();
        }
    }
}

我正在尝试使用 ChromeDriver 启动 selenium-standalone,以便我可以驱动浏览器来执行浏览器测试。

没有托管我自己的 Web 应用程序 - 这只是针对已经在运行的网站进行的测试运行测试。

Sleep 是为了让 selenium 在 shell 进程中启动。

但是,当我使用 dotnet test --filter DisplayName="Homepage" 运行时,我得到了这个输出:

[xUnit.net 00:00:04.88]     Homepage [FAIL]
Failed   Homepage
Error Message:
 System.InvalidOperationException : Unable to create new service: ChromeDriverService
Build info: version: '3.141.0', revision: '2ecb7d9a', time: '2018-10-31T20:22:52'
System info: host: 'horacepc', ip: '191.191.191.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_201'
Driver info: driver.version: unknown (SessionNotCreated)
Stack Trace:
   at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebDriver.StartSession(ICapabilities desiredCapabilities)
   at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities)
   at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(Uri remoteAddress, ICapabilities desiredCapabilities, TimeSpan commandTimeout)
   at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(Uri remoteAddress, ICapabilities desiredCapabilities)
   at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(ICapabilities desiredCapabilities)
   at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(DriverOptions options)
   at XunitTestLib.Unit.BasicBrowserTest..ctor() in C:\git\core\XunitTestLib\Unit\BasicBrowserTest.cs:line 46

Total tests: 1. Passed: 0. Failed: 1. Skipped: 0.
Test Run Failed.

错误指示的行是这一行:Browser = new RemoteWebDriver(options);

我的理解是 ChromeDriver 正在尝试通过 HTTP 连接连接到 selenium,但无法启动/初始化。

我不明白为什么会失败。

【问题讨论】:

    标签: .net-core selenium-chromedriver xunit.net


    【解决方案1】:

    这并不能具体回答您关于使用 selenium-standalone 的问题,但根据我的经验,如果您只想在本地计算机上运行它们,则可能没有必要。

    相反,如果您从 http://chromedriver.chromium.org/downloads 下载 Chromedriver,然后不使用 new Process,您可以这样做:

    var driverPath = "C:\\MyWebDrivers";
    var driverExecutableFileName = "chromedriver.exe";
    var options = <whateveryouhadabove>;
    
    using (var service = ChromeDriverService.CreateDefaultService(driverPath, driverExecutableFileName))
    {
        using (var driver = new RemoteWebDriver(service.ServiceUrl, options.ToCapabilities()))
        {
            // control chrome here!
        }
    }
    

    在幕后,ChromeDriverService.CreateDefaultService 将通过chromedriver.exe 创建一个“Web Driver”兼容接口。

    【讨论】:

    • 这是我不明白的:我链接的帖子和我的旧 .NET Framework 代码都没有明确引用 ChromeDriver 可执行文件,但可以毫无问题地启动它。
    • 我不熟悉您正在使用的独立硒 npm 包,但我认为 chromedriver.exe 与它一起打包在某个地方。在您的示例中,您可能能够为传递给 RemoteWebDriver 的 URL 指定独立硒操作的特定主机和端口。它应该是第一个参数(根据我的例子)
    • 所以,刚刚意识到我没有包含Selenium.WebDriver.ChromeDriver 包。博客文章页面上没有提到它,所以我不知道 Scott H 是否也这样做了,但我假设他这样做了,只是忘记了(他说,毕竟是凌晨 2 点。)我现在有一个火了浏览器和通过测试。明天我仔细查看后会更新 SO 帖子。
    【解决方案2】:

    答案是包括所需的 NuGet 包列表。 blog post from Scott Hanselman 记录了这些:

    dotnet add package "Selenium.Support"
    dotnet add package "Selenium.WebDriver"
    

    上面帖子中的代码需要第三个包才能工作:

    dotnet add package "Selenium.WebDriver.ChromeDrive"
    

    【讨论】: