""" @package base WebDriver Factory class implementation It creates a web-driver instance based on browser configurations """ import copy import os from abc import ABC from selenium import webdriver as selenium_webdriver from appium import webdriver as appium_webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from .constants import DriverType from ..utils import CoreConfig from ui_automation_framework.core.mobile_helper import MobileHelper class DriverFactory: def get_driver(self): if CoreConfig.SELENIUM_ENV == DriverType.LOCAL: return LocalWebDriver().get_driver() if CoreConfig.SELENIUM_ENV == DriverType.WEB: return WebDriver().get_driver() if CoreConfig.SELENIUM_ENV == DriverType.WEB_BS: return BrowserStackWebDriver().get_driver() if CoreConfig.SELENIUM_ENV == DriverType.MOBILE: return MobileDriver().get_driver() if CoreConfig.SELENIUM_ENV == DriverType.MOBILE_BS: return BrowserStackMobileDriver().get_driver() if CoreConfig.SELENIUM_ENV == DriverType.API: return None raise NotImplementedError("Selenium env is not supported") class ABCDriverObject(ABC): def __init__(self): self.executor = None self.capabilities = {} self.options = None class Driver(ABC): remote = None def get_driver(self): return self.init_driver() def init_driver(self): driver = self._init_driver(CoreConfig.BROWSER_NAME) if not driver: raise NotImplementedError() payload = dict(command_executor=driver.executor, desired_capabilities=driver.capabilities) if driver.options: payload["options"] = driver.options return self.remote(**payload) def _init_driver(self, browser): raise NotImplementedError() # Web ================================================================================================================== class ABCWebDriver(Driver): remote = selenium_webdriver.Remote def init_driver(self): driver = super().init_driver() driver.implicitly_wait(int(CoreConfig.SELENIUM_TIMEOUT)) driver.set_page_load_timeout(int(CoreConfig.SELENIUM_TIMEOUT)) driver.set_window_size(1920, 1080) driver.get(CoreConfig.ENV_BASE_URL) return driver class LocalWebDriver(ABCWebDriver): def get_driver(self): location = os.path.abspath(CoreConfig.CHROMEDRIVER_PATH) os.environ["webdriver.chrome.driver"] = location options = Options() options.add_argument('--no-sandbox') options.headless = bool(CoreConfig.SELENIUM_HEADLESS) capabilities = DesiredCapabilities.CHROME capabilities["goog:loggingPrefs"] = {"browser": "ALL", "performance": "ALL"} driver = selenium_webdriver.Chrome(executable_path=location, desired_capabilities=capabilities, options=options) driver.implicitly_wait(int(CoreConfig.SELENIUM_TIMEOUT)) driver.set_page_load_timeout(int(CoreConfig.SELENIUM_TIMEOUT)) driver.set_window_size(1920, 1080) driver.get(CoreConfig.ENV_BASE_URL) return driver class WebDriver(ABCWebDriver): BROWSER_CHROME = "chrome" BROWSER_FIREFOX = "firefox" selenoid_log = True res = "1920x1080x24" class BrowserDriver(ABCDriverObject): def __init__(self): super().__init__() self.executor = "http://" + CoreConfig.SELENOID_HOST + ":4444/wd/hub" class ChromeDriver(BrowserDriver): def __init__(self): super().__init__() self.capabilities = { "browserName": WebDriver.BROWSER_CHROME, "enableVNC": not bool(CoreConfig.SELENIUM_HEADLESS), "enableVideo": bool(CoreConfig.SELENIUM_HEADLESS), "enableLog": WebDriver.selenoid_log, "screenResolution": WebDriver.res, "goog:loggingPrefs": {"performance": "ALL"}, } self.options = Options() self.options.add_experimental_option( "prefs", { "profile.default_content_settings.popups": 0, "download.default_directory": "/home/selenium/Downloads", "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": False, "plugins.always_open_pdf_externally": True, "profile.content_settings.pattern_pairs.*.multiple-automatic-downloads": 1, }, ) self.options.headless = bool(CoreConfig.SELENIUM_HEADLESS) class FirefoxDriver(BrowserDriver): def __init__(self): super().__init__() self.capabilities = { "browserName": WebDriver.BROWSER_FIREFOX, "enableVNC": not bool(CoreConfig.SELENIUM_HEADLESS), "enableVideo": bool(CoreConfig.SELENIUM_HEADLESS), "enableLog": WebDriver.selenoid_log, "screenResolution": WebDriver.res, "loggingPrefs": {"browser": "ALL"}, } self.options = selenium_webdriver.FirefoxOptions() self.options.headless = bool(CoreConfig.SELENIUM_HEADLESS) def _init_driver(self, browser): if browser == self.BROWSER_CHROME: return self.ChromeDriver() if browser == self.BROWSER_FIREFOX: return self.FirefoxDriver() class BrowserStackWebDriver(ABCWebDriver): class BrowserstackDriver(ABCDriverObject): def __init__(self): super().__init__() self.executor = "https://???:???@hub-cloud.browserstack.com/wd/hub" class BrowserstackChromeDriver(BrowserstackDriver): def __init__(self): super().__init__() self.capabilities = {"browser": "Chrome", "resolution": "1920x1080"} self.options.add_argument("--lang=en_GB.UTF-8") def _init_driver(self, browser): return self.BrowserstackChromeDriver() # Mobile =============================================================================================================== class ABCMobileDriver(Driver): remote = appium_webdriver.Remote def init_driver(self): driver = super().init_driver() driver.implicitly_wait(int(CoreConfig.SELENIUM_TIMEOUT)) return driver class MobileDriver(ABCMobileDriver): class MobileDriver(ABCDriverObject): def __init__(self): super().__init__() self.executor = "http://127.0.0.1:4723/wd/hub" class IOSDriver(MobileDriver): def __init__(self): super().__init__() self.capabilities = copy.copy(MobileHelper.get_capabilities()) class AndroidDriver(MobileDriver): def __init__(self): super().__init__() raise NotImplementedError() def _init_driver(self, browser): if browser == "ios": return self.IOSDriver() if browser == "android": return self.AndroidDriver() class BrowserStackMobileDriver(ABCMobileDriver): BS_IOS = "browserstack_ios" BS_ANDROID = "browserstack_android" class BrowserstackDriver(ABCDriverObject): def __init__(self): super().__init__() self.executor = "http://hub-cloud.browserstack.com/wd/hub" class BrowserstackIOSDriver(BrowserstackDriver): def __init__(self): super().__init__() self.capabilities = copy.copy(MobileHelper.get_capabilities()) class BrowserstackAndroidDriver(BrowserstackDriver): def __init__(self): super().__init__() raise NotImplementedError() def _init_driver(self, browser): if browser == self.BS_IOS: return self.BrowserstackIOSDriver() if browser == self.BS_ANDROID: return self.BrowserstackAndroidDriver()