Fix grafana UI tests

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
This commit is contained in:
Rodion Promyshlennikov 2016-09-16 11:31:55 +03:00
parent 038cfb9cd8
commit bdb8c236a8
3 changed files with 94 additions and 63 deletions

View File

@ -161,3 +161,32 @@ class PageObject(BaseWebObject):
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)

View File

@ -14,19 +14,26 @@
from fuelweb_test import logger
from proboscis import asserts
from stacklight_tests.helpers.ui_tester import ui_driver
from stacklight_tests.helpers import ui_tester
from stacklight_tests.influxdb_grafana.grafana_ui import pages
def check_grafana_dashboards(grafana_url):
login_key_xpath = '//form[1]//button[1]'
login_key_xpath = '/html/body/div/div[2]/div/div/div[2]/form/div[2]/button'
with ui_driver(grafana_url, "Grafana", login_key_xpath) as driver:
login_page = pages.LoginPage(driver)
login_page.is_login_page()
home_page = login_page.login("grafana", "grafanapass")
home_page.is_main_page()
def _get_main_page(driver, auth_data):
login_page = pages.LoginPage(driver)
login_page.is_login_page()
home_page = login_page.login(*auth_data)
home_page.is_main_page()
return home_page
def check_grafana_dashboards(url):
with ui_tester.ui_driver(url, "Grafana", login_key_xpath) as driver:
user = ("grafana", "grafanapass")
home_page = _get_main_page(driver, user)
dashboard_names = {
"Apache", "Cinder", "Elasticsearch", "Glance", "HAProxy", "Heat",
"Hypervisor", "InfluxDB", "Keystone", "LMA self-monitoring",
@ -35,7 +42,8 @@ def check_grafana_dashboards(grafana_url):
dashboard_names = {
panel_name.lower() for panel_name in dashboard_names}
available_dashboards_names = {
dashboard.text.lower() for dashboard in home_page.dashboards}
dashboard.text.lower()
for dashboard in home_page.dashboard_menu.items}
msg = ("There is not enough panels in available panels, "
"panels that are not presented: {}")
# NOTE(rpromyshlennikov): should there be 'elasticsearch'
@ -48,29 +56,25 @@ def check_grafana_dashboards(grafana_url):
dashboard_page.get_back_to_home()
def check_grafana_ldap(grafana_url, authz=False, uadmin=("uadmin", "uadmin"),
uviewer=("uviewer", "uviewer")):
_check_available_menu_items_for_user(uadmin, grafana_url, authz)
_check_available_menu_items_for_user(uviewer, grafana_url, authz)
def _check_available_menu_items_for_user(user, url, authz):
logger.info("Checking Grafana service at {} with LDAP authorization "
"for {} user".format(url, user[0]))
login_key_xpath = '//form[1]//button[1]'
admin_panels = ["Dashboards", "Data Sources", "Plugins"]
viewer_panel = list(admin_panels[1]) if authz else admin_panels
admin_panels = ["Dashboards", "Data Sources", "Plugins", "Admin"]
viewer_panel = admin_panels[:1] if authz else admin_panels
with ui_driver(url, "Grafana", login_key_xpath) as driver:
login_page = pages.LoginPage(driver)
login_page.is_login_page()
home_page = login_page.login(*user)
home_page.is_main_page()
menu_items = [name.text for name in home_page.main_menu_items]
with ui_tester.ui_driver(url, "Grafana", login_key_xpath) as driver:
home_page = _get_main_page(driver, user)
menu_items = [name.text for name in home_page.main_menu.items]
msg = "Not all required panels are available in main menu."
asserts.assert_true(
(admin_panels if ("uadmin" in user)
else viewer_panel) == menu_items,
msg
)
def check_grafana_ldap(grafana_url, authz=False,
uadmin=("uadmin", "uadmin"),
uviewer=("uviewer", "uviewer")):
_check_available_menu_items_for_user(uadmin, grafana_url, authz)
_check_available_menu_items_for_user(uviewer, grafana_url, authz)

View File

@ -25,22 +25,38 @@ class DashboardPage(base_pages.PageObject):
class MainPage(base_pages.PageObject):
_dropdown_menu_locator = (
_main_menu_locator = (
by.By.CLASS_NAME,
'navbar-brand-btn')
_dashboards_list_locator = (
by.By.CLASS_NAME,
'sidemenu'
"navbar-brand-btn"
)
_dashboard_locator = (by.By.CLASS_NAME,
"search-item-dash-db")
class MainDropDownMenu(base_pages.DropDownMenu):
_default_src_locator = (
by.By.CLASS_NAME,
"navbar-brand-btn"
)
_options_list_locator = (
by.By.CLASS_NAME,
"sidemenu"
)
_items_locator = (
by.By.CLASS_NAME,
"dropdown"
)
_dashboard_main_locator = (
by.By.CLASS_NAME,
"dropdown"
)
class DashboardDropDownMenu(base_pages.DropDownMenu):
_default_src_locator = (
by.By.CLASS_NAME,
"icon-gf-dashboard"
)
_options_list_locator = (
by.By.CLASS_NAME,
"search-results-container"
)
_items_locator = (
by.By.CLASS_NAME,
"search-item-dash-db"
)
def __init__(self, driver):
super(MainPage, self).__init__(driver)
@ -48,37 +64,19 @@ class MainPage(base_pages.PageObject):
def is_main_page(self):
return (self.is_the_current_page() and
self._is_element_visible(*self._dropdown_menu_locator))
self._is_element_visible(*self._main_menu_locator))
@property
def dropdown_menu(self):
return self._get_element(*self._dropdown_menu_locator)
def main_menu(self):
return self.MainDropDownMenu(self.driver)
@property
def dashboards_list(self):
self.open_dropdown_menu()
return self._get_element(*self._dashboards_list_locator)
@property
def main_menu_items(self):
return self.dashboards_list.find_elements(
*self._dashboard_main_locator
)
@property
def dashboards(self):
return self.dashboards_list.find_elements(*self._dashboard_locator)
def is_dropdown_menu_opened(self):
return self._is_element_present(*self._dashboards_list_locator)
def open_dropdown_menu(self):
if not self.is_dropdown_menu_opened():
self.dropdown_menu.click()
def dashboard_menu(self):
return self.DashboardDropDownMenu(self.driver)
def open_dashboard(self, dashboard_name):
dashboards_mapping = {dashboard.text.lower(): dashboard
for dashboard in self.dashboards}
for dashboard in self.dashboard_menu.items}
dashboards_mapping[dashboard_name.lower()].click()
dashboard_page = DashboardPage(self.driver, dashboard_name)
dashboard_page.is_dashboards_page()
@ -86,8 +84,8 @@ class MainPage(base_pages.PageObject):
class LoginPage(base_pages.PageObject):
_login_username_field_locator = (by.By.NAME, 'username')
_login_password_field_locator = (by.By.NAME, 'password')
_login_username_field_locator = (by.By.NAME, "username")
_login_password_field_locator = (by.By.NAME, "password")
_login_submit_button_locator = (by.By.CLASS_NAME, "btn")
def __init__(self, driver):