From 6eff3aeaa5498cb5960dbadba74944ad49abffd1 Mon Sep 17 00:00:00 2001 From: Harri Paavola Date: Thu, 7 Dec 2017 12:30:20 +0200 Subject: [PATCH 1/6] Added support for headless chrome and firefox --- .../keywords/browsermanagement.py | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index 5cd83eb2b..62a893399 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -44,7 +44,12 @@ 'android': "_make_android", 'iphone': "_make_iphone", 'safari': "_make_safari", - 'edge': "_make_edge" + 'edge': "_make_edge", + 'headlessfirefox': '_make_headless_ff', + 'headlessff': '_make_headless_ff', + 'headlessgooglechrome': '_make_headless_chrome', + 'headlessgc': '_make_headless_chrome', + 'headlesschrome': '_make_headless_chrome' }) @@ -445,7 +450,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,12 +458,18 @@ 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, @@ -469,6 +480,13 @@ def _make_chrome(self, remote, desired_capabilities, profile_dir): webdriver.Chrome, webdriver.DesiredCapabilities.CHROME, remote, desired_capabilities) + def _make_headless_chrome(self, remote, desired_capabilities, profile_dir): + options = webdriver.ChromeOptions() + options.set_headless() + return self._generic_make_driver( + webdriver.Chrome, webdriver.DesiredCapabilities.CHROME, remote, + desired_capabilities, options=options) + def _make_opera(self, remote, desired_capabilities, profile_dir): return self._generic_make_driver( webdriver.Opera, webdriver.DesiredCapabilities.OPERA, remote, @@ -510,21 +528,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 +556,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 From e7bb369bb0eceae1fb2ba6597fa5be3eb927f70a Mon Sep 17 00:00:00 2001 From: Harri Paavola Date: Thu, 7 Dec 2017 12:45:59 +0200 Subject: [PATCH 2/6] Updated Open Browser keyword documentation --- src/SeleniumLibrary/keywords/browsermanagement.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index 62a893399..057d36892 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -93,6 +93,8 @@ def open_browser(self, url, browser='firefox', alias=None, | = Browser = | = Name(s) = | | Firefox | firefox, ff | | Google Chrome | googlechrome, chrome, gc | + | Headless Firefox | headlessfirefox, headlessff | + | Headless Google Chrome | headlessgooglechrome, headlesschrome, headlessgc | | Internet Explorer | internetexplorer, ie | | Edge | edge | | Safari | safari | From 1fb359747435c6fdfef4c2344937c14d522a65ae Mon Sep 17 00:00:00 2001 From: Harri Paavola Date: Fri, 8 Dec 2017 09:01:06 +0200 Subject: [PATCH 3/6] Documented min selenium ver and fixed acceptance test --- src/SeleniumLibrary/keywords/browsermanagement.py | 3 ++- test/acceptance/create_webdriver.robot | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index 057d36892..0634b5935 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -108,7 +108,8 @@ 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 Google Chrome 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 diff --git a/test/acceptance/create_webdriver.robot b/test/acceptance/create_webdriver.robot index 8e1553105..024b30957 100644 --- a/test/acceptance/create_webdriver.robot +++ b/test/acceptance/create_webdriver.robot @@ -37,13 +37,17 @@ 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 headlessgc=Chrome + ... headlessgooglechrome=Chrome + ... headlessfirefox=Firefox headlessff=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 headlessff=FIREFOX + ... headlesschrome=CHROME headlessgooglechrome=CHROME headlessgc=CHROME ${dc name}= Get From Dictionary ${dc names} ${BROWSER.lower().replace(' ', '')} ${caps}= Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.${dc name} ... selenium.webdriver,sys From 3702494974e41c12c2df8e56e20e35ae2a9ae053 Mon Sep 17 00:00:00 2001 From: Harri Paavola Date: Tue, 12 Dec 2017 08:41:45 +0200 Subject: [PATCH 4/6] Simplified headless browser selection, fixed docs and unified make headless functions --- src/SeleniumLibrary/keywords/browsermanagement.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index 0634b5935..54f53ea7b 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -93,8 +93,8 @@ def open_browser(self, url, browser='firefox', alias=None, | = Browser = | = Name(s) = | | Firefox | firefox, ff | | Google Chrome | googlechrome, chrome, gc | - | Headless Firefox | headlessfirefox, headlessff | - | Headless Google Chrome | headlessgooglechrome, headlesschrome, headlessgc | + | Headless Firefox | headlessfirefox | + | Headless Chrome | headlesschrome | | Internet Explorer | internetexplorer, ie | | Edge | edge | | Safari | safari | @@ -109,7 +109,8 @@ def open_browser(self, url, browser='firefox', alias=None, a matching Selenium browser driver available. See the [https://github.com/robotframework/SeleniumLibrary#browser-drivers| project documentation] for more details. Headless Firefox and - Headless Google Chrome require Selenium 3.8.0 or newer. + 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 @@ -478,17 +479,15 @@ def _make_ie(self, remote, desired_capabilities, profile_dir): 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._generic_make_driver( - webdriver.Chrome, webdriver.DesiredCapabilities.CHROME, remote, - desired_capabilities, options=options) + return self._make_chrome(remote, desired_capabilities, profile_dir, options) def _make_opera(self, remote, desired_capabilities, profile_dir): return self._generic_make_driver( From 1ae5b5733ccc01559f796484decc21abe06dfd9e Mon Sep 17 00:00:00 2001 From: Harri Paavola Date: Tue, 12 Dec 2017 09:40:48 +0200 Subject: [PATCH 5/6] Removed unwanted driver names --- test/acceptance/create_webdriver.robot | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/test/acceptance/create_webdriver.robot b/test/acceptance/create_webdriver.robot index 024b30957..6b1ad8e3f 100644 --- a/test/acceptance/create_webdriver.robot +++ b/test/acceptance/create_webdriver.robot @@ -37,17 +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 headlessgc=Chrome - ... headlessgooglechrome=Chrome - ... headlessfirefox=Firefox headlessff=Firefox + ... 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 headlessfirefox=FIREFOX headlessff=FIREFOX - ... headlesschrome=CHROME headlessgooglechrome=CHROME headlessgc=CHROME + ... 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 From b6dc9f3b9615388de35ec026fbfa89bb518760ee Mon Sep 17 00:00:00 2001 From: Harri Paavola Date: Wed, 13 Dec 2017 15:00:22 +0200 Subject: [PATCH 6/6] Removed unwanted headless browser names --- src/SeleniumLibrary/keywords/browsermanagement.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index 54f53ea7b..4a9010376 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -46,9 +46,6 @@ 'safari': "_make_safari", 'edge': "_make_edge", 'headlessfirefox': '_make_headless_ff', - 'headlessff': '_make_headless_ff', - 'headlessgooglechrome': '_make_headless_chrome', - 'headlessgc': '_make_headless_chrome', 'headlesschrome': '_make_headless_chrome' })