"""Модуль interactive_dropdown_list_component содержит класс для работы с интерактивными выпадающими списками, позволяющими сделать выбор нескольких элементов. Класс InteractiveDropdownList наследует базовый функционал BaseComponent и добавляет методы для взаимодействия с интерактивными выпадающими списками на странице. """ import re from playwright.sync_api import Page, Locator, expect from tools.logger import get_logger from components.base_component import BaseComponent logger = get_logger("INTERACTIVE_DROPDOWN_LIST") class InteractiveDropdownList(BaseComponent): """Класс для работы с выпадающими списками. Наследует функциональность BaseElement и добавляет специфичные методы для выбора и проверки элементов списка. """ def __init__(self, page: Page) -> None: """Инициализирует компонент интерактивного выпадающего списка. Args: page: Экземпляр страницы Playwright. """ super().__init__(page) # Действия: def get_checkbox_locator(self, text: str) -> Locator: """Возвращает локатор чек-бокса для элемента списка с указанным текстом. Args: text (str): Текст элемента для выбора. """ checkbox_locator = self.page.get_by_role("listitem").filter(has_text=text).get_by_role("checkbox") if checkbox_locator.count() > 1: rtext = f"^{text}$" checkbox_locator = self.page.get_by_role("listitem").filter( has_text=re.compile(rtext) ).get_by_role("checkbox") expect(checkbox_locator).to_be_visible(), \ f"Checkbox for dropdown list item with text {text} is missing" return checkbox_locator def deselect_item_with_text(self, text: str) -> None: """Выбирает элемент списка по указанному тексту. Args: text (str): Текст элемента для выбора. """ self.get_checkbox_locator(text).uncheck(force=True) def select_item_with_text(self, text: str) -> None: """Выбирает элемент списка по указанному тексту. Args: text (str): Текст элемента для выбора. """ self.get_checkbox_locator(text).check(force=True) def get_selected_items(self, locator: str|Locator) -> list[str]: """Возвращает список отмеченных элементов.""" selected_items = [] list_locator = self.get_locator(locator) items = list_locator.get_by_role("listitem").all() for item in items: if item.get_by_role("checkbox").is_checked(): item_text = item.text_content().strip() if item_text: selected_items.append(item_text) return selected_items # Проверки: