From d3182ae2b8a4ee4a22c5e54a780f6d173cbe834c Mon Sep 17 00:00:00 2001 From: David Shepherd Date: Fri, 31 Mar 2017 14:58:00 +0100 Subject: [PATCH 1/2] Use webdriver API to get browser title and current_url --- .../locators/windowmanager.py | 7 +++-- .../test_windowmananger_window_info.py | 30 +++++++++++-------- test/unit/locators/test_windowmanager.py | 4 ++- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Selenium2Library/locators/windowmanager.py b/src/Selenium2Library/locators/windowmanager.py index cbccfdf02..31b365378 100644 --- a/src/Selenium2Library/locators/windowmanager.py +++ b/src/Selenium2Library/locators/windowmanager.py @@ -1,4 +1,5 @@ from selenium.common.exceptions import NoSuchWindowException +from selenium.common.exceptions import WebDriverException class WindowManager(object): @@ -139,8 +140,10 @@ def _select_matching(self, browser, matcher, error): raise ValueError(error) def _get_current_window_info(self, browser): - id_, name, title, url = browser.execute_script( - "return [ window.id, window.name, document.title, document.URL ];") + id_, name = browser.execute_script("return [ window.id, window.name ];") + title = browser.title + url = browser.current_url + id_ = id_ if id_ is not None else 'undefined' name, title, url = ( att if att else 'undefined' for att in (name, title, url) diff --git a/test/unit/keywords/test_windowmananger_window_info.py b/test/unit/keywords/test_windowmananger_window_info.py index 6b286162f..25b5e6439 100644 --- a/test/unit/keywords/test_windowmananger_window_info.py +++ b/test/unit/keywords/test_windowmananger_window_info.py @@ -4,18 +4,21 @@ from Selenium2Library.locators import WindowManager -SCRIPT = "return [ window.id, window.name, document.title, document.URL ];" +SCRIPT = "return [ window.id, window.name ];" HANDLE = "17c3dc18-0443-478b-aec6-ed7e2a5da7e1" class GetCurrentWindowInfoTest(unittest.TestCase): + def mock_window_info(self, driver, id_, name, title, url): + when(driver).execute_script(SCRIPT).thenReturn([id_, name]) + driver.title = title + driver.current_url = url + def test_window_info_values_are_strings(self): manager = WindowManager() driver = mock() - when(driver).execute_script(SCRIPT).thenReturn( - ['id', 'name', 'title', 'url'] - ) + self.mock_window_info(driver, 'id', 'name', 'title', 'url') driver.current_window_handle = HANDLE info = manager._get_current_window_info(driver) self.assertEqual(info, (HANDLE, 'id', 'name', 'title', 'url')) @@ -24,7 +27,7 @@ def test_window_info_values_are_strings(self): def test_window_info_values_are_none(self): manager = WindowManager() driver = mock() - when(driver).execute_script(SCRIPT).thenReturn([None] * 4) + self.mock_window_info(driver, None, None, None, None) driver.current_window_handle = HANDLE info = manager._get_current_window_info(driver) self.assertEqual( @@ -35,7 +38,7 @@ def test_window_info_values_are_none(self): def test_window_info_values_are_empty_strings(self): manager = WindowManager() driver = mock() - when(driver).execute_script(SCRIPT).thenReturn([''] * 4) + self.mock_window_info(driver, '', '', '', '') driver.current_window_handle = HANDLE info = manager._get_current_window_info(driver) self.assertEqual( @@ -46,11 +49,11 @@ def test_window_info_values_are_empty_strings(self): def test_window_id_is_bool(self): manager = WindowManager() driver = mock() - when(driver).execute_script(SCRIPT).thenReturn( - [True, '', '', '']).thenReturn([False, '', '', '']) + self.mock_window_info(driver, True, '', '', '') driver.current_window_handle = HANDLE info = manager._get_current_window_info(driver) self.assertEqual(info[1], True) + self.mock_window_info(driver, False, '', '', '') info = manager._get_current_window_info(driver) self.assertEqual(info[1], False) unstub() @@ -59,7 +62,7 @@ def test_window_id_is_web_element(self): manager = WindowManager() driver = mock() elem = mock() - when(driver).execute_script(SCRIPT).thenReturn([elem, '', '', '']) + self.mock_window_info(driver, *[elem, '', '', '']) driver.current_window_handle = HANDLE info = manager._get_current_window_info(driver) self.assertEqual(info[1], elem) @@ -68,11 +71,12 @@ def test_window_id_is_web_element(self): def test_window_id_is_container(self): manager = WindowManager() driver = mock() - when(driver).execute_script(SCRIPT).thenReturn( - [['1'], '', '', '']).thenReturn([{'a': 2}, '', '', '']) + self.mock_window_info(driver, *[['1'], '', '', '']) driver.current_window_handle = HANDLE info = manager._get_current_window_info(driver) self.assertEqual(info[1], ['1']) + + self.mock_window_info(driver, *[{'a': 2}, '', '', '']) info = manager._get_current_window_info(driver) self.assertEqual(info[1], {'a': 2}) unstub() @@ -80,11 +84,11 @@ def test_window_id_is_container(self): def test_window_id_is_empty_container(self): manager = WindowManager() driver = mock() - when(driver).execute_script(SCRIPT).thenReturn( - [[], '', '', '']).thenReturn([{}, '', '', '']) + self.mock_window_info(driver, *[[], '', '', '']) driver.current_window_handle = HANDLE info = manager._get_current_window_info(driver) self.assertEqual(info[1], []) + self.mock_window_info(driver, *[{}, '', '', '']) info = manager._get_current_window_info(driver) self.assertEqual(info[1], {}) unstub() diff --git a/test/unit/locators/test_windowmanager.py b/test/unit/locators/test_windowmanager.py index 3ee392efa..bf46ab0fe 100644 --- a/test/unit/locators/test_windowmanager.py +++ b/test/unit/locators/test_windowmanager.py @@ -333,11 +333,13 @@ def switch_to_window(handle_): browser.session_id = handle_ current_window.name = window_infos[handle_][1] browser.current_window = current_window + browser.title = window_infos[handle_][2] + browser.current_url = window_infos[handle_][3] browser.switch_to_window = switch_to_window def execute_script(script): handle_ = browser.session_id if handle_ in browser.window_handles: - return window_infos[handle_] + return window_infos[handle_][:2] browser.execute_script = execute_script return browser From 10e4c97e290c85461bdd46d0bf3b76272fb7a9de Mon Sep 17 00:00:00 2001 From: David Shepherd Date: Fri, 31 Mar 2017 15:26:38 +0100 Subject: [PATCH 2/2] Support window selection for WebDrivers that don't have Javascript --- CHANGES.rst | 2 ++ src/Selenium2Library/locators/windowmanager.py | 9 ++++++++- .../keywords/test_windowmananger_window_info.py | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index dfa643dff..536d0b9e7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,8 @@ Release Notes 1.8.1 ----- - Added 'Get Locations' keyword [thaffenden] +- Fix getting window information and switching windows on browsers that do not + support javascript 1.8.0 ----- diff --git a/src/Selenium2Library/locators/windowmanager.py b/src/Selenium2Library/locators/windowmanager.py index 31b365378..543537c64 100644 --- a/src/Selenium2Library/locators/windowmanager.py +++ b/src/Selenium2Library/locators/windowmanager.py @@ -140,7 +140,14 @@ def _select_matching(self, browser, matcher, error): raise ValueError(error) def _get_current_window_info(self, browser): - id_, name = browser.execute_script("return [ window.id, window.name ];") + try: + id_, name = browser.execute_script("return [ window.id, window.name ];") + except WebDriverException: + # The webdriver implementation doesn't support Javascript so we + # can't get window id or name this way. + id_ = None + name = '' + title = browser.title url = browser.current_url diff --git a/test/unit/keywords/test_windowmananger_window_info.py b/test/unit/keywords/test_windowmananger_window_info.py index 25b5e6439..6245824fe 100644 --- a/test/unit/keywords/test_windowmananger_window_info.py +++ b/test/unit/keywords/test_windowmananger_window_info.py @@ -3,6 +3,7 @@ from mockito import mock, when, unstub from Selenium2Library.locators import WindowManager +from selenium.common.exceptions import WebDriverException SCRIPT = "return [ window.id, window.name ];" HANDLE = "17c3dc18-0443-478b-aec6-ed7e2a5da7e1" @@ -92,3 +93,17 @@ def test_window_id_is_empty_container(self): info = manager._get_current_window_info(driver) self.assertEqual(info[1], {}) unstub() + + def test_no_javascript_support(self): + manager = WindowManager() + driver = mock() + elem = mock() + when(driver).execute_script(SCRIPT).thenRaise(WebDriverException) + driver.title = 'title' + driver.current_url = 'url' + driver.current_window_handle = HANDLE + info = manager._get_current_window_info(driver) + self.assertEqual( + info, (HANDLE, 'undefined', 'undefined', 'title', 'url') + ) + unstub()