如何在无头模式下启动ChromeDriver

53

我想尝试无头浏览器,但我遇到了这个问题,即无法在无头模式下启动驱动程序。我正在遵循谷歌文档。我错过了什么吗?代码执行卡在var browser = new ChromeDriver();这一行。

这是我的代码:

var chromeOptions = new ChromeOptions
{
    BinaryLocation = @"C:\Users\2-as Aukstas\Documents\Visual Studio 2017\Projects\ChromeTest\ChromeTest\bin\Debug\chromedriver.exe",
    DebuggerAddress = "localhost:9222"
};

chromeOptions.AddArguments(new List<string>() {"headless", "disable-gpu" });

var browser = new ChromeDriver(chromeOptions);


browser.Navigate().GoToUrl("https://stackoverflow.com/");
Console.WriteLine(browser.FindElement(By.CssSelector("#h-top-questions")).Text);

你的 chromedriver.exe 版本是多少? - haim770
我的版本是2.30.0。从NuGet获取的。 - Evaldas B
2
BinaryLocation should point to the exe of Chrome (the browser), not chromedriver.exe - haim770
是的,你说得对。但这仍然没有解决问题。 - Evaldas B
5个回答

88

更新
Chrome 60版本已发布,所需操作仅是通过NuGet下载ChromeDriver和Selenium,然后使用此简单代码,一切都可以如鱼得水。太神奇了。

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

...



var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments("headless");

using (var browser = new ChromeDriver(chromeOptions))
{
  // add your code here
}

已过日期

在 Chrome 60 正式发布之前,有一个解决方案。您可以下载 Chrome Canary 并使用它的 headless 版本。安装后将 BinaryLocation 设置为指向 Chrome Canary,并注释掉 DebuggerAddress 行(这会导致 Chrome 超时):

var chromeOptions = new ChromeOptions
{
    BinaryLocation = @"C:\Users\2-as Aukstas\AppData\Local\Google\Chrome SxS\Application\chrome.exe",
    //DebuggerAddress = "127.0.0.1:9222"
};

chromeOptions.AddArguments(new List<string>() { "no-sandbox", "headless", "disable-gpu" });

var _driver = new ChromeDriver(chromeOptions);

1
ChromeDriver需要哪些NuGet包,有几个选择 - Chromium.ChromeDriverWebDriverChromeDriverSelenium.Webdriver.ChromeDriver等。 - thisextendsthat
3
Selenium.WebDriver.ChromeDriver 翻译为:谷歌浏览器驱动的 Selenium WebDriver。 - Evaldas B
为什么要使用 new List<string>? 只需使用 options.AddArguments("headless"); - Michael Blake
是的,那是正确的。在更新之前需要其他参数。 - Evaldas B
请注意,WebDriver dll 的命名空间是 OpenQA(这对我来说不太明显),因此您需要在代码文件顶部添加 "using OpenQA.Selenium.Chrome;"。 - JackR1
是的,你说得对。你需要包含 OpenQA.Selenium 和 OpenQA.Selenium.Chrome。我会编辑我的帖子。 - Evaldas B

6

如果您没有ChromeDriver的参考,可以按照以下步骤:

  1. 从这里下载dll文件:http://seleniumtestings.com/selenium-download/

  2. 解压缩后,您应该看到:Selenium.WebDriverBackedSelenium.dll、ThoughtWorks.Selenium.Core.dll、WebDriver.dll和WebDriver.Support.dll

  3. 通过“添加引用”添加这些文件

现在您可以使用它了:

String url = "http://www.google.com";
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments(new List<string>() {
    "--silent-launch",
    "--no-startup-window",
    "no-sandbox",
    "headless",});

var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;    // This is to hidden the console.
ChromeDriver driver = new ChromeDriver(chromeDriverService, chromeOptions);
driver.Navigate().GoToUrl(url);   

====

如果在运行过程中,您仍然遇到了关于缺少ChromeDriver.exe文件的错误,请尝试通过NuGet添加Selenium.WebDriver.ChromeDriver、WebDriver.ChromeDriver、WebDriver.ChromeDriver.win32和Selenium.Chrome.WebDriver。

提供的链接已经失效。 - Hooman
1
请转到我的另一个备选项下。 - Haryono

4
作为替代方案:
  • Add 2 libraries via NuGet like below picture.

  • Try below Code:

    String url = "http://www.google.com";
    var chromeOptions = new ChromeOptions();
    chromeOptions.AddArguments(new List<string>() { "headless" });
    
    var chromeDriverService = ChromeDriverService.CreateDefaultService();
    ChromeDriver driver = new ChromeDriver(chromeDriverService, chromeOptions);
    driver.Navigate().GoToUrl(url);
    

Selenium Chrome WebDriver


2

您使用的操作系统是什么?我在developers.google.com/web/updates/2017/04/headless-chrome上看到,直到Chrome 60版本之前,Windows系统将无法使用无头浏览器。


Windows 10。那就是答案了... :( - Evaldas B
@EvaldasB - 如果答案回答了您的问题,您可以接受它吗?谢谢。 - Kapil

1

以下是如何将Firefox和Chrome浏览器的无头模式设置为true。

FirefoxOptions ffopt = new FirefoxOptions();
FirefoxOptions option = ffopt.setHeadless(true);
WebDriver driver = new FirefoxDriver(option);


ChromeOptions coptions = new ChromeOptions();
ChromeOptions options = coptions.setHeadless(true);
WebDriver driver = new ChromeDriver(options);

4
看起来这段代码是用Java写的,但问题是针对C#。在C#的ChromeDriver类中没有setHeadless()方法(或等效方法)。 - urig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接