22

我创建了一个播放器,它将在 C# 中使用 selenium 和 ChromeDriver 自动执行 chrome。它工作正常。

我面临的问题是,当它为 ChromDriver 创建一个对象时,它将启动 ChromeDriver 应用程序,该应用程序会弹出然后加载 Chrome。这是完美的,因为该应用程序正在为我加载该 chrome。

无论如何,我可以打开隐藏的 ChromeDriver 吗?

4

10 回答 10

60

在最新的 WebDriver 中,不需要修改 WebDriver\DriverService.cs 中的源代码。您只需要实例化 ChromeDriverService 并将 HideCommandPromptWindow 设置为 true,然后通过该服务和 ChromeOptions 实例化 ChromeDriver。我在下面给出 C# 代码示例

var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;
return new ChromeDriver(chromeDriverService,  new ChromeOptions());
于 2014-03-25T12:05:19.430 回答
9

不,没有办法在不修改绑定源代码的情况下隐藏 .NET 绑定中 chromedriver.exe 的控制台窗口。这被视为绑定的一项功能,因为它可以很容易地查看您的代码何时没有正确清理 ChromeDriver 的资源,因为控制台窗口保持打开状态。在其他一些语言的情况下,如果您的代码没有通过调用quit()WebDriver 对象上的方法正确清理 ChromeDriver 的实例,您最终可能会在您的计算机上运行一个僵尸 chromedriver.exe 进程。

于 2012-07-16T11:14:18.933 回答
6

是的,您需要修改 WebDriver\DriverService.cs 中的源代码Start();添加:

this.driverServiceProcess.StartInfo.CreateNoWindow = true;
于 2012-11-08T06:21:33.090 回答
3

现在可以使用无头选项。那时可能还没有。 无头运行 Chrome

翻译成C#,你可以这样做:

ChromeOptions options = new ChromeOptions();
options.AddArgument("headless");
ChromeDriver driver = new ChromeDriver(options);

现在浏览器窗口是不可见的,而程序的其余部分保持不变。

于 2018-09-11T16:31:21.707 回答
3

作为这个问题的更新。是的,您可以在 Selenium 2.40.0 及更高版本中隐藏命令提示符窗口。请注意,不建议隐藏命令提示符窗口,但您可以这样做。由于问题是指 C#,您可以使用以下代码进行操作:

铬驱动程序

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;

var driver = new ChromeDriver(driverService, new ChromeOptions());

InternetExplorer驱动程序

var driverService = InternetExplorerDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;

var driver = new InternetExplorerDriver(driverService, new InternetExplorerOptions());

PhantomJSDriver

var driverService = PhantomJSDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;

var driver = new PhantomJSDriver(driverService);
于 2020-10-29T09:36:38.713 回答
0
drv.Manage().Window.Position = new Point(3000, 3000);

将解决您的问题。

于 2021-03-16T15:40:47.287 回答
0

我使用 c# 做到了这一点,但就像JimEvan 的回复一样,我在“zombies chromedrivers and cmdzombies”方面遇到了一些问题。在做“无头模式”和“隐藏”提示窗口之后。

不要忘记正确关闭您的 chrome 驱动程序实例

为了解决这个问题,谷歌一下如何杀死一些进程,我杀死了这两个进程,然后再次打开另一个 chrome 驱动程序:

static void Main(string[] args)
{
    ChromeDriverService _chromeDriverService;
    ChromeOptions _chromeOptions;
    IWebDriver _driver;

    //set ChromeDriverService, to hide prompt widow
    _chromeDriverService = ChromeDriverService.CreateDefaultService("YOUR CHROME DRIVER PATH HERE");
    _chromeDriverService.HideCommandPromptWindow = true;

    //set ChromeOptions, to hide ChromeDriver 
    _chromeOptions = new ChromeOptions();
    _chromeOptions.AddArguments("headless");

    _driver = ChromeDriver(_chromeDriverService, _chromeOptions);

    //do your things...
}

//call this method before run your chrome driver, to close some ghost chromeDriver or prompt window
private static void CloseGhostsChromeDriver()
{
    Process[] cmd = Process.GetProcessesByName("cmd");
    Process[] chromeDriver = Process.GetProcessesByName("chromedriver");

    Process[] workers = chromeDriver.Concat(cmd).ToArray();

    foreach (Process worker in workers)
    {
        worker.Kill();
        worker.WaitForExit();
        worker.Dispose();
    }
}
于 2021-07-20T20:40:58.277 回答
0

在 ChromeDriver 的更新版本中,您无需编辑源代码,只需:

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;
于 2022-01-06T18:51:44.043 回答
0

如果你想隐藏启动 chrome、firefox 等时打开的控制台。你需要一个这样的帮助类:

static class WindowsUtils { [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount);

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int GetWindowTextLength(IntPtr hWnd);

[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

// Delegate to filter which windows to include 
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

/// <summary> Get the text for the window pointed to by hWnd </summary>
public static string GetWindowText(IntPtr hWnd)
{
    int size = GetWindowTextLength(hWnd);
    if (size > 0)
    {
        var builder = new StringBuilder(size + 1);
        GetWindowText(hWnd, builder, builder.Capacity);
        return builder.ToString();
    }

    return String.Empty;
}

/// <summary> Find all windows that match the given filter </summary>
/// <param name="filter"> A delegate that returns true for windows
///    that should be returned and false for windows that should
///    not be returned </param>
public static IEnumerable<IntPtr> FindWindows(EnumWindowsProc filter)
{
    IntPtr found = IntPtr.Zero;
    List<IntPtr> windows = new List<IntPtr>();

    EnumWindows(delegate (IntPtr wnd, IntPtr param)
    {
        if (filter(wnd, param))
        {
            // only add the windows that pass the filter
            windows.Add(wnd);
        }

        // but return true here so that we iterate all windows
        return true;
    }, IntPtr.Zero);

    return windows;
}

/// <summary> Find all windows that contain the given title text </summary>
/// <param name="titleText"> The text that the window title must contain. </param>
public static IEnumerable<IntPtr> FindWindowsWithText(string titleText)
{
    return FindWindows(delegate (IntPtr wnd, IntPtr param)
    {
        return GetWindowText(wnd).Contains(titleText);
    });
}

}

然后你可以像这样创建你的 Selenium 驱动程序(也隐藏 Firefox 窗口)。如果你想使用 Chrome 只需要做一些小的改动......我 prefreer Firefox 因为 Chrome 有时不能使用 headless 选项:

    FirefoxOptions options = new FirefoxOptions();            
    options.SetPreference("permissions.default.image", 2); //prevent download images
    options.AddArguments(new string[] { "--headless", "'--disable-gpu'" }); //no window, no gpu
    driver = new FirefoxDriver(options);
    WindowsUtils.ShowWindow(WindowsUtils.FindWindowsWithText("geckodriver.exe").FirstOrDefault(), 0); //0 to hide, 1 to show
于 2022-02-12T01:29:57.720 回答
0

该解决方案将为您提供帮助。请注意,不建议隐藏命令提示符窗口。

铬驱动程序

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;
var driver = new ChromeDriver(driverService, new ChromeOptions());
于 2022-03-03T14:44:35.170 回答