17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
-96 | class ConfirmComponent(BaseComponent):
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112 | class ConfirmComponent(BaseComponent):
"""Компонент окна подтверждения действий."""
def __init__(self, page: Page, cancel_button_text: str, allow_button_text: str):
@@ -2355,6 +2527,22 @@
"""Проверяет возможность горизонтальной прокрутки окна."""
return self.is_scrollable_horizontally(ConfirmLocators.CONFIRM)
+
+ def should_be_cancel_button(self) -> None:
+ """Проверяет наличие и видимость кнопки Отмены."""
+ self.cancel_button.check_visibility("Cancel button is missing")
+
+ def should_be_allow_button(self) -> None:
+ """Проверяет наличие и видимость кнопки Подтверждения."""
+ self.allow_button.check_visibility("Allow button is missing")
+
+ def check_cancel_button_text(self, expected_text: str) -> None:
+ """Проверяет текст кнопки Отмены."""
+ self.cancel_button.check_have_text(expected_text, "Cancel button text doesn't match expected")
+
+ def check_allow_button_text(self, expected_text: str) -> None:
+ """Проверяет текст кнопки Подтверждения."""
+ self.allow_button.check_have_text(expected_text, "Allow button text doesn't match expected")
|
@@ -2507,6 +2695,60 @@
+
+ check_allow_button_text(expected_text)
+
+
+
+
+
+
+ Проверяет текст кнопки Подтверждения.
+
+
+
+ Source code in components\confirm_component.py
+ | def check_allow_button_text(self, expected_text: str) -> None:
+ """Проверяет текст кнопки Подтверждения."""
+ self.allow_button.check_have_text(expected_text, "Allow button text doesn't match expected")
+
|
+
+
+
+
+
+
+
+
+
+ check_cancel_button_text(expected_text)
+
+
+
+
+
+
+ Проверяет текст кнопки Отмены.
+
+
+
+ Source code in components\confirm_component.py
+ | def check_cancel_button_text(self, expected_text: str) -> None:
+ """Проверяет текст кнопки Отмены."""
+ self.cancel_button.check_have_text(expected_text, "Cancel button text doesn't match expected")
+
|
+
+
+
+
+
+
+
+
check_text(text, msg)
@@ -2850,6 +3092,60 @@
+
+
+
+
+
+
+
+
+ Проверяет наличие и видимость кнопки Подтверждения.
+
+
+
+ Source code in components\confirm_component.py
+ | def should_be_allow_button(self) -> None:
+ """Проверяет наличие и видимость кнопки Подтверждения."""
+ self.allow_button.check_visibility("Allow button is missing")
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет наличие и видимость кнопки Отмены.
+
+
+
+ Source code in components\confirm_component.py
+ | def should_be_cancel_button(self) -> None:
+ """Проверяет наличие и видимость кнопки Отмены."""
+ self.cancel_button.check_visibility("Cancel button is missing")
+
|
+
+
+
+
+
diff --git a/site/components/dropdown_list_component/index.html b/site/components/dropdown_list_component/index.html
new file mode 100644
index 0000000..949dd50
--- /dev/null
+++ b/site/components/dropdown_list_component/index.html
@@ -0,0 +1,3155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DropdownList - Документация тестов eNODE-Мониторинг
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+DropdownList
+
+
+
+
+
+
+
+
+
+ Модуль dropdown_list_component содержит класс для работы с выпадающими списками.
+ Класс DropdownList наследует базовый функционал BaseComponent и добавляет
+методы для взаимодействия с выпадающими списками на странице.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DropdownList
+
+
+
+
+
+
+
+ Bases: BaseComponent
+
+
+ Класс для работы с выпадающими списками.
+ Наследует функциональность BaseElement и добавляет специфичные
+методы для выбора и проверки элементов списка.
+
+
+
+
+
+
+
+
+ Source code in components\dropdown_list_component.py
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134 | class DropdownList(BaseComponent):
+ """Класс для работы с выпадающими списками.
+
+ Наследует функциональность BaseElement и добавляет специфичные
+ методы для выбора и проверки элементов списка.
+ """
+
+ def __init__(self, page: Page):
+ """Инициализирует компонент выпадающего списка.
+
+ Args:
+ page: Экземпляр страницы Playwright.
+ """
+
+ super().__init__(page)
+
+ # Действия:
+ def click_item_with_text(self, text: str) -> None:
+ """Выбирает элемент списка по указанному тексту.
+
+ Args:
+ text (str): Текст элемента для выбора.
+ """
+
+ element = self.page.get_by_role("listitem").filter(has_text=text)
+ if element.count() > 1:
+ rtext = f"^{text}$"
+ element = self.page.get_by_role("listitem").filter(has_text=re.compile(rtext))
+ element.click()
+
+ def get_item_names(self, locator: str | Locator) -> list[str]:
+ """Возвращает тексты всех элементов по указанному локатору.
+
+ Args:
+ locator: Локатор элементов или строка с CSS/XPath.
+
+ Returns:
+ Список текстов элементов.
+ """
+
+ loc = self.get_locator(locator)
+ texts = loc.all_inner_texts()
+ return texts[0].splitlines()
+
+ def scroll_until_end(self, locator: str | Locator) -> None:
+ """
+ Скроллит список до тех пор, пока не перестанут подгружаться новые элементы.
+
+ Args:
+ locator: Локатор элементов или строка с CSS/XPath.
+ """
+
+ loc = self.get_locator(locator)
+
+ items_count = 0
+ attempts = 0
+ max_attempts = 3
+ last_item_name = ""
+
+ while attempts < max_attempts:
+ self.page.wait_for_timeout(300)
+
+ item_names = self.get_item_names(loc)
+ current_count = len(item_names)
+
+ if current_count == items_count:
+ attempts += 1
+ else:
+ items_count = current_count
+ attempts = 0
+
+ last_item_name = item_names[current_count-1]
+ element = self.page.get_by_role("listitem").filter(has_text=last_item_name)
+ element.scroll_into_view_if_needed()
+
+ self.page.wait_for_timeout(300)
+ self.check_item_with_text(last_item_name)
+
+ # Проверки:
+ def check_item_with_text(self, text: str) -> None:
+ """Проверяет наличие и доступность элемента списка.
+
+ Args:
+ text (str): Текст элемента для проверки.
+
+ Raises:
+ AssertionError: Если элемент отсутствует или недоступен.
+ """
+
+ element = self.page.get_by_role("listitem").filter(has_text=text)
+ if element.count() > 1:
+ rtext = f"^{text}$"
+ element = self.page.get_by_role("listitem").filter(has_text=re.compile(rtext))
+ enabled = element.is_enabled()
+ if not enabled:
+ assert False, f"Dropdown list item '{text}' is missing or disabled"
+
+ def check_vertical_scrolling(self, locator: str | Locator) -> bool:
+ """
+ Проверяет функцию вертикального скроллинга списка.
+
+ Args:
+ locator: Локатор элементов или строка с CSS/XPath.
+
+ Returns:
+ True или False значение в зависимости от скроллируемый список или нет.
+ """
+
+ loc = self.get_locator(locator)
+
+ is_scrollable_vertically = self.is_scrollable_vertically(loc)
+ if is_scrollable_vertically:
+ self.scroll_until_end(loc)
+
+ item_names = self.get_item_names(loc)
+ first_item_name = item_names[0]
+
+ self.scroll_up(loc)
+ self.page.wait_for_timeout(300)
+ self.check_item_with_text(first_item_name)
+
+ return is_scrollable_vertically
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ __init__(page)
+
+
+
+
+
+
+ Инициализирует компонент выпадающего списка.
+
+
+ Parameters:
+
+
+
+ | Name |
+ Type |
+ Description |
+ Default |
+
+
+
+
+
+ page
+ |
+
+ Page
+ |
+
+
+ Экземпляр страницы Playwright.
+
+ |
+
+ required
+ |
+
+
+
+
+
+
+ Source code in components\dropdown_list_component.py
+ 20
+21
+22
+23
+24
+25
+26
+27 | def __init__(self, page: Page):
+ """Инициализирует компонент выпадающего списка.
+
+ Args:
+ page: Экземпляр страницы Playwright.
+ """
+
+ super().__init__(page)
+
|
+
+
+
+
+
+
+
+
+
+ check_item_with_text(text)
+
+
+
+
+
+
+ Проверяет наличие и доступность элемента списка.
+
+
+ Parameters:
+
+
+
+ | Name |
+ Type |
+ Description |
+ Default |
+
+
+
+
+
+ text
+ |
+
+ str
+ |
+
+
+ Текст элемента для проверки.
+
+ |
+
+ required
+ |
+
+
+
+
+
+ Raises:
+
+
+
+ | Type |
+ Description |
+
+
+
+
+
+ AssertionError
+ |
+
+
+ Если элемент отсутствует или недоступен.
+
+ |
+
+
+
+
+
+
+ Source code in components\dropdown_list_component.py
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108 | def check_item_with_text(self, text: str) -> None:
+ """Проверяет наличие и доступность элемента списка.
+
+ Args:
+ text (str): Текст элемента для проверки.
+
+ Raises:
+ AssertionError: Если элемент отсутствует или недоступен.
+ """
+
+ element = self.page.get_by_role("listitem").filter(has_text=text)
+ if element.count() > 1:
+ rtext = f"^{text}$"
+ element = self.page.get_by_role("listitem").filter(has_text=re.compile(rtext))
+ enabled = element.is_enabled()
+ if not enabled:
+ assert False, f"Dropdown list item '{text}' is missing or disabled"
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет функцию вертикального скроллинга списка.
+
+
+ Parameters:
+
+
+
+ | Name |
+ Type |
+ Description |
+ Default |
+
+
+
+
+
+ locator
+ |
+
+ str | Locator
+ |
+
+
+ Локатор элементов или строка с CSS/XPath.
+
+ |
+
+ required
+ |
+
+
+
+
+
+ Returns:
+
+
+
+ | Type |
+ Description |
+
+
+
+
+
+ bool
+ |
+
+
+ True или False значение в зависимости от скроллируемый список или нет.
+
+ |
+
+
+
+
+
+
+ Source code in components\dropdown_list_component.py
+ 110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134 | def check_vertical_scrolling(self, locator: str | Locator) -> bool:
+ """
+ Проверяет функцию вертикального скроллинга списка.
+
+ Args:
+ locator: Локатор элементов или строка с CSS/XPath.
+
+ Returns:
+ True или False значение в зависимости от скроллируемый список или нет.
+ """
+
+ loc = self.get_locator(locator)
+
+ is_scrollable_vertically = self.is_scrollable_vertically(loc)
+ if is_scrollable_vertically:
+ self.scroll_until_end(loc)
+
+ item_names = self.get_item_names(loc)
+ first_item_name = item_names[0]
+
+ self.scroll_up(loc)
+ self.page.wait_for_timeout(300)
+ self.check_item_with_text(first_item_name)
+
+ return is_scrollable_vertically
+
|
+
+
+
+
+
+
+
+
+
+ click_item_with_text(text)
+
+
+
+
+
+
+ Выбирает элемент списка по указанному тексту.
+
+
+ Parameters:
+
+
+
+ | Name |
+ Type |
+ Description |
+ Default |
+
+
+
+
+
+ text
+ |
+
+ str
+ |
+
+
+ Текст элемента для выбора.
+
+ |
+
+ required
+ |
+
+
+
+
+
+
+ Source code in components\dropdown_list_component.py
+ 30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41 | def click_item_with_text(self, text: str) -> None:
+ """Выбирает элемент списка по указанному тексту.
+
+ Args:
+ text (str): Текст элемента для выбора.
+ """
+
+ element = self.page.get_by_role("listitem").filter(has_text=text)
+ if element.count() > 1:
+ rtext = f"^{text}$"
+ element = self.page.get_by_role("listitem").filter(has_text=re.compile(rtext))
+ element.click()
+
|
+
+
+
+
+
+
+
+
+
+ get_item_names(locator)
+
+
+
+
+
+
+ Возвращает тексты всех элементов по указанному локатору.
+
+
+ Parameters:
+
+
+
+ | Name |
+ Type |
+ Description |
+ Default |
+
+
+
+
+
+ locator
+ |
+
+ str | Locator
+ |
+
+
+ Локатор элементов или строка с CSS/XPath.
+
+ |
+
+ required
+ |
+
+
+
+
+
+ Returns:
+
+
+
+ | Type |
+ Description |
+
+
+
+
+
+ list[str]
+ |
+
+
+ Список текстов элементов.
+
+ |
+
+
+
+
+
+
+ Source code in components\dropdown_list_component.py
+ 43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55 | def get_item_names(self, locator: str | Locator) -> list[str]:
+ """Возвращает тексты всех элементов по указанному локатору.
+
+ Args:
+ locator: Локатор элементов или строка с CSS/XPath.
+
+ Returns:
+ Список текстов элементов.
+ """
+
+ loc = self.get_locator(locator)
+ texts = loc.all_inner_texts()
+ return texts[0].splitlines()
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Скроллит список до тех пор, пока не перестанут подгружаться новые элементы.
+
+
+ Parameters:
+
+
+
+ | Name |
+ Type |
+ Description |
+ Default |
+
+
+
+
+
+ locator
+ |
+
+ str | Locator
+ |
+
+
+ Локатор элементов или строка с CSS/XPath.
+
+ |
+
+ required
+ |
+
+
+
+
+
+
+ Source code in components\dropdown_list_component.py
+ 57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89 | def scroll_until_end(self, locator: str | Locator) -> None:
+ """
+ Скроллит список до тех пор, пока не перестанут подгружаться новые элементы.
+
+ Args:
+ locator: Локатор элементов или строка с CSS/XPath.
+ """
+
+ loc = self.get_locator(locator)
+
+ items_count = 0
+ attempts = 0
+ max_attempts = 3
+ last_item_name = ""
+
+ while attempts < max_attempts:
+ self.page.wait_for_timeout(300)
+
+ item_names = self.get_item_names(loc)
+ current_count = len(item_names)
+
+ if current_count == items_count:
+ attempts += 1
+ else:
+ items_count = current_count
+ attempts = 0
+
+ last_item_name = item_names[current_count-1]
+ element = self.page.get_by_role("listitem").filter(has_text=last_item_name)
+ element.scroll_into_view_if_needed()
+
+ self.page.wait_for_timeout(300)
+ self.check_item_with_text(last_item_name)
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/components/eventbar_component/index.html b/site/components/eventbar_component/index.html
new file mode 100644
index 0000000..7b454dc
--- /dev/null
+++ b/site/components/eventbar_component/index.html
@@ -0,0 +1,3254 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EventPanelComponent - Документация тестов eNODE-Мониторинг
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+EventPanelComponent
+
+
+
+
+
+
+
+
+
+ Модуль компонента панели событий. Содержит класс для работы с элементами панели.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EventPanelComponent
+
+
+
+
+
+
+
+ Bases: BaseComponent
+
+
+ Компонент панели событий. Предоставляет методы для взаимодействия с ней.
+
+
+
+
+
+
+
+
+ Source code in components\eventbar_component.py
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151 | class EventPanelComponent(BaseComponent):
+ """Компонент панели событий. Предоставляет методы для взаимодействия с ней."""
+
+ def __init__(self, page: Page):
+ """Инициализирует компонент панели событий.
+
+ Args:
+ page: Экземпляр страницы Playwright.
+ """
+
+ super().__init__(page)
+
+ self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), "states_tab")
+ self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), "actions_tab")
+ self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), "events_tab")
+ self.maintenance_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_MAINTENANCE), "maintenance_tab")
+ self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), "system_log_tab")
+
+ self.unknown_reason_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), "unknown_reason_button")
+ self.warning_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), "warning_button")
+ self.damage_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), "damage_button")
+ self.failure_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), "failure_button")
+
+ buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button").all()
+ self.search_button = Button(page, buttons_service_locators[0], "search_button")
+ self.user_button = Button(page, buttons_service_locators[1], "user_button")
+
+ self.user_card = CardComponent(page)
+
+ # Действия:
+ def click_expand_less_button(self) -> None:
+ """Выполняет нажатие кнопки галочка вверх."""
+
+ button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_less')
+ button_locator.click()
+
+ def click_expand_more_button(self) -> None:
+ """Выполняет нажатие кнопки галочка вниз."""
+
+ button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_more')
+ button_locator.click()
+
+ def do_logout(self) -> None:
+ """Выполняет выход из системы."""
+
+ self.should_be_user_button()
+ self.user_button.click()
+ self.user_card.click_logout_button()
+
+ def get_event_tooltip_texts(self) -> []:
+ """Возвращает список текстов всплывающих подсказок кнопок счетчиков событий."""
+
+ tooltip_texts = []
+
+ tooltip_texts.append(self.unknown_reason_button.get_tooltip_text())
+ tooltip_texts.append(self.warning_button.get_tooltip_text())
+ tooltip_texts.append(self.damage_button.get_tooltip_text())
+ tooltip_texts.append(self.failure_button.get_tooltip_text())
+
+ return tooltip_texts
+
+ def get_event_button_values(self) -> {}:
+ """Возвращает набор значений кнопок счетчиков событий."""
+
+ event_buttons_texts = {}
+
+ event_buttons_texts['Неизвестно'] = self.unknown_reason_button.get_text(0)
+ event_buttons_texts['Предупреждение'] = self.warning_button.get_text(0)
+ event_buttons_texts['Повреждение'] = self.damage_button.get_text(0)
+ event_buttons_texts['Авария'] = self.failure_button.get_text(0)
+
+ return event_buttons_texts
+
+ def get_panel_position(self) -> str:
+ """Возвращает текущее положение панели событий относительно страницы: "top", "center","bottom"."""
+
+ style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute("style")
+ position = "bottom"
+
+ if style_attr.find("display: none;") == -1:
+ height = style_attr.replace("height: ","").replace(";", "")
+ if height == "100%":
+ position = "top"
+ else:
+ position = "center"
+
+ return position
+
+ # Проверки:
+ def check_expand_less_button(self) -> bool:
+ """Проверяет наличие кнопки галочка вверх."""
+
+ try:
+ _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_less')
+ except TimeoutError:
+ return False
+ return True
+
+ def check_expand_more_button(self) -> bool:
+ """Проверяет наличие кнопки галочка вниз"""
+
+ try:
+ _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_more')
+ except TimeoutError:
+ return False
+ return True
+
+ def should_be_user_button(self) -> None:
+ """Проверяет наличие кнопки пользователя."""
+
+ self.user_button.check_visibility("User button is missing on event panel")
+
+ def should_be_search_button(self) -> None:
+ """Проверяет наличие кнопки поиска."""
+
+ self.search_button.check_visibility("Search button is missing on event panel")
+
+ def should_be_tab_buttons(self) -> None:
+ """Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал."""
+
+ self.states_tab.check_have_text('Состояния', "Tab button with text Состояния is missing on event panel")
+ self.actions_tab.check_have_text('Действия',"Tab button with text Действия is missing on event panel")
+ self.events_tab.check_have_text('События', "Tab button with text События is missing on event panel")
+ self.maintenance_tab.check_have_text('Обслуживание', "Tab button with text Обслуживание is missing on event panel")
+ self.system_log_tab.check_have_text('Системный журнал', "Tab button with text Системный журнал is missing on event panel")
+
+ def should_be_event_buttons(self) -> None:
+ """Проверяет наличие блока кнопок-счетчиков событий."""
+
+ self.unknown_reason_button.check_visibility("Unknown reason event button is missing on event panel")
+ self.warning_button.check_visibility("Warning event button is missing on event panel")
+ self.damage_button.check_visibility("Damage event button is missing on event panel")
+ self.failure_button.check_visibility("Failure event button is missing on event panel")
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ __init__(page)
+
+
+
+
+
+
+ Инициализирует компонент панели событий.
+
+
+ Parameters:
+
+
+
+ | Name |
+ Type |
+ Description |
+ Default |
+
+
+
+
+
+ page
+ |
+
+ Page
+ |
+
+
+ Экземпляр страницы Playwright.
+
+ |
+
+ required
+ |
+
+
+
+
+
+
+ Source code in components\eventbar_component.py
+ 18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42 | def __init__(self, page: Page):
+ """Инициализирует компонент панели событий.
+
+ Args:
+ page: Экземпляр страницы Playwright.
+ """
+
+ super().__init__(page)
+
+ self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), "states_tab")
+ self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), "actions_tab")
+ self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), "events_tab")
+ self.maintenance_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_MAINTENANCE), "maintenance_tab")
+ self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), "system_log_tab")
+
+ self.unknown_reason_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), "unknown_reason_button")
+ self.warning_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), "warning_button")
+ self.damage_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), "damage_button")
+ self.failure_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), "failure_button")
+
+ buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button").all()
+ self.search_button = Button(page, buttons_service_locators[0], "search_button")
+ self.user_button = Button(page, buttons_service_locators[1], "user_button")
+
+ self.user_card = CardComponent(page)
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет наличие кнопки галочка вверх.
+
+
+
+ Source code in components\eventbar_component.py
+ 106
+107
+108
+109
+110
+111
+112
+113
+114 | def check_expand_less_button(self) -> bool:
+ """Проверяет наличие кнопки галочка вверх."""
+
+ try:
+ _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_less')
+ except TimeoutError:
+ return False
+ return True
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет наличие кнопки галочка вниз
+
+
+
+ Source code in components\eventbar_component.py
+ 116
+117
+118
+119
+120
+121
+122
+123
+124 | def check_expand_more_button(self) -> bool:
+ """Проверяет наличие кнопки галочка вниз"""
+
+ try:
+ _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_more')
+ except TimeoutError:
+ return False
+ return True
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Выполняет нажатие кнопки галочка вверх.
+
+
+
+ Source code in components\eventbar_component.py
+ | def click_expand_less_button(self) -> None:
+ """Выполняет нажатие кнопки галочка вверх."""
+
+ button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_less')
+ button_locator.click()
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Выполняет нажатие кнопки галочка вниз.
+
+
+
+ Source code in components\eventbar_component.py
+ | def click_expand_more_button(self) -> None:
+ """Выполняет нажатие кнопки галочка вниз."""
+
+ button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
+ get_by_role("button").filter(has_text='expand_more')
+ button_locator.click()
+
|
+
+
+
+
+
+
+
+
+
+ do_logout()
+
+
+
+
+
+
+ Выполняет выход из системы.
+
+
+
+ Source code in components\eventbar_component.py
+ | def do_logout(self) -> None:
+ """Выполняет выход из системы."""
+
+ self.should_be_user_button()
+ self.user_button.click()
+ self.user_card.click_logout_button()
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Возвращает набор значений кнопок счетчиков событий.
+
+
+
+ Source code in components\eventbar_component.py
+ 78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88 | def get_event_button_values(self) -> {}:
+ """Возвращает набор значений кнопок счетчиков событий."""
+
+ event_buttons_texts = {}
+
+ event_buttons_texts['Неизвестно'] = self.unknown_reason_button.get_text(0)
+ event_buttons_texts['Предупреждение'] = self.warning_button.get_text(0)
+ event_buttons_texts['Повреждение'] = self.damage_button.get_text(0)
+ event_buttons_texts['Авария'] = self.failure_button.get_text(0)
+
+ return event_buttons_texts
+
|
+
+
+
+
+
+
+
+
+
+ get_event_tooltip_texts()
+
+
+
+
+
+
+ Возвращает список текстов всплывающих подсказок кнопок счетчиков событий.
+
+
+
+ Source code in components\eventbar_component.py
+ 66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76 | def get_event_tooltip_texts(self) -> []:
+ """Возвращает список текстов всплывающих подсказок кнопок счетчиков событий."""
+
+ tooltip_texts = []
+
+ tooltip_texts.append(self.unknown_reason_button.get_tooltip_text())
+ tooltip_texts.append(self.warning_button.get_tooltip_text())
+ tooltip_texts.append(self.damage_button.get_tooltip_text())
+ tooltip_texts.append(self.failure_button.get_tooltip_text())
+
+ return tooltip_texts
+
|
+
+
+
+
+
+
+
+
+
+ get_panel_position()
+
+
+
+
+
+
+ Возвращает текущее положение панели событий относительно страницы: "top", "center","bottom".
+
+
+
+ Source code in components\eventbar_component.py
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103 | def get_panel_position(self) -> str:
+ """Возвращает текущее положение панели событий относительно страницы: "top", "center","bottom"."""
+
+ style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute("style")
+ position = "bottom"
+
+ if style_attr.find("display: none;") == -1:
+ height = style_attr.replace("height: ","").replace(";", "")
+ if height == "100%":
+ position = "top"
+ else:
+ position = "center"
+
+ return position
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет наличие блока кнопок-счетчиков событий.
+
+
+
+ Source code in components\eventbar_component.py
+ 145
+146
+147
+148
+149
+150
+151 | def should_be_event_buttons(self) -> None:
+ """Проверяет наличие блока кнопок-счетчиков событий."""
+
+ self.unknown_reason_button.check_visibility("Unknown reason event button is missing on event panel")
+ self.warning_button.check_visibility("Warning event button is missing on event panel")
+ self.damage_button.check_visibility("Damage event button is missing on event panel")
+ self.failure_button.check_visibility("Failure event button is missing on event panel")
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет наличие кнопки поиска.
+
+
+
+ Source code in components\eventbar_component.py
+ | def should_be_search_button(self) -> None:
+ """Проверяет наличие кнопки поиска."""
+
+ self.search_button.check_visibility("Search button is missing on event panel")
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал.
+
+
+
+ Source code in components\eventbar_component.py
+ 136
+137
+138
+139
+140
+141
+142
+143 | def should_be_tab_buttons(self) -> None:
+ """Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал."""
+
+ self.states_tab.check_have_text('Состояния', "Tab button with text Состояния is missing on event panel")
+ self.actions_tab.check_have_text('Действия',"Tab button with text Действия is missing on event panel")
+ self.events_tab.check_have_text('События', "Tab button with text События is missing on event panel")
+ self.maintenance_tab.check_have_text('Обслуживание', "Tab button with text Обслуживание is missing on event panel")
+ self.system_log_tab.check_have_text('Системный журнал', "Tab button with text Системный журнал is missing on event panel")
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Проверяет наличие кнопки пользователя.
+
+
+
+ Source code in components\eventbar_component.py
+ | def should_be_user_button(self) -> None:
+ """Проверяет наличие кнопки пользователя."""
+
+ self.user_button.check_visibility("User button is missing on event panel")
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/components/json_container_component/index.html b/site/components/json_container_component/index.html
index cfada4f..0bae0e0 100644
--- a/site/components/json_container_component/index.html
+++ b/site/components/json_container_component/index.html
@@ -9,7 +9,7 @@
-
+
@@ -378,6 +378,195 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -390,10 +579,10 @@
-
+
- | def check_button_presence(self, name: str) -> None:
+113
| def check_button_visibility(self, name: str) -> None:
"""Проверяет наличие кнопки по имени. Вызывает ошибку, если не найдена."""
button = self.get_button_by_name(name)
if button is None:
assert False, f"Button with name '{name}' not found"
- button.check_presence(f"Button with name '{name}' is missing")
+ button.check_visibility(f"Button with name '{name}' is missing")
|