From a88d8ed54a5a2c8cef3e53159feb964970999f6d Mon Sep 17 00:00:00 2001 From: Radislav Date: Tue, 18 Nov 2025 12:27:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20SelectionBarComponent=20=D0=B2=20CreateRac?= =?UTF-8?q?kElementTab=20-=20=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20Dropdo?= =?UTF-8?q?wnList=20=D0=BD=D0=B0=20SelectionBarComponent=20=D0=B2=20Create?= =?UTF-8?q?RackElementTab=20=D0=B4=D0=BB=D1=8F=20=D0=B5=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BD=D0=BE=D0=B9=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=B2=D1=8B=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=BC=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20get=5Favailable=5Foptions()=20=D0=B2=20SelectionBarCom?= =?UTF-8?q?ponent=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=B4?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=86=D0=B8=D0=B9=20=D0=B8=D0=B7=20=D0=B2=D1=8B=D0=BF=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=20-=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20selection=5Fbar=5Flocators.py=20?= =?UTF-8?q?=D1=81=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=BC=D0=B8=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=BE=D1=80=D0=B0=D0=BC=D0=B8=20LISTBOX=20?= =?UTF-8?q?=D0=B8=20LIST=5FITEMS=20=D0=B4=D0=BB=D1=8F=20=D1=8D=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B2=D1=8B=D0=BF=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=20-=20=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20combobox=5Flocators.py=20=D1=81=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=BC=20=D0=BB=D0=BE=D0=BA=D0=B0=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=BC=20LIST=5FITEMS=5FSELECTOR=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BE=D0=BF=D1=86=D0=B8=D0=B9=20combobox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/navbar_component.py | 10 +- components_derived/selection_bar_component.py | 101 +++++++++++++++ .../sidebar_filter_component.py | 119 ++++++++++++++++++ locators/combobox_locators.py | 3 +- locators/selection_bar_locators.py | 22 ++++ .../create_child_element_tab.cpython-313.pyc | Bin 19049 -> 0 bytes .../create_rack_element_tab.cpython-313.pyc | Bin 34936 -> 0 bytes .../create_rack_element_tab.py | 64 +++++----- .../__pycache__/rack_create.cpython-313.pyc | Bin 21880 -> 0 bytes .../rack_general_info.cpython-313.pyc | Bin 5923 -> 0 bytes .../__pycache__/rack_tab.cpython-313.pyc | Bin 26153 -> 0 bytes 11 files changed, 280 insertions(+), 39 deletions(-) create mode 100644 components_derived/selection_bar_component.py create mode 100644 components_derived/sidebar_filter_component.py create mode 100644 locators/selection_bar_locators.py delete mode 100644 pages/create_elements_tab/__pycache__/create_child_element_tab.cpython-313.pyc delete mode 100644 pages/create_elements_tab/__pycache__/create_rack_element_tab.cpython-313.pyc delete mode 100644 pages/rack_tab/__pycache__/rack_create.cpython-313.pyc delete mode 100644 pages/rack_tab/__pycache__/rack_general_info.cpython-313.pyc delete mode 100644 pages/rack_tab/__pycache__/rack_tab.cpython-313.pyc diff --git a/components/navbar_component.py b/components/navbar_component.py index 6c9205a..b3254f1 100644 --- a/components/navbar_component.py +++ b/components/navbar_component.py @@ -247,8 +247,10 @@ class NavigationPanelComponent(BaseComponent): Returns: bool: True если элемент видим, False если нет. """ - try: - self.check_item_visibility(locator, item_name) - return True - except: + element_locator = self.page.locator(locator).filter(has_text=item_name) + + # Сначала проверяем что элемент вообще существует + if element_locator.count() == 0: return False + + return element_locator.is_visible() \ No newline at end of file diff --git a/components_derived/selection_bar_component.py b/components_derived/selection_bar_component.py new file mode 100644 index 0000000..3f24d69 --- /dev/null +++ b/components_derived/selection_bar_component.py @@ -0,0 +1,101 @@ +"""Модуль компонента панели выбора значения. + +Содержит класс для работы с компонентом панели выбора значения через Playwright. +""" + +from playwright.sync_api import Page, Locator, expect +from tools.logger import get_logger +from locators.selection_bar_locators import SelectionBarLocators +from locators.combobox_locators import ComboboxLocators +from components.dropdown_list_component import DropdownList +from components.base_component import BaseComponent + +logger = get_logger("FILTER_PARAMETER_BAR") + + +class SelectionBarComponent(BaseComponent): + """Компонент панели выбора значения. + + Предоставляет методы для взаимодействия с элементами компонента панели выбора значения. + """ + + def __init__(self, page: Page, locator: str | Locator): + """Инициализирует компонент панели выбора значения. + + Args: + page: Экземпляр страницы Playwright. + locator: Локатор панели выбора значения (строка или объект Locator) + """ + + super().__init__(page) + + # Локатор панели параметра фильтрации + 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_selection_bar_title(self) -> str: + """ Возвращает название панели выбора значения """ + + title_locator = self.selection_bar_locator.locator("//label") + return title_locator.text_content() + + 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() + + def get_available_options(self) -> list[str]: + """ + Возвращает список всех доступных опций из выпадающего списка. + + Returns: + list[str]: Список доступных опций + """ + logger.info("Получение списка доступных опций из выпадающего списка...") + + # Открываем выпадающий список + self.open_values_list() + + # Ждем появления списка + self.wait_for_timeout(1000) + + # Получаем все элементы списка + options = self.selected_values_list.get_item_names(SelectionBarLocators.LIST_ITEMS) + + # Закрываем список (кликаем вне его) + self.page.mouse.click(10, 10) + self.wait_for_timeout(500) + + logger.info(f"Найдено доступных опций: {len(options)} - {options}") + return options + + 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 new file mode 100644 index 0000000..a047516 --- /dev/null +++ b/components_derived/sidebar_filter_component.py @@ -0,0 +1,119 @@ +"""Модуль компонента боковой панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс для работы +с формами ввода, их элементами и проверками.""" + +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 + +logger = get_logger("SIDEBAR_FILTER") + + +class SidebarFilterComponent(BaseComponent): + """Компонент боковой панели формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы для + взаимодействия с формой, ее содержимым и проверок.""" + + def __init__(self, page: Page, locator: str | Locator): + """Инициализирует компонент боковой панели формы ввода параметров фильтрации. + + Args: + page: Экземпляр страницы Playwright + locator: Локатор контейнера (строка или объект Locator) для которого вызывается панель + """ + super().__init__(page) + + self.sidebar_locator = self.get_locator(locator) + + self.toolbar = ToolbarComponent(page, "Настройки и параметры") + + # Поля ввода даты начала и даты окончания события + self.start_time_filter = DateInput(page, + self.sidebar_locator.locator( + "//div[contains(@class, 'scrollarea__body')]/div").nth(0)) + self.finish_time_filter = DateInput(page, + self.sidebar_locator.locator( + "//div[contains(@class, 'scrollarea__body')]/div").nth(1)) + + # Поля задания параметров фильтрации (произвольное количество) + self.filtering_parameters = {} + + # Кнопки задания/сброса параметров фильтрации + self.apply_button = Button(page, + self.sidebar_locator.get_by_role("button").filter(has_text='Применить Фильтры'), + "apply_button") + self.reset_button = Button(page, + self.sidebar_locator.get_by_role("button").filter(has_text='Сбросить Фильтры'), + "reset_button") + + # Действия: + def add_filtering_parameter(self, name: str, title: str) -> None: + """Добавляет поле задания параметров фильтрации по заданному имени.""" + + loc = self.sidebar_locator.locator("//div[contains(@class, 'scrollarea__body')]").\ + get_by_role("combobox").filter(has_text=title) + self.filtering_parameters[name] = SelectionBarComponent(self.page, loc) + + def get_filtering_parameter(self, name: str) -> SelectionBarComponent | None: + """Возвращает поле задания параметров фильтрации по заданному или None, если не найдено.""" + + return self.filtering_parameters.get(name) + + def get_start_time_filter(self) -> DateInput: + """Возвращает поле задания параметров фильтрации даты начала.""" + + return self.start_time_filter + + def get_finish_time_filter(self) -> DateInput: + """Возвращает поле задания параметров фильтрации даты окончания.""" + + return self.finish_time_filter + + def click_apply_button(self) -> None: + """Клик по кнопке применения фильтра.""" + + self.apply_button.click() + + def click_reset_button(self) -> None: + """Клик по кнопке сброса фильтра.""" + + self.reset_button.click() + + # Проверки: + 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: + """Проверяет возможность вертикальной прокрутки формы.""" + + return self.is_scrollable_vertically(locator) + + def check_apply_button_visibility(self) -> None: + """Проверяет наличие кнопки применения фильтра.""" + + self.apply_button.check_visibility("Apply Filter Button is missing") + + def check_reset_button_visibility(self) -> None: + """Проверяет наличие кнопки сброса фильтра.""" + + self.reset_button.check_visibility("Reset Filter Button is missing") + + def should_be_toolbar(self) -> None: + """Проверяет наличие тулбара. + + Raises: + AssertionError: Если тулбар отсутствует. + """ + + self.toolbar.check_toolbar_presence_by_locator_and_title(self.sidebar_locator, + "Sidebar Filter form toolbar is missing") diff --git a/locators/combobox_locators.py b/locators/combobox_locators.py index 597de62..fbed277 100644 --- a/locators/combobox_locators.py +++ b/locators/combobox_locators.py @@ -27,7 +27,8 @@ class ComboboxLocators: # Выпадающие списки LISTBOX_SELECTOR: str = "//div[contains(@class, 'v-menu__content')]//div[@role='list']" + LIST_ITEMS_SELECTOR: str = "//div[contains(@class, 'v-menu__content')]//div[@role='listitem']" OPTIONS_SELECTOR: str = "//div[contains(@class, 'v-menu__content')]//div[@role='listitem']//span" # Получение выбранного значения - SELECTED_VALUE_SPAN: str = "span" + SELECTED_VALUE_SPAN: str = "span" \ No newline at end of file diff --git a/locators/selection_bar_locators.py b/locators/selection_bar_locators.py new file mode 100644 index 0000000..b0d2bfc --- /dev/null +++ b/locators/selection_bar_locators.py @@ -0,0 +1,22 @@ +"""Модуль selection_bar_locators содержит локаторы компонента панели выбора значения. + +Класс SelectionBarLocators предоставляет XPath/CSS локаторы для взаимодействия +с компонентом панели выбора значения. +""" + +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']" \ No newline at end of file diff --git a/pages/create_elements_tab/__pycache__/create_child_element_tab.cpython-313.pyc b/pages/create_elements_tab/__pycache__/create_child_element_tab.cpython-313.pyc deleted file mode 100644 index be16468c71cabae6ba3c99e535f72754b4141c64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19049 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 DO;XDv diff --git a/pages/create_elements_tab/__pycache__/create_rack_element_tab.cpython-313.pyc b/pages/create_elements_tab/__pycache__/create_rack_element_tab.cpython-313.pyc deleted file mode 100644 index a8b984260b98b698823e061c3f52a51492112924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34936 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 None: """ @@ -125,7 +121,8 @@ class CreateRackElementTab(BasePage): # Открываем combobox self.open_object_class_combobox() - self.dropdown.click_item_with_text(class_name) + # Выбираем значение из списка + self.selection_bar.select_value(class_name) # Проверяем что выбор произошел self.wait_for_timeout(1000) @@ -139,6 +136,30 @@ class CreateRackElementTab(BasePage): logger.info(f"Класс объекта '{class_name}' успешно выбран") + def get_object_class_options(self) -> list[str]: + """ + Получает список доступных опций из combobox. + + Returns: + list[str]: Список доступных классов объектов + """ + logger.info("Получение списка опций combobox 'Класс объекта учета'...") + + available_options = self.selection_bar.get_available_options() + + logger.info(f"Доступные опции класса объекта: {available_options}") + return available_options + + def get_selected_object_class(self) -> str: + """ + Получает выбранный класс объекта учета. + + Returns: + str: Выбранный класс объекта или пустая строка если ничего не выбрано + """ + # Получаем заголовок панели выбора + return self.selection_bar.get_selection_bar_title() + def fill_rack_data(self, name: str, height: str = "42", depth: str = "1000", serial: str = "", inventory: str = "", comment: str = "", cable_entry: str = "", state: str = "", owner: str = "", @@ -349,31 +370,6 @@ class CreateRackElementTab(BasePage): logger.info("Все поля формы стойки очищены") - def get_object_class_options(self) -> list[str]: - """ - Получает список доступных опций из combobox. - - Returns: - list[str]: Список доступных классов объектов - """ - return self.dropdown.get_combobox_options( - ComboboxLocators.OBJECT_CLASS_COMBOBOX, - ComboboxLocators.LISTBOX_SELECTOR, - ComboboxLocators.COMBOBOX_ICON - ) - - def get_selected_object_class(self) -> str: - """ - Получает выбранный класс объекта учета. - - Returns: - str: Выбранный класс объекта или пустая строка если ничего не выбрано - """ - return self.dropdown.get_selected_combobox_value( - ComboboxLocators.OBJECT_CLASS_COMBOBOX, - ComboboxLocators.SELECTED_VALUE_SPAN - ) - # =============== МЕТОДЫ ПРОВЕРОК ======================== def check_rack_exists(self, rack_name: str) -> bool: """ diff --git a/pages/rack_tab/__pycache__/rack_create.cpython-313.pyc b/pages/rack_tab/__pycache__/rack_create.cpython-313.pyc deleted file mode 100644 index 561470c00b5aec975956af7c89ab38eeb3578ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21880 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 diff --git a/pages/rack_tab/__pycache__/rack_general_info.cpython-313.pyc b/pages/rack_tab/__pycache__/rack_general_info.cpython-313.pyc deleted file mode 100644 index 94269cbc9661fda4d3e140cc82a9e5a2d9bbdf2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5923 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