From 8dd9420da006975bc08e8e95a766226385341523 Mon Sep 17 00:00:00 2001 From: Nikhil Dhandre Date: Mon, 19 Aug 2019 17:52:59 +0530 Subject: [PATCH 1/4] windows handling Signed-off-by: Nikhil Dhandre --- src/widgetastic/browser.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/widgetastic/browser.py b/src/widgetastic/browser.py index 7a668cce..240bc85e 100644 --- a/src/widgetastic/browser.py +++ b/src/widgetastic/browser.py @@ -815,6 +815,43 @@ def get_current_location(self): # useful if it is necessary to recognize current frame return self.execute_script('return self.location.toString()') + @property + def current_window_handle(self): + """Returns the current window handle""" + window_handle = self.selenium.current_window_handle + self.logger.debug('current_window_handle -> %r', window_handle) + return window_handle + + @property + def window_handles(self): + """Returns all available window handles""" + window_handles = self.selenium.window_handles + self.logger.debug('window_handles -> %r', window_handles) + return window_handles + + def switch_to_window(self, window_name): + """switches focus to the specified window + + Args: + window_name: The name or window handle + """ + self.logger.debug("switch_to_window -> %r", window_name) + self.selenium.switch_to.window(window_name) + + def new_window(self, url): + """Opens the url in new window of the browser. + + Args: + url: web address to open in new window + """ + self.logger.info('Opening URL %r in new window', url) + self.selenium.execute_script("window.open('{url}', 'new window')".format(url=url)) + + def close_window(self): + """Close current window form browser""" + self.logger.debug("close_window -> %r", self.current_window_handle) + self.selenium.close() + class BrowserParentWrapper(object): """A wrapper/proxy class that ensures passing of correct parent locator on elements lookup. From 3f5a822169208b25cf35694a2599ef278d8bf7f7 Mon Sep 17 00:00:00 2001 From: Nikhil Dhandre Date: Mon, 16 Sep 2019 12:56:16 +0530 Subject: [PATCH 2/4] modification in windows methods Signed-off-by: Nikhil Dhandre --- src/widgetastic/browser.py | 59 ++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/src/widgetastic/browser.py b/src/widgetastic/browser.py index 240bc85e..c1629096 100644 --- a/src/widgetastic/browser.py +++ b/src/widgetastic/browser.py @@ -156,6 +156,13 @@ def url(self, address): self.logger.info('Opening URL: %r', address) self.selenium.get(address) + @property + def title(self): + """Returns current title""" + result = self.selenium.title + self.logger.info('current title -> %r', result) + return result + @property def handles_alerts(self): return self.selenium.capabilities.get('handlesAlerts', True) @@ -819,38 +826,60 @@ def get_current_location(self): def current_window_handle(self): """Returns the current window handle""" window_handle = self.selenium.current_window_handle - self.logger.debug('current_window_handle -> %r', window_handle) + self.logger.debug("current_window_handle -> %r", window_handle) return window_handle @property def window_handles(self): """Returns all available window handles""" - window_handles = self.selenium.window_handles - self.logger.debug('window_handles -> %r', window_handles) - return window_handles + handles = self.selenium.window_handles + self.logger.debug("window_handles -> %r", handles) + return handles - def switch_to_window(self, window_name): + def switch_to_window(self, window_handle): """switches focus to the specified window Args: - window_name: The name or window handle + window_handle: The name or window handle """ - self.logger.debug("switch_to_window -> %r", window_name) - self.selenium.switch_to.window(window_name) + self.logger.debug("switch_to_window -> %r", window_handle) + self.selenium.switch_to.window(window_handle) - def new_window(self, url): + def new_window(self, url, focus=False): """Opens the url in new window of the browser. Args: url: web address to open in new window + focus: switch focus to new window; default False + Returns: + new windows handle """ - self.logger.info('Opening URL %r in new window', url) - self.selenium.execute_script("window.open('{url}', 'new window')".format(url=url)) + handles = set(self.window_handles) + self.logger.info("Opening URL %r in new window", url) + self.selenium.execute_script("window.open('{url}', '_blank')".format(url=url)) + new_handle = (set(self.window_handles) - handles).pop() + + if focus: + self.switch_to_window(new_handle) + return new_handle - def close_window(self): - """Close current window form browser""" - self.logger.debug("close_window -> %r", self.current_window_handle) - self.selenium.close() + def close_window(self, window_handle=None): + """Close window form browser + + Args: + window_handle: The name or window handle; default current window handle + """ + main_window_handle = self.current_window_handle + self.logger.debug( + "close_window -> %r", window_handle if window_handle else main_window_handle + ) + + if window_handle and window_handle != main_window_handle: + self.switch_to_window(window_handle) + self.selenium.close() + self.switch_to_window(main_window_handle) + else: + self.selenium.close() class BrowserParentWrapper(object): From 30f6c1450a941d4dcedee02f9dabf2df92b13201 Mon Sep 17 00:00:00 2001 From: Nikhil Dhandre Date: Mon, 16 Sep 2019 12:57:37 +0530 Subject: [PATCH 3/4] test for windows handling Signed-off-by: Nikhil Dhandre --- src/widgetastic/browser.py | 6 ++-- testing/test_browser.py | 64 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/widgetastic/browser.py b/src/widgetastic/browser.py index c1629096..c5ed7a1f 100644 --- a/src/widgetastic/browser.py +++ b/src/widgetastic/browser.py @@ -159,9 +159,9 @@ def url(self, address): @property def title(self): """Returns current title""" - result = self.selenium.title - self.logger.info('current title -> %r', result) - return result + current_title = self.selenium.title + self.logger.info('Current title: %r', current_title) + return current_title @property def handles_alerts(self): diff --git a/testing/test_browser.py b/testing/test_browser.py index 448fb7c4..bf3cc8e6 100644 --- a/testing/test_browser.py +++ b/testing/test_browser.py @@ -218,3 +218,67 @@ def test_size(browser): width, height = browser.size_of('#exact_dimensions') assert width == 42 assert height == 69 + + +def test_current_window_handle(browser): + assert browser.title == "Test page" + assert browser.current_window_handle + + +def test_window_handles(request, browser): + assert len(browser.window_handles) == 1 + handle = browser.new_window(url="http://example.com") + + @request.addfinalizer + def _close_window(): + browser.close_window(handle) + + assert len(browser.window_handles) == 2 + assert set(browser.window_handles) == {browser.current_window_handle, handle} + + +@pytest.mark.parametrize("focus", [False, True], ids=["no_focus", "focus"]) +def test_new_window(request, browser, focus): + # main window handle + main_handle = browser.current_window_handle + + # open new window focus/no-focus + handle = browser.new_window(url="http://example.com", focus=focus) + + @request.addfinalizer + def _close_window(): + browser.close_window(handle) + + assert handle + + if focus: + assert handle == browser.current_window_handle + + @request.addfinalizer + def _back_to_main(): + browser.switch_to_window(main_handle) + + else: + assert handle != browser.current_window_handle + + +def test_switch_to_window(browser, request): + # main window handle + main_handle = browser.current_window_handle + + # open new window + handle = browser.new_window(url="http://example.com") + + @request.addfinalizer + def _close_window(): + browser.close_window(handle) + + # switch to new window + browser.switch_to_window(handle) + + @request.addfinalizer + def _back_to_main(): + browser.switch_to_window(main_handle) + + assert handle == browser.current_window_handle + assert main_handle != browser.current_window_handle From 4dacab467c95b4d7e90be84a0279bf095bca66e9 Mon Sep 17 00:00:00 2001 From: Nikhil Dhandre Date: Mon, 21 Oct 2019 18:47:53 +0530 Subject: [PATCH 4/4] seperate test for each method --- testing/test_browser.py | 69 +++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/testing/test_browser.py b/testing/test_browser.py index bf3cc8e6..31fa8d64 100644 --- a/testing/test_browser.py +++ b/testing/test_browser.py @@ -8,6 +8,18 @@ from widgetastic.widget import View, Text +@pytest.fixture() +def current_and_new_handle(request, browser, test_server): + """fixture return current and newly open window handle""" + handle = browser.new_window(url=test_server.url) + + @request.addfinalizer + def _close_window(): + if handle in browser.window_handles: + browser.close_window(handle) + return browser.current_window_handle, handle + + def test_is_displayed(browser): assert browser.is_displayed('#hello') @@ -220,30 +232,24 @@ def test_size(browser): assert height == 69 -def test_current_window_handle(browser): +def test_title(browser): + """Test title of current window""" assert browser.title == "Test page" - assert browser.current_window_handle -def test_window_handles(request, browser): - assert len(browser.window_handles) == 1 - handle = browser.new_window(url="http://example.com") - - @request.addfinalizer - def _close_window(): - browser.close_window(handle) - - assert len(browser.window_handles) == 2 - assert set(browser.window_handles) == {browser.current_window_handle, handle} +def test_current_window_handle(browser): + """Test current window handle property""" + assert browser.current_window_handle @pytest.mark.parametrize("focus", [False, True], ids=["no_focus", "focus"]) -def test_new_window(request, browser, focus): +def test_new_window(request, browser, focus, test_server): + """Test open new window with and without focus""" # main window handle main_handle = browser.current_window_handle # open new window focus/no-focus - handle = browser.new_window(url="http://example.com", focus=focus) + handle = browser.new_window(url=test_server.url, focus=focus) @request.addfinalizer def _close_window(): @@ -257,28 +263,31 @@ def _close_window(): @request.addfinalizer def _back_to_main(): browser.switch_to_window(main_handle) - else: assert handle != browser.current_window_handle -def test_switch_to_window(browser, request): - # main window handle - main_handle = browser.current_window_handle +def test_window_handles(browser, current_and_new_handle): + """Test window handles property""" + assert len(browser.window_handles) == 2 + assert set(browser.window_handles) == set(current_and_new_handle) - # open new window - handle = browser.new_window(url="http://example.com") - @request.addfinalizer - def _close_window(): - browser.close_window(handle) +def test_close_window(browser, current_and_new_handle): + """Test close window""" + main_handle, new_handle = current_and_new_handle - # switch to new window - browser.switch_to_window(handle) + assert new_handle in browser.window_handles + browser.close_window(new_handle) + assert new_handle not in browser.window_handles - @request.addfinalizer - def _back_to_main(): - browser.switch_to_window(main_handle) - assert handle == browser.current_window_handle - assert main_handle != browser.current_window_handle +def test_switch_to_window(browser, current_and_new_handle): + """Test switch to other window""" + main_handle, new_handle = current_and_new_handle + + # switch to new window + browser.switch_to_window(new_handle) + assert new_handle == browser.current_window_handle + browser.switch_to_window(main_handle) + assert main_handle == browser.current_window_handle