From 06e680675c92246cb59ba14d2740b2f538e7a47e Mon Sep 17 00:00:00 2001 From: Radislav Date: Fri, 24 Apr 2026 08:08:22 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B2=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=D1=85=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B9=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен скроллинг в выпадающем списке - Исправлено частичное совпадение имен пользователей - Добавлена проверка на уже выбранных пользователей --- makers/edit_rack_maker.py | 60 +++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 18 deletions(-) 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)}"