e-nms_qa_automation.1/pages/users_tab.py

433 lines
22 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from pages.base_page import BasePage
from Locators.base_page import BasePageLocators
from Locators.configuration_page import ConfigurationPageLocators
from Locators.users_tab import UsersTabLocators
from data.assertions import Assertions
from playwright.sync_api import Page
import re
class UsersTab(BasePage):
def __init__(self, page: Page) -> None:
super().__init__(page)
self.assertion = Assertions(page)
self.role_dict = {"administrator": "Администратор",
"manager":"Контактное лицо",
"operator":"Оператор",
"inform_secur_user" : "Специалист информационной безопасности"}
def add_new_user(self, user_data):
fields = user_data.keys()
self.assertion.check_presence(UsersTabLocators.USER_DATA_INPUT_FORM, \
"Input form for add new user is not present")
## input user name
if "name" in fields:
loc = "xpath=div[2]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["name"])
## input user role
if "role" in fields:
loc = "xpath=div[3]/div[2]/div/div/div/div/div[1]"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).click()
self.assertion.check_presence(UsersTabLocators.USER_DATA_INPUT_FORM_ROLES_MENU, \
"Roles drop-down menu is not present")
role = user_data["role"]
self.assertion.check_menu_item_with_text(role, f"No menu item with text: {role}")
self.page.get_by_role("listitem").filter(has_text=role).click()
## input password
if "password" in fields:
loc = "xpath=div[4]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["password"])
## input commentary
if "commentary" in fields:
loc = "xpath=div[5]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["commentary"])
## input e-mail
if "email" in fields:
loc = "xpath=div[6]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["email"])
## input phone number for sms
if "phone_number" in fields:
loc = "xpath=div[7]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["phone_number"])
##to be done: checkbox
## click add user button
add_button_text = "Добавить"
self.assertion.check_button_presence_with_text(add_button_text, f"Add user input form button with text {add_button_text} is not present")
self.page.get_by_role("button", name=add_button_text).click()
##check add user confirmation dialog
confirm_add_button_text = " Добавить "
self.assertion.check_confirmation_dialog_with_title(UsersTabLocators.USER_ACTION_CONFIRMATION_DIALOG, "Добавить нового пользователя")
self.page.get_by_role("button", name=confirm_add_button_text).first.click()
## check message about successfull user addition
self.assertion.check_alert_window_with_text("success", ' Новый пользователь \n успешно добавлен! ')
def close_user_window_by_toolbar_button(self, window_title):
BUTTON_CLOSE_ON_TOOLBAR = f"xpath=(.//*[normalize-space(text()) and normalize-space(.)='{window_title}'])[1]/following::*[name()='svg'][1]"
self.assertion.check_presence(BUTTON_CLOSE_ON_TOOLBAR, \
"Close button is not presenet on toolbar")
self.click(BUTTON_CLOSE_ON_TOOLBAR)
self.assertion.check_absence(UsersTabLocators.USER_DATA_WORK_AREA_TITLE, \
f"{window_title} window should be closed")
def close_user_window(self, window_title):
close_button_text = "Закрыть"
self.assertion.check_button_presence_with_text(close_button_text, f"Edit user input form button with text {close_button_text} is not present")
self.page.get_by_role("button", name=close_button_text).click()
self.assertion.check_absence(UsersTabLocators.USER_DATA_WORK_AREA_TITLE, \
f"{window_title} window should be closed")
def delete_user(self):
remove_button_text = "Удалить"
self.assertion.check_button_presence_with_text(remove_button_text, f"Edit user input form button with text {remove_button_text} is not present")
self.page.get_by_role("button", name=remove_button_text).click()
##check add user confirmation dialog
confirm_remove_button_text = " Удалить "
self.assertion.check_confirmation_dialog_with_title(UsersTabLocators.USER_ACTION_CONFIRMATION_DIALOG, "Удаление")
self.page.get_by_role("button", name=confirm_remove_button_text).first.click()
## check message about successfull user deletion
self.assertion.check_alert_window_with_text("success", '\nПользователь удалён\n')
def edit_user(self, user_data):
fields = user_data.keys()
self.assertion.check_presence(UsersTabLocators.USER_DATA_INPUT_FORM, \
"Input form for edit user is not present")
## input user name
if "name" in fields:
loc = "xpath=div[2]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["name"])
## input user role
if "role" in fields:
loc = "xpath=div[3]/div[2]/div/div/div/div/div[1]"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).click()
self.assertion.check_presence(UsersTabLocators.USER_DATA_INPUT_FORM_ROLES_MENU, \
"Roles drop-down menu is not present")
role = user_data["role"]
self.assertion.check_menu_item_with_text(role, f"No menu item with text: {role}")
self.page.get_by_role("listitem").filter(has_text=role).click()
## input commentary
if "commentary" in fields:
loc = "xpath=div[5]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["commentary"])
## input e-mail
if "email" in fields:
loc = "xpath=div[5]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["email"])
## input phone number for sms
if "phone_number" in fields:
loc = "xpath=div[6]/div[2]/div/div/div/div/input"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).fill(user_data["phone_number"])
##to be done: checkbox
## click add user button
add_button_text = "Сохранить"
self.assertion.check_button_presence_with_text(add_button_text, f"Add user input form button with text {add_button_text} is not present")
self.page.get_by_role("button", name=add_button_text).click()
##check add user confirmation dialog
confirm_add_button_text = " Сохранить "
self.assertion.check_confirmation_dialog_with_title(UsersTabLocators.USER_ACTION_CONFIRMATION_DIALOG, "Сохранение")
self.page.get_by_role("button", name=confirm_add_button_text).first.click()
## check message about successfull user addition. Temporarily without translation
self.assertion.check_alert_window_with_text("success", '\nupdate success\n')
def open_add_user_page(self):
self.assertion.check_presence(UsersTabLocators.TOOLBAR_EDIT_BUTTON, \
"Edit button is not presenet on toolbar")
self.click(UsersTabLocators.TOOLBAR_EDIT_BUTTON)
self.assertion.check_presence(UsersTabLocators.TOOLBAR_ADD_USER_BUTTON, \
"Add User button is not presenet on toolbar")
self.click(UsersTabLocators.TOOLBAR_ADD_USER_BUTTON)
# check that new work area with title has been opened
self.assertion.have_title(UsersTabLocators.USER_DATA_WORK_AREA_TITLE, "Добавить нового пользователя", \
"Expected work area page title is not equal real title")
def open_edit_user_page_by_index(self, row_index):
## temporarily
tmp_dict = {"admin":"Администратор", "manager":"Контактное лицо", "operator":"Оператор"}
users_table = self.read_table_data(ConfigurationPageLocators.WORK_AREA_TABLE)
self.assertion.check_not_equals(len(users_table) - 1, 0, "Users table is empty")
# remove header
del users_table[0]
# check row_index
if row_index > len(users_table):
assert False, "Row_index is out of range"
# get user name and role
user_name = users_table[row_index][0]
for key, val in tmp_dict.items():
if user_name == val:
user_name = key
role = users_table[row_index][2]
# click to found table row
self.page.locator(ConfigurationPageLocators.WORK_AREA_TABLE).locator(BasePageLocators.TABLE_BODY).nth(row_index).click()
# check that edit user work area with user name title has been opened
self.assertion.have_title(UsersTabLocators.USER_DATA_WORK_AREA_TITLE, user_name, \
"Expected edit user work area page title is not equal real title")
return user_name, role
def reset_password(self):
new_password = ""
reset_password_button_text = "Сбросить пароль"
self.assertion.check_button_presence_with_text(reset_password_button_text, f"Edit user input form button with text {reset_password_button_text} is not present")
self.page.get_by_role("button", name=reset_password_button_text).click()
alert_message = self.get_text(BasePageLocators.ALERT_WINDOW_TEXT_SUCCESS, 0)
if len(alert_message) > 0:
new_password = re.findall(r'[\d]+', alert_message)[0]
return new_password
def open_edit_user_page_by_name(self, name, role):
row_index = self.find_user_in_table(name, role)
if row_index == -1:
assert False, f"User with name {name} and role {role} has not been found"
# click to found table row
self.page.locator(ConfigurationPageLocators.WORK_AREA_TABLE).locator(BasePageLocators.TABLE_BODY).nth(row_index).click()
# check that edit user work area with user name title has been opened
self.assertion.have_title(UsersTabLocators.USER_DATA_WORK_AREA_TITLE, name, \
"Expected edit user work area page title is not equal real title")
def should_be_users_work_area(self):
self.assertion.have_title(ConfigurationPageLocators.WORK_AREA_TITLE, "Пользователи", \
"Expected work area page title is not equal real title")
self.assertion.check_presence(UsersTabLocators.TOOLBAR_EDIT_BUTTON, \
"Edit button is not presenet on toolbar")
self.should_be_users_table()
def should_be_users_page_toolbar_buttons(self):
self.assertion.check_presence(UsersTabLocators.TOOLBAR_EDIT_BUTTON, \
"Edit button is not presenet on toolbar")
self.assertion.check_tooltip_with_text(UsersTabLocators.TOOLBAR_EDIT_BUTTON, "Редактировать")
self.click(UsersTabLocators.TOOLBAR_EDIT_BUTTON)
self.assertion.check_presence(UsersTabLocators.TOOLBAR_ADD_USER_BUTTON, \
"Add User button is not presenet on toolbar")
self.assertion.check_presence(UsersTabLocators.TOOLBAR_CLOSE_BUTTON, \
"Close button is not presenet on toolbar")
self.assertion.check_tooltip_with_text(UsersTabLocators.TOOLBAR_ADD_USER_BUTTON, "Добавить")
self.assertion.check_tooltip_with_text(UsersTabLocators.TOOLBAR_CLOSE_BUTTON, "Закрыть")
self.click(UsersTabLocators.TOOLBAR_CLOSE_BUTTON)
self.assertion.check_presence(UsersTabLocators.TOOLBAR_EDIT_BUTTON, \
"Edit button is not presenet on toolbar")
def should_be_add_user_work_area(self):
self.assertion.have_title(UsersTabLocators.USER_DATA_WORK_AREA_TITLE, "Добавить нового пользователя", \
"Expected add user window title is not equal real title")
self.assertion.check_presence(UsersTabLocators.ADD_USER_WORK_AREA_CLOSE_BUTTON, \
"Close button is not presenet on toolbar")
self.assertion.check_tooltip_with_text(UsersTabLocators.ADD_USER_WORK_AREA_CLOSE_BUTTON, "Закрыть")
# check input form
self.should_be_add_user_input_form()
# check input form buttons
add_button_text = "Добавить"
self.assertion.check_button_presence_with_text(add_button_text, f"Add user input form button with text {add_button_text} is not present")
close_button_text = "Закрыть"
self.assertion.check_button_presence_with_text(close_button_text, f"Add user input form button with text {close_button_text} is not present")
def should_be_edit_user_work_area(self, user_name, role):
EDIT_USER_WORK_AREA_CLOSE_BUTTON = f"xpath=(.//*[normalize-space(text()) and normalize-space(.)='{user_name}'])[1]/following::*[name()='svg'][1]"
self.assertion.have_title(UsersTabLocators.USER_DATA_WORK_AREA_TITLE, f"{user_name}", \
"Expected edit user window title is not equal real title")
self.assertion.check_presence(EDIT_USER_WORK_AREA_CLOSE_BUTTON, \
"Close button is not presenet on toolbar")
self.assertion.check_tooltip_with_text(EDIT_USER_WORK_AREA_CLOSE_BUTTON, "Закрыть")
# check edit user input form
self.should_be_edit_user_input_form(user_name, role)
# check input form buttons
save_button_text = "Сохранить"
self.assertion.check_button_presence_with_text(save_button_text, f"Edit user input form button with text {save_button_text} is not present")
remove_button_text = "Удалить"
self.assertion.check_button_presence_with_text(remove_button_text, f"Edit user input form button with text {remove_button_text} is not present")
reset_password_button_text = "Сбросить пароль"
self.assertion.check_button_presence_with_text(reset_password_button_text, f"Edit user input form button with text {reset_password_button_text} is not present")
close_button_text = "Закрыть"
self.assertion.check_button_presence_with_text(close_button_text, f"Edit user input form button with text {close_button_text} is not present")
def should_be_users_table(self):
headers = ['Имя пользователя', 'hash_password', 'Роль', 'E-mail', 'Номер для СМС']
users_table = self.read_table_data(ConfigurationPageLocators.WORK_AREA_TABLE)
users_table_headers = users_table[0]
self.assertion.check_equals(users_table_headers, headers, \
f"Expected table headers {users_table_headers} are not equal {headers}")
self.assertion.check_not_equals(len(users_table) - 1, 0, \
"Users table is empty")
self.verify_users_table_content(users_table)
def should_be_add_user_input_form(self):
self.assertion.check_presence(UsersTabLocators.USER_DATA_INPUT_FORM, \
"Input form for add new user is not present")
n = 7
for i in range (1, n + 1):
loc = f"xpath=div[{i}]/div[2]/div/div/div/div/input"
input_area = self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc)
if i == 1:
checked = self.page.get_by_role("checkbox").first.is_checked()
self.assertion.check_equals(checked, False, "Checkbox is checked by default")
loc = f"xpath={UsersTabLocators.USER_DATA_INPUT_FORM}/div[1]/div[2]/div/div/div{UsersTabLocators.USER_DATA_INPUT_FORM_NOTIFICATION_LABEL}"
self.assertion.have_text(loc, "ad", \
"Label for ad is not present")
elif i == 3:
loc = f"xpath=div[{i}]/div[2]/div/div/div/div/div[1]"
self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).click()
self.assertion.check_presence(UsersTabLocators.USER_DATA_INPUT_FORM_ROLES_MENU, \
"Roles drop-down menu is not present")
roles = self.role_dict.values()
for role in roles:
self.assertion.check_menu_item_with_text(role, f"No menu item with text: {role}")
else:
self.assertion.check_empty_input_area(input_area, "No empty input area")
checked = self.page.get_by_role("checkbox").nth(1).is_checked()
self.assertion.check_equals(checked, False, "Checkbox is checked by default")
loc = f"xpath={UsersTabLocators.USER_DATA_INPUT_FORM}/div[8]/div/div/div/div{UsersTabLocators.USER_DATA_INPUT_FORM_NOTIFICATION_LABEL}"
self.assertion.have_text(loc, "Подписка на Push-уведомления", \
"Label for push-notifications subscribtion is not present")
def should_be_edit_user_input_form(self, user_name, role):
self.assertion.check_presence(UsersTabLocators.USER_DATA_INPUT_FORM, \
"Input form for edit user is not present")
loc = "xpath=div[2]/div[2]/div/div/div/div/input"
text_value = self.page.locator(UsersTabLocators.USER_DATA_INPUT_FORM).locator(loc).input_value()
self.assertion.check_equals(text_value, user_name, "Expected user name is not equal real user name")
self.assertion.check_menu_item_with_text(role, f"No menu item with text: {role}")
def should_be_user_in_table(self, name, role):
found = self.find_user_in_table(name, role)
if found == -1:
assert False, f"User with name {name} and role {role} has not been found"
def should_not_be_user_in_table(self, name, role):
found = self.find_user_in_table(name, role)
if found != -1:
assert False, f"User with name {name} and role {role} has been found"
def find_user_in_table(self, name, role):
users_table = self.read_table_data(ConfigurationPageLocators.WORK_AREA_TABLE)
self.assertion.check_not_equals(len(users_table) - 1, 0, "Users table is empty")
# remove header
del users_table[0]
not_found_index = -1
row_index = 0
for user_info in users_table:
if name in user_info and role in user_info:
return row_index
row_index += 1
return not_found_index
def verify_users_table_content(self, users_table):
expected_users_list = []
## temporarily
tmp_dict = {"admin":"Администратор", "manager":"Контактное лицо", "operator":"Оператор"}
query = {"id": ["/catalogs/user"], "data": {"namePath": True, "children": {"flatten": True}}}
response = self.send_post_api_request("e-cmdb/api/query", query)
response_body = self.get_response_body(response)
for item in response_body[0]["children"]:
user_info = []
## temporarily
user_name = item["name"]
if user_name in tmp_dict.keys():
item["name"] = tmp_dict[user_name]
user_info.append(item["name"])
if item["password"] is not None:
user_info.append(item["password"])
else:
user_info.append("")
if item["role"] is not None:
role = item["role"]
if role in self.role_dict.keys():
item["role"] = self.role_dict[role]
user_info.append(item["role"])
else:
user_info.append("")
if item["email"] is not None:
user_info.append(item["email"])
else:
user_info.append("")
if item["sms_phone"] is not None:
user_info.append(item["sms_phone"])
else:
user_info.append("")
expected_users_list.append(user_info)
# remove header
del users_table[0]
self.assertion.check_lists_equals(users_table, expected_users_list, \
"Actual users list is not equal users list from db")