107 lines
3.8 KiB
Python
107 lines
3.8 KiB
Python
__author__ = "https://stackoverflow.com/a/52883069/6120487"
|
|
|
|
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
|