From 3cdc495fef4296aa16203f8f03ee47c975901254 Mon Sep 17 00:00:00 2001 From: nsubbot Date: Tue, 23 Sep 2025 13:11:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=20=D1=81=20=D1=83=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B5=D0=B3=D0=BE=20=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8F=20(=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8,=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B5=D1=83?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/navbar_component.py | 26 ++++++++++++++--------- pages/main_page.py | 4 ++-- tests/e2e/test_expand_navigation_panel.py | 15 +++++++++++-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/components/navbar_component.py b/components/navbar_component.py index 1add89b..68339e9 100644 --- a/components/navbar_component.py +++ b/components/navbar_component.py @@ -46,7 +46,7 @@ class NavigationPanelComponent(BaseComponent): loc = self.get_locator(locator) loc.get_by_text(item_name).click() - def click_sub_item(self, node_root_locator: str | Locator, item_name: str) -> None: + def click_sub_item(self, node_root_locator: str | Locator, item_name: str, parent: None|str) -> None: """Кликает по вложенному элементу с указанным текстом. Args: @@ -54,18 +54,19 @@ class NavigationPanelComponent(BaseComponent): item_name: Текст элемента для клика. """ - def find_and_click_item(page, root_locator, item_name: str) -> bool: + def find_and_click_item(page, root_locator, item_name: str, parent: None|str) -> bool: # Находим все локаторы корневых узлов на текущем уровне root_node = root_locator.locator('>div.v-treeview-node') # Получаем список текстов root_node_texts = root_node.all_inner_texts() # Если искомый элемент находится на данном уровне, вычисляем локатор и делаем клик - for index, node_text in enumerate(root_node_texts): - node_text = node_text.replace("expand_more\n", "") - if item_name == node_text: - root_node.nth(index).click() - return True + if parent is None: + for index, node_text in enumerate(root_node_texts): + node_text = node_text.replace("expand_more\n", "") + if item_name == node_text: + root_node.nth(index).click() + return True # Если элемента нет, рекурсивно ищем дальше nodes_count = root_locator.locator('>div.v-treeview-node').count() @@ -104,9 +105,14 @@ class NavigationPanelComponent(BaseComponent): # Ищем дочерние элементы *внутри* текущего узла if has_children and is_expanded: child_nodes_locator = root_locator.locator(f">div:nth-child({index + 1})").locator('>div.v-treeview-node__children') - is_found = find_and_click_item(page, child_nodes_locator, item_name) + is_found = find_and_click_item(page, child_nodes_locator, item_name, parent=None) if is_found: - return True + if parent is None: + return True + else: + root_texts = root_locator.locator(f">div:nth-child({index + 1})").inner_text().splitlines() + if parent in root_texts: + return True # закрываем узел, если в нем ничего не нашли if is_expanded: @@ -117,7 +123,7 @@ class NavigationPanelComponent(BaseComponent): return False root_locator = self.get_locator(node_root_locator) - found = find_and_click_item(self.page, root_locator, item_name) + found = find_and_click_item(self.page, root_locator, item_name, parent) assert found, f"Navigation panel item {item_name} is missing" def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False): diff --git a/pages/main_page.py b/pages/main_page.py index 0bebeb8..156cae9 100644 --- a/pages/main_page.py +++ b/pages/main_page.py @@ -43,14 +43,14 @@ class MainPage(BasePage): self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name) - def click_subpanel_item(self, item_name: str) -> None: + def click_subpanel_item(self, item_name: str, parent=None) -> None: """Выполняет рекурсивный поиск по панели навигации заданного элемента и делает клик по нему.""" active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER) node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first # Рекурсивный поиск в дереве v-treeview заданного элемента и клик по нему - self.navigation_panel.click_sub_item(node_locator, item_name) + self.navigation_panel.click_sub_item(node_locator, item_name, parent) def click_events_panel_expand_less_button(self) -> None: """Выполняет нажатие кнопки галочка вверх.""" diff --git a/tests/e2e/test_expand_navigation_panel.py b/tests/e2e/test_expand_navigation_panel.py index 5a8e270..99e97da 100644 --- a/tests/e2e/test_expand_navigation_panel.py +++ b/tests/e2e/test_expand_navigation_panel.py @@ -4,6 +4,7 @@ панели навигации в приложении. """ +# import pytest from playwright.sync_api import Page from pages.main_page import MainPage from pages.login_page import LoginPage @@ -50,6 +51,7 @@ class TestNavigationPanel: mp.expand_navigation_subpanel() + # @pytest.mark.develop def test_sub_panel_item_click(self, browser: Page): """Проверяет возможность клика заданного элемента в подпанели навигации. @@ -69,13 +71,22 @@ class TestNavigationPanel: # Проверяем наличие панели навигации mp.should_be_navigation_panel() - # Открываем все пункты панели + # Открываем разные пункты панели mp.click_main_navigation_panel_item("Настройки") mp.click_subpanel_item("Обслуживание и диагностика") mp.click_subpanel_item("Статус обслуживания") - mp.wait_for_timeout(500) + # Открываем/закрываем пункт панели mp.click_subpanel_item("Пользователи") mp.click_subpanel_item("Пользователи") + mp.wait_for_timeout(500) + + # Открываем пункты панели с одинаковыми имнами, но разным расположением + mp.click_subpanel_item("Шаблоны") + mp.wait_for_timeout(500) + + mp.click_subpanel_item("Zero Touch Provisioning") + mp.click_subpanel_item("Шаблоны", parent="Zero Touch Provisioning") + mp.wait_for_timeout(500)