hide chromeDriver console in python

后端 未结 3 1564
庸人自扰
庸人自扰 2020-12-01 07:25

I\'m using chrome driver in Selenium to open chrome , log into a router, press some buttons ,upload configuration etc. all code is written in Python.

here is the par

相关标签:
3条回答
  • 2020-12-01 07:43

    While launching chrome browser not seeing chromedriver console with the given sample code.

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options 
    from time import sleep
    options = webdriver.ChromeOptions()
    prefs = {"download.default_directory":  r"C:\New_Download"}
    options.add_experimental_option("prefs", prefs)
    print(options.experimental_options)
    
    chromeDriverPath = r'C:\drivers\chromedriver.exe'
    driver = webdriver.Chrome(chromeDriverPath,chrome_options=options)
    driver.get("http://google.com")
    driver.set_window_position(0, 0)
    driver.set_window_size(0, 0)
    
    0 讨论(0)
  • 2020-12-01 07:46

    There's a lot of questions relating to this and a lot of various answers. The issue is that using Selenium in a Python process without a console window of its own will cause it to launch its drivers (including the chromedriver) in a new window.

    Rather than modifying the Selenium code directly (although this needs to be done eventually) one option you have is to create your own sub-classes for both the Chrome WebDriver and the Service class it uses. The Service class is where Selenium actually calls Popen to launch the service process, e.g. chromedriver.exe (as mentioned in the accepted answer):

    import errno
    import os
    import platform
    import subprocess
    import sys
    import time
    import warnings
    
    from selenium.common.exceptions import WebDriverException
    from selenium.webdriver.common import utils
    from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
    from selenium.webdriver.chrome import service, webdriver, remote_connection
    
    class HiddenChromeService(service.Service):
    
        def start(self):
            try:
                cmd = [self.path]
                cmd.extend(self.command_line_args())
    
                if platform.system() == 'Windows':
                    info = subprocess.STARTUPINFO()
                    info.dwFlags = subprocess.STARTF_USESHOWWINDOW
                    info.wShowWindow = 0  # SW_HIDE (6 == SW_MINIMIZE)
                else:
                    info = None
    
                self.process = subprocess.Popen(
                    cmd, env=self.env,
                    close_fds=platform.system() != 'Windows',
                    startupinfo=info,
                    stdout=self.log_file,
                    stderr=self.log_file,
                    stdin=subprocess.PIPE)
            except TypeError:
                raise
            except OSError as err:
                if err.errno == errno.ENOENT:
                    raise WebDriverException(
                        "'%s' executable needs to be in PATH. %s" % (
                            os.path.basename(self.path), self.start_error_message)
                    )
                elif err.errno == errno.EACCES:
                    raise WebDriverException(
                        "'%s' executable may have wrong permissions. %s" % (
                            os.path.basename(self.path), self.start_error_message)
                    )
                else:
                    raise
            except Exception as e:
                raise WebDriverException(
                    "Executable %s must be in path. %s\n%s" % (
                        os.path.basename(self.path), self.start_error_message,
                        str(e)))
            count = 0
            while True:
                self.assert_process_still_running()
                if self.is_connectable():
                    break
                count += 1
                time.sleep(1)
                if count == 30:
                    raise WebDriverException("Can't connect to the Service %s" % (
                        self.path,))
    
    
    class HiddenChromeWebDriver(webdriver.WebDriver):
        def __init__(self, executable_path="chromedriver", port=0,
                    options=None, service_args=None,
                    desired_capabilities=None, service_log_path=None,
                    chrome_options=None, keep_alive=True):
            if chrome_options:
                warnings.warn('use options instead of chrome_options',
                            DeprecationWarning, stacklevel=2)
                options = chrome_options
    
            if options is None:
                # desired_capabilities stays as passed in
                if desired_capabilities is None:
                    desired_capabilities = self.create_options().to_capabilities()
            else:
                if desired_capabilities is None:
                    desired_capabilities = options.to_capabilities()
                else:
                    desired_capabilities.update(options.to_capabilities())
    
            self.service = HiddenChromeService(
                executable_path,
                port=port,
                service_args=service_args,
                log_path=service_log_path)
            self.service.start()
    
            try:
                RemoteWebDriver.__init__(
                    self,
                    command_executor=remote_connection.ChromeRemoteConnection(
                        remote_server_addr=self.service.service_url,
                        keep_alive=keep_alive),
                    desired_capabilities=desired_capabilities)
            except Exception:
                self.quit()
                raise
            self._is_remote = False
    

    I removed some of the extra comments and doc string goo for brevity. You would then use this custom WebDriver the same way you'd use the official Chrome one in Selenium:

    from selenium import webdriver
    options = webdriver.ChromeOptions()
    options.add_argument('headless')
    headless_chrome = HiddenChromeWebDriver(chrome_options=options)
    
    headless_chrome.get('http://www.example.com/')
    
    headless_chrome.quit()
    

    Finally, if creating a custom WebDriver is not for you and you don't mind a window flickering and disappearing then you can also use the win32gui library to hide the window after starting up:

    # hide chromedriver console on Windows
    def enumWindowFunc(hwnd, windowList):
        """ win32gui.EnumWindows() callback """
        text = win32gui.GetWindowText(hwnd)
        className = win32gui.GetClassName(hwnd)
        if 'chromedriver' in text.lower() or 'chromedriver' in className.lower():
            win32gui.ShowWindow(hwnd, False)
    win32gui.EnumWindows(enumWindowFunc, [])
    
    0 讨论(0)
  • 2020-12-01 07:52

    You will have to edit Selenium Source code to achieve this. I am a noob too, and I dont fully understand the overall consequences of editing source code but here is what I did to achieve hiding the webdriver console window on Windows 7, Python 2.7.

    Locate and edit this file as follows: located at Lib\site-packages\selenium\webdriver\common\service.py in your Python folder.

    Edit the Start() function by adding the creation flags this way: creationflags=CREATE_NO_WINDOW

    The edited method will be as below:

    def start(self):
        """
        Starts the Service.
    
        :Exceptions:
         - WebDriverException : Raised either when it can't start the service
           or when it can't connect to the service
        """
        try:
            cmd = [self.path]
            cmd.extend(self.command_line_args())
            self.process = subprocess.Popen(cmd, env=self.env,
                                            close_fds=platform.system() != 'Windows',
                                            stdout=self.log_file, stderr=self.log_file, creationflags=CREATE_NO_WINDOW)
        except TypeError:
            raise
    

    You will have to add the relevant imports:

    from win32process import CREATE_NO_WINDOW
    

    This should also work for Chrome webdriver as they import the same file to start the webdriver process.

    0 讨论(0)
提交回复
热议问题