
Fix dashboards test (regression: 98bedc5de31e1c236f81fb73718aeb59c0b93595). Fix ldap menu items test (incorrect list of panels). Refactor tests to deal with dropdown menus properly (added base class for dropdown menus). Fix single quotes to double for consistency. Change-Id: Ife07ae892564b1056d47a117c29d07b9183b2ed2
193 lines
5.9 KiB
Python
193 lines
5.9 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import contextlib
|
|
|
|
from proboscis import asserts
|
|
import selenium.common.exceptions as Exceptions
|
|
from selenium.webdriver.remote import webelement
|
|
import selenium.webdriver.support.ui as Support
|
|
|
|
|
|
class BaseWebObject(object):
|
|
def __init__(self, driver, timeout=5):
|
|
self.driver = driver
|
|
self.timeout = timeout
|
|
|
|
def _turn_off_implicit_wait(self):
|
|
self.driver.implicitly_wait(0)
|
|
|
|
def _turn_on_implicit_wait(self):
|
|
self.driver.implicitly_wait(self.timeout)
|
|
|
|
@contextlib.contextmanager
|
|
def waits_disabled(self):
|
|
try:
|
|
self._turn_off_implicit_wait()
|
|
yield
|
|
finally:
|
|
self._turn_on_implicit_wait()
|
|
|
|
def _is_element_present(self, *locator):
|
|
with self.waits_disabled():
|
|
try:
|
|
self._get_element(*locator)
|
|
return True
|
|
except Exceptions.NoSuchElementException:
|
|
return False
|
|
|
|
def _is_element_visible(self, *locator):
|
|
try:
|
|
return self._get_element(*locator).is_displayed()
|
|
except (Exceptions.NoSuchElementException,
|
|
Exceptions.ElementNotVisibleException):
|
|
return False
|
|
|
|
def _is_element_displayed(self, element):
|
|
if element is None:
|
|
return False
|
|
try:
|
|
if isinstance(element, webelement.WebElement):
|
|
return element.is_displayed()
|
|
else:
|
|
return element.src_elem.is_displayed()
|
|
except (Exceptions.ElementNotVisibleException,
|
|
Exceptions.StaleElementReferenceException):
|
|
return False
|
|
|
|
def _is_text_visible(self, element, text, strict=True):
|
|
if not hasattr(element, 'text'):
|
|
return False
|
|
if strict:
|
|
return element.text == text
|
|
else:
|
|
return text in element.text
|
|
|
|
def _get_element(self, *locator):
|
|
return self.driver.find_element(*locator)
|
|
|
|
def _get_elements(self, *locator):
|
|
return self.driver.find_elements(*locator)
|
|
|
|
def _fill_field_element(self, data, field_element):
|
|
field_element.clear()
|
|
field_element.send_keys(data)
|
|
return field_element
|
|
|
|
def _select_dropdown(self, value, element):
|
|
select = Support.Select(element)
|
|
select.select_by_visible_text(value)
|
|
|
|
def _select_dropdown_by_value(self, value, element):
|
|
select = Support.Select(element)
|
|
select.select_by_value(value)
|
|
|
|
def _get_dropdown_options(self, element):
|
|
select = Support.Select(element)
|
|
return select.options
|
|
|
|
|
|
class PageObject(BaseWebObject):
|
|
"""Base class for page objects."""
|
|
|
|
PARTIAL_LOGIN_URL = 'login'
|
|
|
|
def __init__(self, driver):
|
|
"""Constructor."""
|
|
super(PageObject, self).__init__(driver)
|
|
self._page_title = None
|
|
|
|
@property
|
|
def page_title(self):
|
|
return self.driver.title
|
|
|
|
def is_the_current_page(self, do_assert=False):
|
|
found_expected_title = self.page_title.startswith(self._page_title)
|
|
if do_assert:
|
|
asserts.assert_true(
|
|
found_expected_title,
|
|
"Expected to find %s in page title, instead found: %s"
|
|
% (self._page_title, self.page_title))
|
|
return found_expected_title
|
|
|
|
def get_current_page_url(self):
|
|
return self.driver.current_url
|
|
|
|
def close_window(self):
|
|
return self.driver.close()
|
|
|
|
def is_nth_window_opened(self, n):
|
|
return len(self.driver.window_handles) == n
|
|
|
|
def switch_window(self, name=None, index=None):
|
|
"""Switches focus between the webdriver windows.
|
|
Args:
|
|
- name: The name of the window to switch to.
|
|
- index: The index of the window handle to switch to.
|
|
If the method is called without arguments it switches to the
|
|
last window in the driver window_handles list.
|
|
In case only one window exists nothing effectively happens.
|
|
Usage:
|
|
page.switch_window(name='_new')
|
|
page.switch_window(index=2)
|
|
page.switch_window()
|
|
"""
|
|
|
|
if name is not None and index is not None:
|
|
raise ValueError("switch_window receives the window's name or "
|
|
"the window's index, not both.")
|
|
if name is not None:
|
|
self.driver.switch_to.window(name)
|
|
elif index is not None:
|
|
self.driver.switch_to.window(
|
|
self.driver.window_handles[index])
|
|
else:
|
|
self.driver.switch_to.window(self.driver.window_handles[-1])
|
|
|
|
def go_to_previous_page(self):
|
|
self.driver.back()
|
|
|
|
def go_to_next_page(self):
|
|
self.driver.forward()
|
|
|
|
def refresh_page(self):
|
|
self.driver.refresh()
|
|
|
|
|
|
class DropDownMenu(BaseWebObject):
|
|
|
|
_default_src_locator = None
|
|
|
|
_options_list_locator = None
|
|
|
|
_items_locator = None
|
|
|
|
def __init__(self, driver):
|
|
super(DropDownMenu, self).__init__(driver)
|
|
self.src_elem = self._get_element(*self._default_src_locator)
|
|
|
|
def is_opened(self):
|
|
return self._is_element_present(*self._options_list_locator)
|
|
|
|
def open(self):
|
|
if not self.is_opened():
|
|
self.src_elem.click()
|
|
|
|
@property
|
|
def options(self):
|
|
self.open()
|
|
return self._get_element(*self._options_list_locator)
|
|
|
|
@property
|
|
def items(self):
|
|
return self.options.find_elements(*self._items_locator)
|