【问题标题】:ChromeDriver console application hideChromeDriver 控制台应用程序隐藏
【发布时间】:2012-07-16 09:32:44
【问题描述】:

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

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

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

【问题讨论】:

  • 此软件用于测试。在这方面,控制台窗口是一件受欢迎的事情。我不确定你用它做什么,但听起来它没有测试。对于您的潜在问题,可能有更好的解决方案,例如直接调用 API 而不是通过浏览器。
  • 那个控制台窗口很烦人。
  • @DanCsharpster “Selenium 使浏览器自动化。就是这样!你用这种能力做什么完全取决于你。主要是为了测试目的而自动化 Web 应用程序,但当然不仅限于此. 无聊的基于 Web 的管理任务也可以(而且应该!)自动化。” - seleniumhq.org
  • 非常正确,@Samir。我只是想提出一个替代方案,因为使用浏览器可能比使用 API 更笨重且可靠性更低。也就是说,自从我发布此评论以来,我已经开始使用带有 Selenium 的无头 Chrome 并且非常喜欢它! Sanket Shah,你应该检查一下! developers.google.com/web/updates/2017/04/headless-chrome

标签: webdriver


【解决方案1】:

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

var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;
return new ChromeDriver(chromeDriverService,  new ChromeOptions());

【讨论】:

  • 也可以添加驱动二进制ChromeDriverService::CreareDefaultService( pathToBinary );的路径
  • 这里使用的“DriverService”概念适用于 Chrome、Firefox 和 IE(没有尝试其他...您只需从相应的命名空间实例化适当的服务)。
【解决方案2】:

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

Chrome 驱动程序

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

【讨论】:

    【解决方案3】:

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

    翻译成C#,可以这样:

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

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

    【讨论】:

    • 如何在 VB .NET 中做到这一点?
    【解决方案4】:

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

    this.driverServiceProcess.StartInfo.CreateNoWindow = true;
    

    【讨论】:

    • 在没有使用 Selenium 项目的完整构建过程的情况下,请注意这样做。简单地在 Visual Studio 中构建不会为您提供与 Selenium 项目的构建脚本生成的等效程序集。
    【解决方案5】:

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

    【讨论】:

    • 你好@JimEvans - 我的一台电脑实际上遇到了相反的问题。这台电脑隐藏了 IEDriverServer 和 ChromeDriver 的所有控制台窗口,我不知道为什么。该代码没有任何这些特定选项,并且当代码在其他计算机上运行时,这些窗口是可见的。有什么见解吗?谢谢!
    • @AngieM 您在使用 .NET 语言绑定吗?如果不是,则此问题中的信息不适用于您。其他语言(Python、Ruby、Java)可能根本无法控制是否出现单独的命令提示符窗口。
    • 是的,我正在使用 C#。我不想隐藏控制台窗口。由于某种原因(Windows 8.1 和 VS2015),它们只是隐藏在这台特定的计算机上。
    • 你能看到进程吗?它是否以与当前登录的用户不同的用户身份运行?
    【解决方案6】:
    drv.Manage().Window.Position = new Point(3000, 3000);
    

    会解决你的问题。

    【讨论】:

    • 这并不能解决问题,它只是sweeps它在地毯下......
    【解决方案7】:

    我使用 c# 完成了此操作,但就像 JimEvan's repply 一样,我在“zombies chromedrivers 和 cmdzombies”方面遇到了一些问题。在做“无头模式”和“隐藏”提示窗口之后。

    别忘了关闭你的 chrome 驱动实例correcly

    为了解决这个问题,谷歌一下如何杀死一些进程,我杀死了这两个进程,然后再次打开另一个 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();
        }
    }
    

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

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

        静态类 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
        

        【讨论】:

          【解决方案10】:

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

          Chrome 驱动程序

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

          【讨论】:

            猜你喜欢
            • 2016-03-03
            • 2023-03-28
            • 2022-11-17
            • 2011-01-09
            • 2014-11-10
            • 2016-03-30
            • 2011-04-20
            • 1970-01-01
            相关资源
            最近更新 更多