diff --git a/.env b/.env index 73a7825..356453e 100644 --- a/.env +++ b/.env @@ -1,3 +1,3 @@ -ENV=test +ENV=develop AUTH_LOGIN = admin -AUTH_PASSWORD = admin +AUTH_PASSWORD = admin123 diff --git a/components_derived/modal_add_AD_user.py b/components_derived/modal_add_AD_user.py index 4b8e83f..7c4560e 100644 --- a/components_derived/modal_add_AD_user.py +++ b/components_derived/modal_add_AD_user.py @@ -37,7 +37,7 @@ class AddADUserModalWindow(ModalWindowComponent): # Локаторы элементов формы input_form_locator = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA) - text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA + text_field_locator = f"xpath={ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA}" label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA # Настройка заголовка и кнопки закрытия тулбара @@ -78,6 +78,7 @@ class AddADUserModalWindow(ModalWindowComponent): self.add_button(locator_button_search, "search") # Поле Имя + # loc = input_form_locator.locator("xpath=div[2]").locator(text_field_locator) loc = input_form_locator.locator("xpath=div[3]").locator(text_field_locator) name_input = TextInput(page, loc, "name_input") self.add_content_item("name_input", name_input) @@ -182,7 +183,8 @@ class AddADUserModalWindow(ModalWindowComponent): """Персчитывает локаторы полей формы ввода при добавлении/удалении дополнительного поля. """ input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA) - text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA + # text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA + text_field_locator = f"xpath={ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA}" if expand: new_loc = input_form_locator.locator("xpath=div[4]").locator(text_field_locator) diff --git a/components_derived/modal_add_local_user.py b/components_derived/modal_add_local_user.py index da4c02c..80c8178 100644 --- a/components_derived/modal_add_local_user.py +++ b/components_derived/modal_add_local_user.py @@ -69,12 +69,8 @@ class AddLocalUserModalWindow(ModalWindowComponent): self.add_content_item("active_directory_checkbox_label", label_1) # Поле Имя - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[2]") - .locator(text_field_locator) - ) - name_input = TextInput(page, loc, "name_input") + loc = f"{input_form_locator}/div[2]/{text_field_locator}" + name_input = TextInput(page, self.page.locator(loc), "name_input") self.add_content_item("name_input", name_input) # Чекбокс "Блокировка" - индекс 1 @@ -100,39 +96,23 @@ class AddLocalUserModalWindow(ModalWindowComponent): self.add_content_item("roles_list", DropdownList(page)) # Поле Пароль - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[5]") - .locator(text_field_locator) - ) - password_input = TextInput(page, loc, "password_input") + loc = f"{input_form_locator}/div[5]/{text_field_locator}" + password_input = TextInput(page, self.page.locator(loc), "password_input") self.add_content_item("password_input", password_input) # Поле Комментарий - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[6]") - .locator(text_field_locator) - ) - commentary_input = TextInput(page, loc, "commentary_input") + loc = f"{input_form_locator}/div[6]/{text_field_locator}" + commentary_input = TextInput(page, self.page.locator(loc), "commentary_input") self.add_content_item("commentary_input", commentary_input) # Поле E-mail - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[7]") - .locator(text_field_locator) - ) - email_input = TextInput(page, loc, "email_input") + loc = f"{input_form_locator}/div[7]/{text_field_locator}" + email_input = TextInput(page, self.page.locator(loc), "email_input") self.add_content_item("email_input", email_input) # Поле Номер для СМС - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[8]") - .locator(text_field_locator) - ) - phone_input = TextInput(page, loc, "phone_input") + loc = f"{input_form_locator}/div[8]/{text_field_locator}" + phone_input = TextInput(page, self.page.locator(loc), "phone_input") self.add_content_item("phone_input", phone_input) # Чекбокс "Подписка на Push-уведомления" - индекс 2 @@ -284,6 +264,9 @@ class AddLocalUserModalWindow(ModalWindowComponent): self.check_toolbar_button_visibility("close") self.check_toolbar_button_tooltip("close", "Закрыть") + + input_fields = ["name_input", "password_input", + "commentary_input", "email_input", "phone_input"] for name in self.content_items: item = self.get_content_item(name) @@ -318,9 +301,15 @@ class AddLocalUserModalWindow(ModalWindowComponent): if role == "Пользователь": continue roles_list.check_item_with_text(role) + elif name in input_fields: + item.check_editable_input( + f"Input field with name '{name}' should be editable" + ) elif name == "roles_list": continue else: + print(f"check item: {name}") + print(item) item.check_visibility( f"Modal window content item with name '{name}' is missing" ) diff --git a/components_derived/modal_edit_user.py b/components_derived/modal_edit_user.py index d37a7ce..dcf9b85 100644 --- a/components_derived/modal_edit_user.py +++ b/components_derived/modal_edit_user.py @@ -34,7 +34,8 @@ class EditUserModalWindow(ModalWindowComponent): super().__init__(page) # Локаторы элементов формы - text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA + # text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA + text_field_locator = f"xpath={ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA}" input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA diff --git a/elements/base_element.py b/elements/base_element.py index fe0b504..a7b5faa 100644 --- a/elements/base_element.py +++ b/elements/base_element.py @@ -47,7 +47,7 @@ class BaseElement: """Выполняет клик по элементу.""" logger.info(f"Clicking {self.type_of} '{self.name}'") - self.locator.click() + self.locator.click(force=True) def get_text(self, index: int) -> str: """Возвращает текст элемента по указанному индексу.""" @@ -78,7 +78,8 @@ class BaseElement: """Проверяет видимость элемента на странице.""" logger.info(f"Check that {self.type_of} '{self.name}' is present") - print(self.locator) + # print(f"Check that {self.type_of} '{self.name}' is present") + # print(self.locator) expect(self.locator).to_be_visible(visible=True, timeout=12000), msg def is_present(self, timeout: int = 5000) -> bool: diff --git a/elements/text_input_element.py b/elements/text_input_element.py index b9c9a65..9c37e77 100644 --- a/elements/text_input_element.py +++ b/elements/text_input_element.py @@ -78,3 +78,16 @@ class TextInput(BaseElement): logger.info(f'Checking that text input "{self.name}" is empty') expect(self.locator).to_be_empty(), msg + + def check_editable_input(self, msg: str) -> None: + """Проверяет, что поле ввода редактируемое. + + Args: + msg (str): Сообщение об ошибке при неудачной проверке. + + Raises: + AssertionError: Если поле не пустое. + """ + + logger.info(f'Checking that text input "{self.name}" is editable') + expect(self.locator).to_be_editable(), msg diff --git a/locators/modal_window_locators.py b/locators/modal_window_locators.py index d30043c..bab56d2 100644 --- a/locators/modal_window_locators.py +++ b/locators/modal_window_locators.py @@ -23,8 +23,9 @@ class ModalWindowLocators: MODAL_WINDOW_TITLE = f"{MODAL_WINDOW}//div[contains(@class, 'v-toolbar__title')]" MODAL_WINDOW_TEXT_FIELD_INPUT = f"{MODAL_WINDOW}//input" - INPUT_FORM_USER_DATA = "//form[@class='v-form']" - TEXT_FIELD_INPUT_FORM_USER_DATA = "xpath=div[2]/div/div/div/div/input" + INPUT_FORM_USER_DATA = f"{MODAL_WINDOW}//form[@class='v-form']" + TEXT_FIELD_INPUT_FORM_USER_DATA = "div[2]/div/div/div/div/input" + # TEXT_FIELD_INPUT_FORM_USER_DATA = "xpath=div[2]/div/div/div/div/input" MENU_INPUT_FORM_USER_DATA = "//div[contains(@class, 'menuable__content__active')]" LABEL_INPUT_FORM_USER_DATA = "//label[contains(@class,'v-label')]/span" diff --git a/pages/users_tab.py b/pages/users_tab.py index 36a84f3..9dc4a17 100644 --- a/pages/users_tab.py +++ b/pages/users_tab.py @@ -298,6 +298,8 @@ class UsersTab(BasePage): self.toolbar.check_button_visibility("add_user") self.toolbar.click_button("add_user") + self.page.wait_for_timeout(700) + self.add_modal_window("add_local_user", "") self.get_modal_window("add_local_user").check_by_window_title() diff --git a/tests/e2e/test_login.py b/tests/e2e/test_login.py index 5cf9fdf..8d74b92 100644 --- a/tests/e2e/test_login.py +++ b/tests/e2e/test_login.py @@ -41,6 +41,7 @@ class TestLogin: lp = LoginPage(browser) lp.do_unsuccessful_login() + # @pytest.mark.develop def test_successful_login_and_logout(self, browser: Page) -> None: """Проверяет успешный вход и выход из системы. diff --git a/tests/e2e/users/test_add_user.py b/tests/e2e/users/test_add_user.py index 4097c0d..ef495f4 100644 --- a/tests/e2e/users/test_add_user.py +++ b/tests/e2e/users/test_add_user.py @@ -80,11 +80,14 @@ class TestUsersTabAddUser: """ ut = UsersTab(browser) + ut.open_add_user_window() ut.check_add_user_window_content() ut.transform_to_add_AD_user_window() ut.check_add_AD_user_window_content() + ut.close_add_AD_user_window() + # @pytest.mark.develop def test_add_user_window_close_buttons(self, browser: Page) -> None: """Проверяет кнопки закрытия окна добавления. @@ -93,6 +96,8 @@ class TestUsersTabAddUser: """ ut = UsersTab(browser) + browser.wait_for_timeout(500) + ut.open_add_user_window() ut.close_add_user_window_by_toolbar_button() @@ -107,6 +112,7 @@ class TestUsersTabAddUser: ut.transform_to_add_AD_user_window() ut.close_add_AD_user_window() + # @pytest.mark.develop def test_add_local_user(self, browser: Page, cleanup_users: None) -> None: """Проверяет добавление локального пользователя. @@ -118,6 +124,7 @@ class TestUsersTabAddUser: user_data: Dict[str, str] = {"name": "TestUser", "role": "Администратор", "password": "987654321abcd"} self._add_user(browser, user_data) + # @pytest.mark.develop def test_add_AD_user(self, browser: Page, cleanup_users: None) -> None: """Проверяет добавление пользователя Active Directory. @@ -151,9 +158,8 @@ class TestUsersTabAddUser: if not user_exists: # Создаем пользователя впервые ut.open_add_user_window() - success = ut.add_new_user(user_data) - - if success: + + if ut.add_new_user(user_data): # Ждем обновления таблицы с использованием ожиданий Playwright browser.wait_for_timeout(2000) diff --git a/tests/e2e/users/test_edit_user.py b/tests/e2e/users/test_edit_user.py index 2a10b73..88860ce 100644 --- a/tests/e2e/users/test_edit_user.py +++ b/tests/e2e/users/test_edit_user.py @@ -81,6 +81,8 @@ class TestUsersTabEditUser: """ ut = UsersTab(browser) + browser.wait_for_timeout(500) + user_name, role = ut.open_edit_user_page_by_index(0) ut.check_edit_user_window_content(user_name, role) @@ -92,6 +94,8 @@ class TestUsersTabEditUser: """ ut = UsersTab(browser) + browser.wait_for_timeout(500) + user_name, _ = ut.open_edit_user_page_by_index(0) ut.close_edit_user_window_by_toolbar_button(user_name) user_name, _ = ut.open_edit_user_page_by_index(0) @@ -109,6 +113,7 @@ class TestUsersTabEditUser: mp = MainPage(browser) ut = UsersTab(browser) + browser.wait_for_timeout(500) # Проверяем, есть ли такой пользователь user_exists = ut.find_user_in_table(user_data["name"], user_data["role"]) != -1 @@ -149,6 +154,7 @@ class TestUsersTabEditUser: mp = MainPage(browser) ut = UsersTab(browser) + browser.wait_for_timeout(500) ut.open_add_user_window() ut.add_new_user(user_data) @@ -189,6 +195,7 @@ class TestUsersTabEditUser: mp = MainPage(browser) ut = UsersTab(browser) + browser.wait_for_timeout(500) ut.open_add_user_window() ut.add_new_user(user_data) diff --git a/tests/e2e/users/test_user_card.py b/tests/e2e/users/test_user_card.py index 8315b0e..cca7d2b 100644 --- a/tests/e2e/users/test_user_card.py +++ b/tests/e2e/users/test_user_card.py @@ -41,6 +41,8 @@ class TestUserCard: # Создание нового пользователя mp.click_main_navigation_panel_item("Настройки") mp.click_subpanel_item("Пользователи") + browser.wait_for_timeout(500) + ut.open_add_user_window() ut.add_new_user(user_data)