ChromeDriver console application hide

Viewed 44628

I have created a player which will automate chrome using selenium and ChromeDriver in C#. It's working fine.

Issue what I am facing is, when it creates an object for ChromDriver, it will start ChromeDriver application, which gets pop up and then Chrome will load. It's perfect as that application is loading that chrome for me.

Is there anyway, that I can open that ChromeDriver hidden?

10 Answers

This is possible now, using the headless option. Might not have been available then. Running Chrome Headless

Translated into C#, you can do this:

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

Now the browser window is invisible, while the rest of the program stays the same.

As an update to this question. Yes, you can hide command prompt window in Selenium 2.40.0 and up. Please note that hiding command prompt window is not recommended but you can do it. As the question refers to C# you do it with the next code:

ChromeDriver

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

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

InternetExplorerDriver

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);
drv.Manage().Window.Position = new Point(3000, 3000);

will fix your problem.

I did this using c#, but like JimEvan's repply, I had some problems with "zombies chromedrivers and cmd zombies". After doing "headless mode" and "hiding" the prompt window.

Don't forget to close your chrome driver instance correcly.

To solve this, doing a little google how kill some process, I kill these two process, before open another chrome driver again :

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();
    }
}

In updated version of ChromeDriver you don't need to edit the source code just with:

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

If you want to hide the console that is opened when launching chrome, firefox, etc.. you will need a helper class like this:

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);
    });
}

}

An then you can create your Selenium driver like this (also hidding the Firefox window).. If you want to use Chrome only have to do some minor changes... I prefreer Firefox because Chrome sometimes don't work with headless option:

    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

This solution will help you. Please note that hiding command prompt window is not recommended.

ChromeDriver

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;
var driver = new ChromeDriver(driverService, new ChromeOptions());
Related