diff --git a/makers/edit_rack_maker.py b/makers/edit_rack_maker.py index 6cc28f6..27b2cce 100644 --- a/makers/edit_rack_maker.py +++ b/makers/edit_rack_maker.py @@ -646,28 +646,52 @@ class EditRackMaker(ModalWindowComponent): username: str, field_label: str ) -> Tuple[bool, Optional[str]]: - """Добавляет пользователя из выпадающего списка. - - Args: - dropdown_menu: Выпадающее меню. - username: Имя пользователя. - field_label: Название поля. - - Returns: - Кортеж (добавлен ли пользователь, сообщение об ошибке или None). - """ + """Добавляет пользователя из выпадающего списка.""" try: - user_item = dropdown_menu.locator(f"[role='listitem']:has-text('{username}')").first - if user_item.count() == 0: - user_item = dropdown_menu.locator(f"div:has-text('{username}')").first + # Получаем все элементы списка + listitem_locator = dropdown_menu.get_by_role("listitem") - if user_item.count() > 0: - user_item.click() - self.wait_for_timeout(500) - return True, None + # Проверяем, что элементы есть + if listitem_locator.count() == 0: + return False, f"No list items found in dropdown for {field_label}" + + # Прокручиваем к последнему элементу + listitem_locator.last.scroll_into_view_if_needed() + # Ждем, пока последний элемент станет видимым + listitem_locator.last.wait_for(state="visible") + + # Ищем элемент с точным совпадением текста + all_items = listitem_locator.all() + target_item = None + + for item in all_items: + # Ищем span с текстом внутри элемента + span = item.locator("span").first + if span.inner_text().strip() == username: + target_item = item + break + + if target_item is None: + return False, f"User '{username}' not found in dropdown for {field_label}" + + # Проверяем, не выбран ли уже этот пользователь + class_attribute = target_item.get_attribute("class") or "" + + # Если элемент уже выбран (есть класс v-list__tile--active) + if "v-list__tile--active" in class_attribute: + logger.debug(f"User '{username}' is already selected in {field_label}, skipping") + return True, None # Считаем как успех, т.к. пользователь уже есть + + # Прокручиваем к найденному элементу + target_item.scroll_into_view_if_needed() + target_item.wait_for(state="visible") + + # Кликаем + target_item.click() + self.wait_for_timeout(500) + return True, None - return False, f"User '{username}' not found in dropdown for {field_label}" except Exception as e: return False, f"Failed to add user '{username}' to {field_label}: {str(e)}"