Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
-----
Expand Down
14 changes: 12 additions & 2 deletions src/Selenium2Library/locators/windowmanager.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from selenium.common.exceptions import NoSuchWindowException
from selenium.common.exceptions import WebDriverException


class WindowManager(object):
Expand Down Expand Up @@ -139,8 +140,17 @@ 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 ];")
try:
id_, name = browser.execute_script("return [ window.id, window.name ];")
except WebDriverException:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately this is the exception type raised, it would be nice if it was something more specific.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's alright. At least it indicates that some sort of selenium error did happen and it is, in this case, OK to suppress the error.

# 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

id_ = id_ if id_ is not None else 'undefined'
name, title, url = (
att if att else 'undefined' for att in (name, title, url)
Expand Down
45 changes: 32 additions & 13 deletions test/unit/keywords/test_windowmananger_window_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,23 @@
from mockito import mock, when, unstub

from Selenium2Library.locators import WindowManager
from selenium.common.exceptions import WebDriverException

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'))
Expand All @@ -24,7 +28,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(
Expand All @@ -35,7 +39,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(
Expand All @@ -46,11 +50,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()
Expand All @@ -59,7 +63,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)
Expand All @@ -68,23 +72,38 @@ 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()

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()

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()
4 changes: 3 additions & 1 deletion test/unit/locators/test_windowmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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