我创建了一个播放器,它将在 C# 中使用 selenium 和 ChromeDriver 自动执行 chrome。它工作正常。
我面临的问题是,当它为 ChromDriver 创建一个对象时,它将启动 ChromeDriver 应用程序,该应用程序会弹出然后加载 Chrome。这是完美的,因为该应用程序正在为我加载该 chrome。
无论如何,我可以打开隐藏的 ChromeDriver 吗?
我创建了一个播放器,它将在 C# 中使用 selenium 和 ChromeDriver 自动执行 chrome。它工作正常。
我面临的问题是,当它为 ChromDriver 创建一个对象时,它将启动 ChromeDriver 应用程序,该应用程序会弹出然后加载 Chrome。这是完美的,因为该应用程序正在为我加载该 chrome。
无论如何,我可以打开隐藏的 ChromeDriver 吗?
在最新的 WebDriver 中,不需要修改 WebDriver\DriverService.cs 中的源代码。您只需要实例化 ChromeDriverService 并将 HideCommandPromptWindow 设置为 true,然后通过该服务和 ChromeOptions 实例化 ChromeDriver。我在下面给出 C# 代码示例
var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;
return new ChromeDriver(chromeDriverService, new ChromeOptions());
不,没有办法在不修改绑定源代码的情况下隐藏 .NET 绑定中 chromedriver.exe 的控制台窗口。这被视为绑定的一项功能,因为它可以很容易地查看您的代码何时没有正确清理 ChromeDriver 的资源,因为控制台窗口保持打开状态。在其他一些语言的情况下,如果您的代码没有通过调用quit()
WebDriver 对象上的方法正确清理 ChromeDriver 的实例,您最终可能会在您的计算机上运行一个僵尸 chromedriver.exe 进程。
是的,您需要修改 WebDriver\DriverService.cs 中的源代码Start()
;添加:
this.driverServiceProcess.StartInfo.CreateNoWindow = true;
现在可以使用无头选项。那时可能还没有。 无头运行 Chrome
翻译成C#,你可以这样做:
ChromeOptions options = new ChromeOptions();
options.AddArgument("headless");
ChromeDriver driver = new ChromeDriver(options);
现在浏览器窗口是不可见的,而程序的其余部分保持不变。
作为这个问题的更新。是的,您可以在 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);
drv.Manage().Window.Position = new Point(3000, 3000);
将解决您的问题。
我使用 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();
}
}
在 ChromeDriver 的更新版本中,您无需编辑源代码,只需:
var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;
如果你想隐藏启动 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
该解决方案将为您提供帮助。请注意,不建议隐藏命令提示符窗口。
铬驱动程序
var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;
var driver = new ChromeDriver(driverService, new ChromeOptions());