From b6df94ea03db4fec58dfdfdf24cae7005f4ef5d6 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Wed, 31 Mar 2021 18:38:10 +0700 Subject: [PATCH 01/11] Fix open browser support option as None --- Examples/browser-management/open-close-browser.robot | 4 ++++ PuppeteerLibrary/keywords/browsermanagement.py | 2 +- PuppeteerLibrary/library_context/ilibrary_context.py | 4 ++-- PuppeteerLibrary/playwright/playwright_context.py | 4 ++-- PuppeteerLibrary/puppeteer/puppeteer_context.py | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Examples/browser-management/open-close-browser.robot b/Examples/browser-management/open-close-browser.robot index 4af9152..450c6fe 100644 --- a/Examples/browser-management/open-close-browser.robot +++ b/Examples/browser-management/open-close-browser.robot @@ -9,6 +9,10 @@ ${DEFAULT_BROWSER} chrome *** Test Cases *** +Open browser without option + ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} + Open browser http://127.0.0.1:7272/basic-html-elements.html browser=${BROWSER} + Switch to new browser ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} ${HEADLESS} = Get variable value ${HEADLESS} ${False} diff --git a/PuppeteerLibrary/keywords/browsermanagement.py b/PuppeteerLibrary/keywords/browsermanagement.py index 66b5bff..8262185 100644 --- a/PuppeteerLibrary/keywords/browsermanagement.py +++ b/PuppeteerLibrary/keywords/browsermanagement.py @@ -12,7 +12,7 @@ def get_async_keyword_group(self) -> iBrowserManagementAsync: return self.ctx.get_current_library_context().get_async_keyword_group(type(self).__name__) @keyword - def open_browser(self, url, browser="chrome", alias=None, options=None): + def open_browser(self, url, browser="chrome", alias=None, options={}): """Opens a new browser instance to the specific ``url``. The ``browser`` argument specifies which browser to use. diff --git a/PuppeteerLibrary/library_context/ilibrary_context.py b/PuppeteerLibrary/library_context/ilibrary_context.py index 8745aa8..96c6dff 100644 --- a/PuppeteerLibrary/library_context/ilibrary_context.py +++ b/PuppeteerLibrary/library_context/ilibrary_context.py @@ -14,7 +14,7 @@ def __init__(self, browser_type: str): self.screenshot_path = os.curdir @abstractmethod - async def start_server(self, options: dict=None): + async def start_server(self, options: dict={}): pass @abstractmethod @@ -26,7 +26,7 @@ def is_server_started(self) -> bool: pass @abstractmethod - async def create_new_page(self, options: dict=None) -> BasePage: + async def create_new_page(self, options: dict={}) -> BasePage: pass @abstractmethod diff --git a/PuppeteerLibrary/playwright/playwright_context.py b/PuppeteerLibrary/playwright/playwright_context.py index 5ea74d5..3ed6795 100644 --- a/PuppeteerLibrary/playwright/playwright_context.py +++ b/PuppeteerLibrary/playwright/playwright_context.py @@ -33,7 +33,7 @@ class PlaywrightContext(iLibraryContext): def __init__(self, browser_type: str): super().__init__(browser_type) - async def start_server(self, options: dict=None): + async def start_server(self, options: dict={}): default_options = { 'slowMo': 0, 'headless': True, @@ -67,7 +67,7 @@ def is_server_started(self) -> bool: return True return False - async def create_new_page(self, options: dict=None) -> BasePage: + async def create_new_page(self, options: dict={}) -> BasePage: device_options = { 'accept_downloads': True } diff --git a/PuppeteerLibrary/puppeteer/puppeteer_context.py b/PuppeteerLibrary/puppeteer/puppeteer_context.py index 45f847b..2a5e68c 100644 --- a/PuppeteerLibrary/puppeteer/puppeteer_context.py +++ b/PuppeteerLibrary/puppeteer/puppeteer_context.py @@ -35,7 +35,7 @@ class PuppeteerContext(iLibraryContext): def __init__(self, browser_type: str): super().__init__(browser_type) - async def start_server(self, options: dict=None): + async def start_server(self, options: dict={}): default_args = [] default_options = { 'slowMo': 0, @@ -74,7 +74,7 @@ def is_server_started(self) -> bool: return True return False - async def create_new_page(self, options: dict=None) -> BasePage: + async def create_new_page(self, options: dict={}) -> BasePage: new_page = await self.browser.newPage() self.current_page = PuppeteerPage(new_page) if 'emulate' in options: From 34396b616c313addf6d13979c1f9e2f6d9fecf10 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Wed, 31 Mar 2021 18:50:56 +0700 Subject: [PATCH 02/11] Add demo other options --- .../browser-management/open-close-browser.robot | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Examples/browser-management/open-close-browser.robot b/Examples/browser-management/open-close-browser.robot index 450c6fe..fa53138 100644 --- a/Examples/browser-management/open-close-browser.robot +++ b/Examples/browser-management/open-close-browser.robot @@ -5,14 +5,23 @@ Test Teardown Close All Browser *** Variables *** -${DEFAULT_BROWSER} chrome +${DEFAULT_BROWSER} pwchrome *** Test Cases *** Open browser without option ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} Open browser http://127.0.0.1:7272/basic-html-elements.html browser=${BROWSER} - + +Ignore https error + ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} + ${HEADLESS} = Get variable value ${HEADLESS} ${False} + &{options} = create dictionary + ... headless=${HEADLESS} + ... ignore_https_errors=${True} + ... ignoreHTTPSErrors=${True} + Open browser https://http-password.badssl.com browser=${BROWSER} options=${options} + Switch to new browser ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} ${HEADLESS} = Get variable value ${HEADLESS} ${False} From a16099e746dfe3dbf420991d0ef29c6b49c5c229 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Wed, 31 Mar 2021 18:52:46 +0700 Subject: [PATCH 03/11] Clean up code --- Examples/browser-management/open-close-browser.robot | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Examples/browser-management/open-close-browser.robot b/Examples/browser-management/open-close-browser.robot index fa53138..836b686 100644 --- a/Examples/browser-management/open-close-browser.robot +++ b/Examples/browser-management/open-close-browser.robot @@ -13,15 +13,6 @@ Open browser without option ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} Open browser http://127.0.0.1:7272/basic-html-elements.html browser=${BROWSER} -Ignore https error - ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} - ${HEADLESS} = Get variable value ${HEADLESS} ${False} - &{options} = create dictionary - ... headless=${HEADLESS} - ... ignore_https_errors=${True} - ... ignoreHTTPSErrors=${True} - Open browser https://http-password.badssl.com browser=${BROWSER} options=${options} - Switch to new browser ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} ${HEADLESS} = Get variable value ${HEADLESS} ${False} From b75fe3763820e967a1431c08be4aebfa2c92cf7b Mon Sep 17 00:00:00 2001 From: atthaboons Date: Wed, 31 Mar 2021 18:56:49 +0700 Subject: [PATCH 04/11] Update ubuntu lib version --- .github/workflows/pythonpackage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index 9ae55c0..6169f69 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -49,7 +49,7 @@ jobs: libegl1 \ libnotify4 \ libxslt1.1 \ - libevent-2.1-6 \ + libevent-2.1-7 \ libgles2 \ libvpx5 \ libxcomposite1 \ From f4d08b037a8dc431e20f2ed18a20e0579484ebf7 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Wed, 31 Mar 2021 18:58:40 +0700 Subject: [PATCH 05/11] Update libvpx to v6 --- .github/workflows/pythonpackage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index 6169f69..507933d 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -51,7 +51,7 @@ jobs: libxslt1.1 \ libevent-2.1-7 \ libgles2 \ - libvpx5 \ + libvpx6 \ libxcomposite1 \ libatk1.0-0 \ libatk-bridge2.0-0 \ From 801c9044295685e4279a287051db38a593013b9f Mon Sep 17 00:00:00 2001 From: atthaboons Date: Wed, 31 Mar 2021 19:02:18 +0700 Subject: [PATCH 06/11] Add missing lib --- .github/workflows/pythonpackage.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index 507933d..7b9ff22 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -57,6 +57,7 @@ jobs: libatk-bridge2.0-0 \ libepoxy0 \ libgtk-3-0 \ + libgstreamer-gl1.0-0 \ libharfbuzz-icu0 \ xvfb - name: Lint with flake8 From 24724ae244d15b5107d6290ff195945311147450 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Thu, 1 Apr 2021 15:17:15 +0700 Subject: [PATCH 07/11] support browser options --- .../browser-management/open-close-browser.robot | 14 ++++++++++++-- PuppeteerLibrary/keywords/browsermanagement.py | 3 +++ PuppeteerLibrary/playwright/playwright_context.py | 13 ++++++++++--- PuppeteerLibrary/puppeteer/puppeteer_context.py | 12 +++++++++--- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/Examples/browser-management/open-close-browser.robot b/Examples/browser-management/open-close-browser.robot index 836b686..a6836ca 100644 --- a/Examples/browser-management/open-close-browser.robot +++ b/Examples/browser-management/open-close-browser.robot @@ -5,14 +5,24 @@ Test Teardown Close All Browser *** Variables *** -${DEFAULT_BROWSER} pwchrome +${DEFAULT_BROWSER} chrome *** Test Cases *** Open browser without option ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} Open browser http://127.0.0.1:7272/basic-html-elements.html browser=${BROWSER} - + +Open ssl issue page + ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} + ${HEADLESS} = Get variable value ${HEADLESS} ${False} + &{options} = create dictionary + ... headless=${HEADLESS} + ... ignore_https_errors=${True} + ... ignoreHTTPSErrors=${True} + Open browser https://expired.badssl.com/ browser=${BROWSER} options=${options} + Capture Page Screenshot + Switch to new browser ${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER} ${HEADLESS} = Get variable value ${HEADLESS} ${False} diff --git a/PuppeteerLibrary/keywords/browsermanagement.py b/PuppeteerLibrary/keywords/browsermanagement.py index 8262185..4565d71 100644 --- a/PuppeteerLibrary/keywords/browsermanagement.py +++ b/PuppeteerLibrary/keywords/browsermanagement.py @@ -37,6 +37,9 @@ def open_browser(self, url, browser="chrome", alias=None, options={}): | `Open browser` | https://www.w3schools.com/html/html_forms.asp | options=${options} | """ + if options is None: + options = {} + self.info(url) library_context = self.ctx.create_library_context(alias, browser) self.loop.run_until_complete(library_context.start_server(options)) diff --git a/PuppeteerLibrary/playwright/playwright_context.py b/PuppeteerLibrary/playwright/playwright_context.py index 3ed6795..0142b20 100644 --- a/PuppeteerLibrary/playwright/playwright_context.py +++ b/PuppeteerLibrary/playwright/playwright_context.py @@ -29,6 +29,8 @@ class PlaywrightContext(iLibraryContext): browser: any = None current_page: any = None current_iframe = None + + page_support_options = ['accept_downloads', 'bypass_csp', 'color_scheme', 'device_scale_factor', 'extra_http_headers', 'ignore_https_errors', 'locale', 'no_viewport', 'permissions', 'viewport '] def __init__(self, browser_type: str): super().__init__(browser_type) @@ -43,8 +45,7 @@ async def start_server(self, options: dict={}): 'accept_downloads': True } merged_options = default_options - if options is not None: - merged_options = {**merged_options, **options} + merged_options = {**merged_options, **options} self.playwright = await async_playwright().start() if self.browser_type == "pwchrome": @@ -55,7 +56,7 @@ async def start_server(self, options: dict={}): headless=merged_options['headless']) elif self.browser_type == "firefox": self.browser = await self.playwright.firefox.launch( - headless=merged_options['headless']) + headless=merged_options['headless']) self.browser.accept_downloads = True async def stop_server(self): @@ -71,8 +72,14 @@ async def create_new_page(self, options: dict={}) -> BasePage: device_options = { 'accept_downloads': True } + + for support_key in self.page_support_options: + if support_key in options: + device_options[support_key] = options[support_key] + if 'emulate' in options: device_options = self.playwright.devices[options['emulate']] + new_page = await self.browser.new_page(**device_options) self.current_page = PlaywrightPage(new_page) return self.current_page diff --git a/PuppeteerLibrary/puppeteer/puppeteer_context.py b/PuppeteerLibrary/puppeteer/puppeteer_context.py index 2a5e68c..48d914d 100644 --- a/PuppeteerLibrary/puppeteer/puppeteer_context.py +++ b/PuppeteerLibrary/puppeteer/puppeteer_context.py @@ -32,6 +32,8 @@ class PuppeteerContext(iLibraryContext): 'devtools': False } + page_support_options = ['accept_downloads', 'bypass_csp', 'color_scheme', 'device_scale_factor', 'extra_http_headers', 'ignore_https_errors', 'ignoreHTTPSErrors', 'locale', 'no_viewport', 'permissions', 'viewport '] + def __init__(self, browser_type: str): super().__init__(browser_type) @@ -45,9 +47,7 @@ async def start_server(self, options: dict={}): 'height': 768 } merged_options = default_options - - if options is not None: - merged_options = {**merged_options, **options} + merged_options = {**merged_options, **options} if self.debug_mode is True: merged_options = {**merged_options, **self.debug_mode_options} @@ -55,6 +55,11 @@ async def start_server(self, options: dict={}): if 'win' not in sys.platform.lower(): default_args = ['--no-sandbox', '--disable-setuid-sandbox'] + support_options = {} + for support_key in self.page_support_options: + if support_key in options: + support_options[support_key] = options[support_key] + self.browser = await launch( headless=merged_options['headless'], slowMo=merged_options['slowMo'], @@ -63,6 +68,7 @@ async def start_server(self, options: dict={}): 'width': merged_options['width'], 'height': merged_options['height'] }, + **support_options, args=default_args) async def stop_server(self): From 7c496c8e366c3289c3023faac07652defd469c28 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Thu, 1 Apr 2021 21:56:20 +0700 Subject: [PATCH 08/11] support all options --- PuppeteerLibrary/playwright/playwright_context.py | 2 +- PuppeteerLibrary/puppeteer/puppeteer_context.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PuppeteerLibrary/playwright/playwright_context.py b/PuppeteerLibrary/playwright/playwright_context.py index 0142b20..5e8ac1c 100644 --- a/PuppeteerLibrary/playwright/playwright_context.py +++ b/PuppeteerLibrary/playwright/playwright_context.py @@ -30,7 +30,7 @@ class PlaywrightContext(iLibraryContext): current_page: any = None current_iframe = None - page_support_options = ['accept_downloads', 'bypass_csp', 'color_scheme', 'device_scale_factor', 'extra_http_headers', 'ignore_https_errors', 'locale', 'no_viewport', 'permissions', 'viewport '] + page_support_options = ['accept_downloads', 'bypass_csp', 'color_scheme', 'device_scale_factor', 'extra_http_headers', 'geolocation', 'has_touch', 'http_credentials', 'ignore_https_errors', 'is_mobile', 'java_script_enabled', 'locale', 'no_viewport', 'offline', 'permissions', 'proxy', 'record_har_omit_content', 'record_har_path', 'record_video_dir', 'record_video_size', 'timezone_id', 'user_agent', 'viewport'] def __init__(self, browser_type: str): super().__init__(browser_type) diff --git a/PuppeteerLibrary/puppeteer/puppeteer_context.py b/PuppeteerLibrary/puppeteer/puppeteer_context.py index 48d914d..6342aab 100644 --- a/PuppeteerLibrary/puppeteer/puppeteer_context.py +++ b/PuppeteerLibrary/puppeteer/puppeteer_context.py @@ -32,7 +32,7 @@ class PuppeteerContext(iLibraryContext): 'devtools': False } - page_support_options = ['accept_downloads', 'bypass_csp', 'color_scheme', 'device_scale_factor', 'extra_http_headers', 'ignore_https_errors', 'ignoreHTTPSErrors', 'locale', 'no_viewport', 'permissions', 'viewport '] + page_support_options = ['ignoreHTTPSErrors', 'headless', 'executablePath', 'slowMo', 'defaultViewport', 'handleSIGINT', 'handleSIGTERM', 'handleSIGHUP', 'userDataDir', 'env', 'devtools'] def __init__(self, browser_type: str): super().__init__(browser_type) From 4f67af7a9e75bd4f574df701d326b356c96d1c67 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Thu, 1 Apr 2021 21:58:19 +0700 Subject: [PATCH 09/11] Add documents --- PuppeteerLibrary/keywords/browsermanagement.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PuppeteerLibrary/keywords/browsermanagement.py b/PuppeteerLibrary/keywords/browsermanagement.py index 4565d71..c80f4e9 100644 --- a/PuppeteerLibrary/keywords/browsermanagement.py +++ b/PuppeteerLibrary/keywords/browsermanagement.py @@ -31,6 +31,10 @@ def open_browser(self, url, browser="chrome", alias=None, options={}): | height | default 768 | | emulate | iPhone 11 | + **Other options** + pwchrome, webkit and firefox please visit: https://playwright.dev/python/docs/api/class-browser?_highlight=new_page#browsernew_pagekwargs + chrome please visit: https://pptr.dev/#?product=Puppeteer&version=v8.0.0&show=api-puppeteerlaunchoptions + Example: | &{options} = | create dictionary | headless=${False} | From 5abe7d048ba886e73efe65ec1a6ade1c94ce7da9 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Thu, 1 Apr 2021 22:04:18 +0700 Subject: [PATCH 10/11] Fix path issue --- PuppeteerLibrary/puppeteer/puppeteer_context.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/PuppeteerLibrary/puppeteer/puppeteer_context.py b/PuppeteerLibrary/puppeteer/puppeteer_context.py index 6342aab..4b99d58 100644 --- a/PuppeteerLibrary/puppeteer/puppeteer_context.py +++ b/PuppeteerLibrary/puppeteer/puppeteer_context.py @@ -55,19 +55,17 @@ async def start_server(self, options: dict={}): if 'win' not in sys.platform.lower(): default_args = ['--no-sandbox', '--disable-setuid-sandbox'] + merged_options['defaultViewport'] = { + 'width': merged_options['width'], + 'height': merged_options['height'] + } + support_options = {} for support_key in self.page_support_options: if support_key in options: - support_options[support_key] = options[support_key] + merged_options[support_key] = options[support_key] self.browser = await launch( - headless=merged_options['headless'], - slowMo=merged_options['slowMo'], - devtools=merged_options['devtools'], - defaultViewport={ - 'width': merged_options['width'], - 'height': merged_options['height'] - }, **support_options, args=default_args) From 9b7b2519db5d0fd9634a004a27f4e9b1bbca9fd6 Mon Sep 17 00:00:00 2001 From: atthaboons Date: Thu, 1 Apr 2021 22:11:33 +0700 Subject: [PATCH 11/11] Fix puppeteer options --- .../puppeteer/puppeteer_context.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/PuppeteerLibrary/puppeteer/puppeteer_context.py b/PuppeteerLibrary/puppeteer/puppeteer_context.py index 4b99d58..cc84615 100644 --- a/PuppeteerLibrary/puppeteer/puppeteer_context.py +++ b/PuppeteerLibrary/puppeteer/puppeteer_context.py @@ -39,14 +39,15 @@ def __init__(self, browser_type: str): async def start_server(self, options: dict={}): default_args = [] - default_options = { + merged_options = { 'slowMo': 0, 'headless': True, 'devtools': False, - 'width': 1366, - 'height': 768 + 'defaultViewport': { + 'width': 1366, + 'height': 768 + } } - merged_options = default_options merged_options = {**merged_options, **options} if self.debug_mode is True: @@ -54,19 +55,13 @@ async def start_server(self, options: dict={}): if 'win' not in sys.platform.lower(): default_args = ['--no-sandbox', '--disable-setuid-sandbox'] - - merged_options['defaultViewport'] = { - 'width': merged_options['width'], - 'height': merged_options['height'] - } - - support_options = {} + for support_key in self.page_support_options: if support_key in options: merged_options[support_key] = options[support_key] self.browser = await launch( - **support_options, + **merged_options, args=default_args) async def stop_server(self):