Robot Framework SeleniumLibrary
windowmanager.py
Go to the documentation of this file.
1 # Copyright 2008-2011 Nokia Networks
2 # Copyright 2011-2016 Ryan Tomac, Ed Manlove and contributors
3 # Copyright 2016- Robot Framework Foundation
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 
17 import time
18 from collections import namedtuple
19 
20 from selenium.common.exceptions import (NoSuchWindowException,
21  WebDriverException)
22 
23 from SeleniumLibrary.base import ContextAware
24 from SeleniumLibrary.errors import WindowNotFound
25 from SeleniumLibrary.utils import is_string
26 
27 
28 WindowInfo = namedtuple('WindowInfo', 'handle, id, name, title, url')
29 
30 
32 
33  def __init__(self, ctx):
34  ContextAware.__init__(self, ctx)
35  self._strategies_strategies = {
36  'title': self._select_by_title_select_by_title,
37  'name': self._select_by_name_select_by_name,
38  'url': self._select_by_url_select_by_url,
39  'default': self._select_by_default_select_by_default
40  }
41 
42  def get_window_infos(self):
43  infos = []
44  try:
45  starting_handle = self.driverdriverdriver.current_window_handle
46  except NoSuchWindowException:
47  starting_handle = None
48  try:
49  for handle in self.driverdriverdriver.window_handles:
50  self.driverdriverdriver.switch_to.window(handle)
51  infos.append(self._get_current_window_info_get_current_window_info())
52  finally:
53  if starting_handle:
54  self.driverdriverdriver.switch_to.window(starting_handle)
55  return infos
56 
57  def select(self, locator, timeout=0):
58  while True:
59  try:
60  return self._select_select(locator)
61  except WindowNotFound:
62  if time.time() > timeout:
63  raise
64  time.sleep(0.1)
65 
66  def _select(self, locator):
67  if not is_string(locator):
68  self._select_by_excludes_select_by_excludes(locator)
69  elif locator.upper() == 'CURRENT':
70  pass
71  elif locator.upper() == 'MAIN':
72  self._select_main_window_select_main_window()
73  elif locator.upper() == 'NEW':
74  self._select_by_last_index_select_by_last_index()
75  else:
76  strategy, locator = self._parse_locator_parse_locator(locator)
77  self._strategies_strategies[strategy](locator)
78 
79  def _parse_locator(self, locator):
80  index = self._get_locator_separator_index_get_locator_separator_index(locator)
81  if index != -1:
82  prefix = locator[:index].strip()
83  if prefix in self._strategies_strategies:
84  return prefix, locator[index + 1:].lstrip()
85  return 'default', locator
86 
87  def _get_locator_separator_index(self, locator):
88  if '=' not in locator:
89  return locator.find(':')
90  if ':' not in locator:
91  return locator.find('=')
92  return min(locator.find('='), locator.find(':'))
93 
94  def _select_by_title(self, title):
95  self._select_matching_select_matching(
96  lambda window_info: window_info.title == title,
97  "Unable to locate window with title '%s'." % title
98  )
99 
100  def _select_by_name(self, name):
101  self._select_matching_select_matching(
102  lambda window_info: window_info.name == name,
103  "Unable to locate window with name '%s'." % name
104  )
105 
106  def _select_by_url(self, url):
107  self._select_matching_select_matching(
108  lambda window_info: window_info.url == url,
109  "Unable to locate window with URL '%s'." % url
110  )
111 
113  handles = self.driverdriverdriver.window_handles
114  self.driverdriverdriver.switch_to.window(handles[0])
115 
116  def _select_by_default(self, criteria):
117  try:
118  starting_handle = self.driverdriverdriver.current_window_handle
119  except NoSuchWindowException:
120  starting_handle = None
121  for handle in self.driverdriverdriver.window_handles:
122  self.driverdriverdriver.switch_to.window(handle)
123  if criteria == handle:
124  return
125  for item in self._get_current_window_info_get_current_window_info()[2:4]:
126  if item == criteria:
127  return
128  if starting_handle:
129  self.driverdriverdriver.switch_to.window(starting_handle)
130  raise WindowNotFound("No window matching handle, name, title or URL "
131  "'%s' found." % criteria)
132 
134  handles = self.driverdriverdriver.window_handles
135  if handles[-1] == self.driverdriverdriver.current_window_handle:
136  raise WindowNotFound('Window with last index is same as '
137  'the current window.')
138  self.driverdriverdriver.switch_to.window(handles[-1])
139 
140  def _select_by_excludes(self, excludes):
141  for handle in self.driverdriverdriver.window_handles:
142  if handle not in excludes:
143  self.driverdriverdriver.switch_to.window(handle)
144  return
145  raise WindowNotFound('No window not matching excludes %s found.'
146  % excludes)
147 
148  def _select_matching(self, matcher, error):
149  try:
150  starting_handle = self.driverdriverdriver.current_window_handle
151  except NoSuchWindowException:
152  starting_handle = None
153  for handle in self.driverdriverdriver.window_handles:
154  self.driverdriverdriver.switch_to.window(handle)
155  if matcher(self._get_current_window_info_get_current_window_info()):
156  return
157  if starting_handle:
158  self.driverdriverdriver.switch_to.window(starting_handle)
159  raise WindowNotFound(error)
160 
162  try:
163  id, name = self.driverdriverdriver.execute_script(
164  "return [ window.id, window.name ];")
165  except WebDriverException:
166  # The webdriver implementation doesn't support Javascript so we
167  # can't get window id or name this way.
168  id = name = None
169  return WindowInfo(self.driverdriverdriver.current_window_handle,
170  id if id is not None else 'undefined',
171  name or 'undefined',
172  self.driverdriverdriver.title or 'undefined',
173  self.driverdriverdriver.current_url or 'undefined')
def __init__(self, ctx)
Base class exposing attributes from the common context.