Improve webdriver download

This commit is contained in:
sebthom
2022-03-23 22:23:26 +01:00
parent 6a12b8bceb
commit d673743912

View File

@@ -18,7 +18,7 @@ from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select, WebDriverWait from selenium.webdriver.support.ui import Select, WebDriverWait
import selenium_stealth import selenium_stealth
import webdriver_manager.utils as ChromeDriverManagerUtils import webdriver_manager.utils
from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager from webdriver_manager.microsoft import EdgeChromiumDriverManager
from webdriver_manager.utils import ChromeType, OSType from webdriver_manager.utils import ChromeType, OSType
@@ -118,10 +118,12 @@ class SeleniumMixin:
LOG.info("Using Browser: %s %s [%s]", chrome_type.upper(), chrome_version, self.browser_config.binary_location) LOG.info("Using Browser: %s %s [%s]", chrome_type.upper(), chrome_version, self.browser_config.binary_location)
chrome_major_version = chrome_version.split(".", 1)[0] chrome_major_version = chrome_version.split(".", 1)[0]
# hack to specify the concrete browser version for which the driver shall be downloaded
webdriver_manager.driver.get_browser_version_from_os = lambda _: chrome_major_version
# download and install matching chrome driver # download and install matching chrome driver
if chrome_type == ChromeType.MSEDGE: if chrome_type == ChromeType.MSEDGE:
webdriver_mgr = EdgeChromiumDriverManager(cache_valid_range = 14) webdriver_mgr = EdgeChromiumDriverManager(cache_valid_range = 14)
webdriver_mgr.driver.browser_version = chrome_major_version
webdriver_path = webdriver_mgr.install() webdriver_path = webdriver_mgr.install()
env = os.environ.copy() env = os.environ.copy()
env["MSEDGEDRIVER_TELEMETRY_OPTOUT"] = "1" # https://docs.microsoft.com/en-us/microsoft-edge/privacy-whitepaper/#microsoft-edge-driver env["MSEDGEDRIVER_TELEMETRY_OPTOUT"] = "1" # https://docs.microsoft.com/en-us/microsoft-edge/privacy-whitepaper/#microsoft-edge-driver
@@ -131,7 +133,6 @@ class SeleniumMixin:
) )
else: else:
webdriver_mgr = ChromeDriverManager(chrome_type = chrome_type, cache_valid_range = 14) webdriver_mgr = ChromeDriverManager(chrome_type = chrome_type, cache_valid_range = 14)
webdriver_mgr.driver.browser_version = chrome_major_version
webdriver_path = webdriver_mgr.install() webdriver_path = webdriver_mgr.install()
self.webdriver = webdriver.Chrome(service = ChromeService(webdriver_path), options = self._init_browser_options(webdriver.ChromeOptions())) self.webdriver = webdriver.Chrome(service = ChromeService(webdriver_path), options = self._init_browser_options(webdriver.ChromeOptions()))
@@ -147,7 +148,7 @@ class SeleniumMixin:
LOG.info("New WebDriver session is: %s %s", self.webdriver.session_id, self.webdriver.command_executor._url) # pylint: disable=protected-access LOG.info("New WebDriver session is: %s %s", self.webdriver.session_id, self.webdriver.command_executor._url) # pylint: disable=protected-access
def get_browser_version(self, executable_path: str) -> tuple[ChromeType, str]: def get_browser_version(self, executable_path: str) -> tuple[ChromeType, str]:
match ChromeDriverManagerUtils.os_name(): match webdriver_manager.utils.os_name():
case OSType.WIN: case OSType.WIN:
import win32api # pylint: disable=import-outside-toplevel,import-error import win32api # pylint: disable=import-outside-toplevel,import-error
# pylint: disable=no-member # pylint: disable=no-member
@@ -164,7 +165,7 @@ class SeleniumMixin:
return (ChromeType.GOOGLE, product_version) return (ChromeType.GOOGLE, product_version)
case OSType.LINUX: case OSType.LINUX:
version_cmd = ChromeDriverManagerUtils.linux_browser_apps_to_cmd(f'"{executable_path}"') version_cmd = webdriver_manager.utils.linux_browser_apps_to_cmd(f'"{executable_path}"')
case _: case _:
version_cmd = f'"{executable_path}" --version' version_cmd = f'"{executable_path}" --version'
@@ -173,20 +174,20 @@ class SeleniumMixin:
if "chromium" in filename: if "chromium" in filename:
return ( return (
ChromeType.CHROMIUM, ChromeType.CHROMIUM,
ChromeDriverManagerUtils.read_version_from_cmd(version_cmd, ChromeDriverManagerUtils.PATTERN[ChromeType.CHROMIUM]) webdriver_manager.utils.read_version_from_cmd(version_cmd, webdriver_manager.utils.PATTERN[ChromeType.CHROMIUM])
) )
if "edge" in filename: if "edge" in filename:
return ( return (
ChromeType.MSEDGE, ChromeType.MSEDGE,
ChromeDriverManagerUtils.read_version_from_cmd(version_cmd, ChromeDriverManagerUtils.PATTERN[ChromeType.MSEDGE]) webdriver_manager.utils.read_version_from_cmd(version_cmd, webdriver_manager.utils.PATTERN[ChromeType.MSEDGE])
) )
return ( return (
ChromeType.GOOGLE, ChromeType.GOOGLE,
ChromeDriverManagerUtils.read_version_from_cmd(version_cmd, ChromeDriverManagerUtils.PATTERN[ChromeType.GOOGLE]) webdriver_manager.utils.read_version_from_cmd(version_cmd, webdriver_manager.utils.PATTERN[ChromeType.GOOGLE])
) )
def find_compatible_browser(self) -> tuple[str, ChromeType, str] | None: def find_compatible_browser(self) -> tuple[str, ChromeType, str] | None:
match ChromeDriverManagerUtils.os_name(): match webdriver_manager.utils.os_name():
case OSType.LINUX: case OSType.LINUX:
browser_paths = [ browser_paths = [
shutil.which("chromium"), shutil.which("chromium"),