diff --git a/stacklight_tests/helpers/ui/base_pages.py b/stacklight_tests/helpers/ui/base_pages.py index 3db56ad..24edb1a 100644 --- a/stacklight_tests/helpers/ui/base_pages.py +++ b/stacklight_tests/helpers/ui/base_pages.py @@ -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) diff --git a/stacklight_tests/influxdb_grafana/grafana_ui/api.py b/stacklight_tests/influxdb_grafana/grafana_ui/api.py index 31297c6..8741b80 100644 --- a/stacklight_tests/influxdb_grafana/grafana_ui/api.py +++ b/stacklight_tests/influxdb_grafana/grafana_ui/api.py @@ -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) diff --git a/stacklight_tests/influxdb_grafana/grafana_ui/pages.py b/stacklight_tests/influxdb_grafana/grafana_ui/pages.py index 0f368ca..8255bef 100644 --- a/stacklight_tests/influxdb_grafana/grafana_ui/pages.py +++ b/stacklight_tests/influxdb_grafana/grafana_ui/pages.py @@ -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):