diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index 5cd83eb2b..4a9010376 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -44,7 +44,9 @@ 'android': "_make_android", 'iphone': "_make_iphone", 'safari': "_make_safari", - 'edge': "_make_edge" + 'edge': "_make_edge", + 'headlessfirefox': '_make_headless_ff', + 'headlesschrome': '_make_headless_chrome' }) @@ -88,6 +90,8 @@ def open_browser(self, url, browser='firefox', alias=None, | = Browser = | = Name(s) = | | Firefox | firefox, ff | | Google Chrome | googlechrome, chrome, gc | + | Headless Firefox | headlessfirefox | + | Headless Chrome | headlesschrome | | Internet Explorer | internetexplorer, ie | | Edge | edge | | Safari | safari | @@ -101,7 +105,9 @@ def open_browser(self, url, browser='firefox', alias=None, To be able to actually use one of these browsers, you need to have a matching Selenium browser driver available. See the [https://github.com/robotframework/SeleniumLibrary#browser-drivers| - project documentation] for more details. + project documentation] for more details. Headless Firefox and + Headless Chrome are new additions in SeleniumLibrary 3.1.0 + and require Selenium 3.8.0 or newer. Optional ``alias`` is an alias given for this browser instance and it can be used for switching between browsers. An alternative @@ -445,7 +451,7 @@ def _make_driver(self, browser_name, desired_capabilities=None, self._monkey_patch_speed(driver) return driver - def _make_ff(self, remote, desired_capabilities, profile_dir): + def _make_ff(self, remote, desired_capabilities, profile_dir, options=None): if is_falsy(profile_dir): profile = webdriver.FirefoxProfile() else: @@ -453,21 +459,32 @@ def _make_ff(self, remote, desired_capabilities, profile_dir): if is_truthy(remote): driver = self._create_remote_web_driver( webdriver.DesiredCapabilities.FIREFOX, remote, - desired_capabilities, profile) + desired_capabilities, profile, options=options) else: driver = webdriver.Firefox(firefox_profile=profile, + options=options, **self._geckodriver_log_config) return driver + def _make_headless_ff(self, remote, desired_capabilities, profile_dir): + options = webdriver.FirefoxOptions() + options.set_headless() + return self._make_ff(remote, desired_capabilities, profile_dir, options=options) + def _make_ie(self, remote, desired_capabilities, profile_dir): return self._generic_make_driver( webdriver.Ie, webdriver.DesiredCapabilities.INTERNETEXPLORER, remote, desired_capabilities) - def _make_chrome(self, remote, desired_capabilities, profile_dir): + def _make_chrome(self, remote, desired_capabilities, profile_dir, options=None): return self._generic_make_driver( webdriver.Chrome, webdriver.DesiredCapabilities.CHROME, remote, - desired_capabilities) + desired_capabilities, options=options) + + def _make_headless_chrome(self, remote, desired_capabilities, profile_dir): + options = webdriver.ChromeOptions() + options.set_headless() + return self._make_chrome(remote, desired_capabilities, profile_dir, options) def _make_opera(self, remote, desired_capabilities, profile_dir): return self._generic_make_driver( @@ -510,21 +527,26 @@ def _make_edge(self, remote, desired_capabilities, profile_dir): desired_capabilities) def _generic_make_driver(self, webdriver_type, desired_cap_type, - remote_url, desired_caps): + remote_url, desired_caps, options=None): """Generic driver creation Most of the make driver functions just call this function which creates the appropriate driver """ if is_falsy(remote_url): - driver = webdriver_type() + if options is None: + driver = webdriver_type() + else: + driver = webdriver_type(options=options) else: driver = self._create_remote_web_driver(desired_cap_type, - remote_url, desired_caps) + remote_url, desired_caps, + options=options) return driver def _create_remote_web_driver(self, capabilities_type, remote_url, - desired_capabilities=None, profile=None): + desired_capabilities=None, profile=None, + options=None): '''parses the string based desired_capabilities if neccessary and creates the associated remote web driver''' @@ -533,7 +555,8 @@ def _create_remote_web_driver(self, capabilities_type, remote_url, desired_capabilities = self._parse_capabilities_string(desired_capabilities) desired_capabilities_object.update(desired_capabilities or {}) return webdriver.Remote(desired_capabilities=desired_capabilities_object, - command_executor=str(remote_url), browser_profile=profile) + command_executor=str(remote_url), browser_profile=profile, + options=options) def _parse_capabilities_string(self, capabilities_string): '''parses the string based desired_capabilities which should be in the form diff --git a/test/acceptance/create_webdriver.robot b/test/acceptance/create_webdriver.robot index 8e1553105..6b1ad8e3f 100644 --- a/test/acceptance/create_webdriver.robot +++ b/test/acceptance/create_webdriver.robot @@ -37,13 +37,14 @@ Set Driver Variables ${drivers}= Create Dictionary ff=Firefox firefox=Firefox ie=Ie ... internetexplorer=Ie googlechrome=Chrome gc=Chrome ... chrome=Chrome opera=Opera phantomjs=PhantomJS safari=Safari + ... headlesschrome=Chrome headlessfirefox=Firefox ${name}= Evaluate "Remote" if "${REMOTE_URL}"!="None" else ${drivers}["${BROWSER.lower().replace(' ', '')}"] Set Test Variable ${DRIVER_NAME} ${name} ${dc names}= Create Dictionary ff=FIREFOX firefox=FIREFOX ie=INTERNETEXPLORER ... internetexplorer=INTERNETEXPLORER googlechrome=CHROME gc=CHROME ... chrome=CHROME opera=OPERA phantomjs=PHANTOMJS htmlunit=HTMLUNIT ... htmlunitwithjs=HTMLUNITWITHJS android=ANDROID iphone=IPHONE - ... safari=SAFARI + ... safari=SAFARI headlessfirefox=FIREFOX headlesschrome=CHROME ${dc name}= Get From Dictionary ${dc names} ${BROWSER.lower().replace(' ', '')} ${caps}= Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.${dc name} ... selenium.webdriver,sys