From 6c6f8c18f2d3987b12bbe45180dde25c2ef3242a Mon Sep 17 00:00:00 2001 From: nsubbot Date: Thu, 20 Nov 2025 14:11:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D0=B8=20=D1=8D=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B2=D1=8B=D0=BF=D0=B2=D0=B4?= =?UTF-8?q?=D0=B0=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0=20=D0=BF=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/events_container_component.py | 4 +- .../container_system_log_events.py | 16 +++--- components_derived/selection_bar_component.py | 56 +++++++++++++------ .../sidebar_filter_component.py | 20 +++---- locators/selection_bar_locators.py | 8 ++- .../unit_tests/test_selection_bar.py | 19 +++---- 6 files changed, 73 insertions(+), 50 deletions(-) diff --git a/components/events_container_component.py b/components/events_container_component.py index 1a34f97..58013b5 100644 --- a/components/events_container_component.py +++ b/components/events_container_component.py @@ -156,10 +156,10 @@ class EventsContainerComponent(BaseComponent): loc = self.container_locator.locator(self.table_locator) return self.events_table.get_rows_count(loc) - + def get_sidebar_filter(self) -> SidebarFilterComponent: """Возвращает боковую панель фильтрации.""" - + return self.sidebar_filter def get_toolbar_filter_button(self) -> Button: diff --git a/components_derived/container_system_log_events.py b/components_derived/container_system_log_events.py index f930ad3..d654dc2 100644 --- a/components_derived/container_system_log_events.py +++ b/components_derived/container_system_log_events.py @@ -9,9 +9,7 @@ from tools.logger import get_logger from locators.toolbar_locators import ToolbarLocators from components.events_container_component import EventsContainerComponent - - -logger = get_logger("USER_SETTINGS_DIALOG") +logger = get_logger("SYSTEM_LOG_EVENTS_CONTAINER") class SystemLogEventsContainer(EventsContainerComponent): @@ -31,12 +29,12 @@ class SystemLogEventsContainer(EventsContainerComponent): super().__init__(page, locator) self.add_tab_to_toolbar(ToolbarLocators.TABS, "events") - + sidebar_filter = self.get_sidebar_filter() sidebar_filter.add_filtering_parameter("filter_type", "Тип") sidebar_filter.add_filtering_parameter("filter_strictness", "Строгость") sidebar_filter.add_filtering_parameter("filter_host", "Хост") - + # Действия: # Проверки: def check_content(self) -> None: @@ -64,18 +62,18 @@ class SystemLogEventsContainer(EventsContainerComponent): assert False, "Table body is missing" self.should_be_pagination_buttons() - + sidebar_filter = self.click_filter_button() sidebar_filter.check_content() - + filter_type_bar = sidebar_filter.get_filtering_parameter("filter_type") filter_type_title = filter_type_bar.get_filter_parameter_title() assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing" - + filter_strictness_bar = sidebar_filter.get_filtering_parameter("filter_strictness") filter_strictness_title = filter_strictness_bar.get_filter_parameter_title() assert filter_strictness_title == "Строгость", "Filtering parameter bar 'Строгость' is missing" - + filter_host_bar = sidebar_filter.get_filtering_parameter("filter_host") filter_host_title = filter_host_bar.get_filter_parameter_title() assert filter_host_title == "Хост", "Filtering parameter bar 'Хост' is missing" diff --git a/components_derived/selection_bar_component.py b/components_derived/selection_bar_component.py index f8f371c..1f1f515 100644 --- a/components_derived/selection_bar_component.py +++ b/components_derived/selection_bar_component.py @@ -9,7 +9,7 @@ from locators.selection_bar_locators import SelectionBarLocators from components.dropdown_list_component import DropdownList from components.base_component import BaseComponent -logger = get_logger("FILTER_PARAMETER_BAR") +logger = get_logger("SELECTION_BAR") class SelectionBarComponent(BaseComponent): @@ -30,46 +30,66 @@ class SelectionBarComponent(BaseComponent): # Локатор панели параметра фильтрации self.selection_bar_locator = self.get_locator(locator) - + # При нажатии на панель появляется выпадающий список с параметрами фильтрации для выбора self.selected_values_list = DropdownList(self.page) # Действия: def clear_selections(self) -> None: """ Удаление ранее выбранных значений """ - + selected_values = self.get_selected_values() if len(selected_values) > 0: clear_button_locator = self.selection_bar_locator.\ locator(SelectionBarLocators.CLEAR_SELECTION_BUTTON) clear_button_locator.click() - - + + def get_available_options(self) -> list[str]: + """Возвращает список всех доступных опций из выпадающего списка """ + + logger.info("Получение списка доступных опций из выпадающего списка...") + + # Открываем выпадающий список + self.open_values_list() + + # Ждем появления списка + self.page.wait_for_timeout(1000) + + # Получаем все элементы списка + options = self.selected_values_list.get_item_names(SelectionBarLocators.LIST_ITEMS) + + # Закрываем список (кликаем вне его) + self.page.mouse.click(10, 10) + self.page.wait_for_timeout(500) + + logger.info(f"Найдено доступных опций: {len(options)} - {options}") + return options + def get_selection_bar_title(self) -> str: """ Возвращает название панели выбора значения """ - - title_locator = self.selection_bar_locator.locator("//label") + + title_locator = self.selection_bar_locator.locator("//label") return title_locator.text_content() - - def get_selected_values(self) -> []: + + def get_selected_values(self) -> list[str]: """ Возвращает список выбранных значений """ - + selected_values_locator = self.selection_bar_locator.\ locator(SelectionBarLocators.PARAMETERS_SELECTED) - + selected_values = selected_values_locator.all_inner_texts() return selected_values[0].splitlines() - + def open_values_list(self) -> None: """ Открытие выпадающего списка путем нажатия на панель выбора значения """ - - expect(self.selection_bar_locator).to_be_visible() - self.selection_bar_locator.click() - + + expect(self.selection_bar_locator).to_be_visible() + self.selection_bar_locator.click() + def select_value(self, name: str) -> None: """ Выбор значения из списка """ - + self.selected_values_list.check_item_with_text(name) self.selected_values_list.click_item_with_text(name) - + # Проверки: diff --git a/components_derived/sidebar_filter_component.py b/components_derived/sidebar_filter_component.py index a047516..6eb6196 100644 --- a/components_derived/sidebar_filter_component.py +++ b/components_derived/sidebar_filter_component.py @@ -1,20 +1,20 @@ -"""Модуль компонента боковой панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс для работы -с формами ввода, их элементами и проверками.""" +"""Модуль компонента боковой панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс +для работы с формами ввода, их элементами и проверками.""" from playwright.sync_api import Page, Locator from tools.logger import get_logger from elements.button_element import Button -from components_derived.selection_bar_component import SelectionBarComponent -from components_derived.date_input_component import DateInput from components.toolbar_component import ToolbarComponent from components.base_component import BaseComponent +from components_derived.selection_bar_component import SelectionBarComponent +from components_derived.date_input_component import DateInput logger = get_logger("SIDEBAR_FILTER") class SidebarFilterComponent(BaseComponent): - """Компонент боковой панели формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы для - взаимодействия с формой, ее содержимым и проверок.""" + """Компонент боковой панели формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы + для взаимодействия с формой, ее содержимым и проверок.""" def __init__(self, page: Page, locator: str | Locator): """Инициализирует компонент боковой панели формы ввода параметров фильтрации. @@ -84,15 +84,15 @@ class SidebarFilterComponent(BaseComponent): # Проверки: def check_content(self) -> None: """Проверяет наличие постоянных полей панели параметров фильтрации.""" - + self.should_be_toolbar() self.start_time_filter.check_content("Дата начала") self.finish_time_filter.check_content("Дата окончания") - + self.check_apply_button_visibility() self.check_reset_button_visibility() - - + + def check_vertical_scrolling(self, locator: str| Locator) -> bool: """Проверяет возможность вертикальной прокрутки формы.""" diff --git a/locators/selection_bar_locators.py b/locators/selection_bar_locators.py index 7b595d2..d49d1c0 100644 --- a/locators/selection_bar_locators.py +++ b/locators/selection_bar_locators.py @@ -8,9 +8,15 @@ class SelectionBarLocators: """Локаторы для компонента панели выбора значения. Содержит XPath/CSS локаторы для: - + - Кнопок открытия и очистки + - Выбранных значений + - Элементов выпадающего списка """ OPEN_PARAMETERS_LIST_BUTTON = "div.v-input__icon--append" CLEAR_SELECTION_BUTTON = "div.v-input__icon--clear" PARAMETERS_SELECTED = "div.v-select__selections" + + # Локаторы для элементов выпадающего списка + LISTBOX = "//div[@role='listbox']" + LIST_ITEMS = "//div[@role='listbox']//div[@role='listitem']" diff --git a/tests/components/unit_tests/test_selection_bar.py b/tests/components/unit_tests/test_selection_bar.py index 30ccc2e..1b05adb 100644 --- a/tests/components/unit_tests/test_selection_bar.py +++ b/tests/components/unit_tests/test_selection_bar.py @@ -36,12 +36,12 @@ class TestSelectionBarComponent: system_log_events_container = mp.click_events_panel_system_log_tab() sidebar_filter = system_log_events_container.click_filter_button() browser.wait_for_timeout(500) - + sidebar_filter.add_filtering_parameter("filter_type", "Тип") filter_type_bar = sidebar_filter.get_filtering_parameter("filter_type") filter_type_title = filter_type_bar.get_selection_bar_title() assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing" - + # @pytest.mark.develop def test_selection_values(self, browser: Page) -> None: """Проверяет возможность выбора значений. @@ -59,23 +59,23 @@ class TestSelectionBarComponent: system_log_events_container = mp.click_events_panel_system_log_tab() sidebar_filter = system_log_events_container.click_filter_button() browser.wait_for_timeout(500) - + sidebar_filter.add_filtering_parameter("filter_type", "Тип") filter_type_bar = sidebar_filter.get_filtering_parameter("filter_type") - + filter_type_bar.open_values_list() filter_type_bar.select_value("e-nms") selected_values = filter_type_bar.get_selected_values() assert len(selected_values) > 0, "No values has been selected" assert selected_values[0] == "e-nms", f"Got unexpected selected value {selected_values[0]}" - + filter_type_bar.open_values_list() filter_type_bar.select_value("Технический учет") selected_values = filter_type_bar.get_selected_values() assert len(selected_values) > 0, "No values has been selected" assert selected_values[0] == "e-nms", f"Got unexpected selected value {selected_values[0]}" assert selected_values[1] == "Технический учет", f"Got unexpected selected value {selected_values[1]}" - + # @pytest.mark.develop def test_clear_selected_values(self, browser: Page) -> None: """Проверяет возможность удаления ранее выбранных значений. @@ -93,14 +93,13 @@ class TestSelectionBarComponent: system_log_events_container = mp.click_events_panel_system_log_tab() sidebar_filter = system_log_events_container.click_filter_button() browser.wait_for_timeout(500) - + sidebar_filter.add_filtering_parameter("filter_type", "Тип") filter_type_bar = sidebar_filter.get_filtering_parameter("filter_type") filter_type_bar.open_values_list() filter_type_bar.select_value("e-nms") browser.wait_for_timeout(300) - - filter_type_bar.clear_selections() + + filter_type_bar.clear_selections() selected_values = filter_type_bar.get_selected_values() assert len(selected_values) == 0, "Selected values should be deleted" - \ No newline at end of file