Загрузка данных
Продолжай работу в существующем skill:
zadanie3/.gigacode/skills/snl-meta-integration-interaction
Перед началом обязательно вызови skill `using-agent-skills` и выбери подходящие навыки для работы с живым браузерным интерфейсом. Используй установленный Playwright/Playwright CLI для исследования реального DOM.
Текущее состояние
Навигация к форме ИВ уже работает:
META meta_home
→ карточка «Интеграционные взаимодействия»
→ форма создания ИВ
Подтверждено:
- форма открывается;
- поле «Выбор АС» найдено;
- поле «Выбор ФП/Модуля/Подмодуля» найдено;
- артефакты сохраняются;
- py_compile проходит;
- offline-тесты 19/19 проходят.
Текущая проблема:
select_discovery_context() и select_ant_select() рассчитаны на Ant Design, однако реальный интерфейс использует Material UI.
Ошибка:
option_not_found
Нужно реализовать универсальный выбор значений в Material UI combobox/autocomplete.
Важно
Для текущего теста выбрать АС:
SberGeo
или реальное полное название варианта, содержащего SberGeo.
Но SberGeo не должен быть захардкожен в основной логике.
В рабочем режиме значение должно браться из YAML:
target:
as_name: "SberGeo"
fp_module_submodule_name: "СНЛ.Интеграции.Аудит"
1. Исследование реального Material UI компонента
На открытой форме исследуй поле «Выбор АС».
Собери:
- tagName поля;
- role;
- aria-label;
- aria-labelledby;
- aria-controls;
- aria-expanded;
- placeholder;
- input value;
- class;
- ближайшие родительские элементы;
- связанный popup/listbox;
- role элементов списка;
- видимые тексты вариантов;
- способ появления списка: click, mouseDown, focus или ArrowDown;
- создаётся ли popup в portal вне модального окна.
Сохрани:
artifacts/discovery/as_combobox_audit.json
artifacts/discovery/as_combobox_audit.md
artifacts/discovery/as_dropdown_open.png
Не использовать предположения по библиотеке. Зафиксировать фактический DOM.
2. Универсальная функция выбора Material UI
Создать общую функцию, используемую и discovery, и fill:
select_material_combobox(
page,
field_label,
requested_value,
*,
exact_required=True
)
Функция должна:
1. найти поле по label, тексту или aria-связям;
2. найти реальный input;
3. прокрутить поле в область видимости;
4. безопасно открыть список;
5. если input допускает поиск:
- очистить текущее значение;
- ввести requested_value;
6. дождаться появления role=listbox или видимого popup;
7. собрать только видимые варианты;
8. сначала искать точное совпадение;
9. затем нормализованное совпадение:
- trim;
- последовательности пробелов заменить одним пробелом;
- сравнение без учёта регистра;
10. не выбирать первый элемент автоматически;
11. не выбирать по индексу;
12. не использовать CSS-класс конкретного варианта;
13. кликнуть только по подтверждённому варианту;
14. после выбора подтвердить, что поле отображает выбранное значение;
15. дождаться обновления зависимых секций формы.
3. Нормализация названий АС
Допускается, что пользователь указывает:
SberGeo
а в выпадающем списке отображается:
Геоинформационная система SberGeo
Алгоритм:
- точное совпадение имеет высший приоритет;
- если точного совпадения нет, разрешить единственное нормализованное совпадение по полному тексту;
- затем разрешить единственное совпадение по отдельному слову/подстроке;
- если подстрочных совпадений несколько — ничего не выбирать.
Статусы:
AS_SELECTED_EXACT
AS_SELECTED_NORMALIZED
AS_SELECTED_UNIQUE_PARTIAL
AMBIGUOUS_AS_MATCH
AS_NOT_FOUND
AS_DROPDOWN_NOT_OPENED
AS_SELECTION_NOT_CONFIRMED
При неоднозначности вывести список найденных вариантов.
4. Не смешивать Ant Design и Material UI
Старую функцию select_ant_select() не использовать для полей реальной формы ИВ.
Можно:
- удалить её из рабочего пути;
- оставить только для обратной совместимости;
- либо сделать общий dispatcher, который сначала определяет тип компонента.
Например:
select_combobox(page, field_label, value)
внутри:
- определить Material UI по role/input/listbox;
- определить Ant Design только при наличии реальных признаков ant-select;
- выбрать соответствующий адаптер.
Не определять библиотеку только по CSS-классу одного родителя.
5. Discovery с SberGeo
Запусти discovery с:
target.as_name = "SberGeo"
После выбора АС необходимо подтвердить:
- значение АС действительно отображается в поле;
- поле ФП/Модуля/Подмодуля стало доступно;
- появились все секции 2–7;
- старое сообщение `option_not_found` исчезло.
После выбора SberGeo собрать повторно полную форму и обновить:
artifacts/discovery/iv_form_after_ac.json
artifacts/discovery/iv_form_fields.json
artifacts/discovery/iv_form_report.md
docs/INTERFACE_REQUIRED.md
Финальную кнопку «Создать» не нажимать.
6. Выбор ФП/модуля/подмодуля
После успешного выбора АС исследовать поле:
«Выбор ФП/Модуля/Подмодуля»
Оно может быть:
- Material UI combobox;
- дерево;
- отдельное модальное окно;
- autocomplete с иерархическими вариантами.
Не предполагать структуру заранее.
Сначала собрать DOM и сохранить:
artifacts/discovery/fp_selector_audit.json
artifacts/discovery/fp_selector_audit.md
artifacts/discovery/fp_selector_open.png
Затем реализовать универсальную функцию:
select_fp_module_submodule(page, object_name)
Требования:
- значение берётся из target.fp_module_submodule_name;
- поддерживается ФП, модуль или подмодуль;
- точное совпадение приоритетно;
- не выбирать по индексу;
- не выбирать первый вариант;
- при неоднозначности завершать с:
AMBIGUOUS_FP_MODULE_MATCH;
- при отсутствии:
FP_MODULE_NOT_FOUND;
- подтверждать выбранное значение после закрытия списка/окна.
7. Discovery не должен создавать объект
Разрешены:
- переход по странице;
- открытие карточки;
- открытие формы;
- открытие dropdown/listbox;
- ввод поискового текста;
- выбор АС;
- выбор ФП/модуля/подмодуля для раскрытия формы;
- прокрутка;
- чтение DOM.
Запрещены:
- нажатие нижней кнопки «Создать»;
- сохранение объекта;
- изменение существующих объектов;
- удаление;
- API-вызовы META.
8. Исправить завершение Playwright
В отчёте сейчас указано:
browser.disconnect(): ZERO
Проверь, что это означает отсутствие неправильных вызовов или отсутствие самого вызова.
Во всех скриптах при подключении через CDP завершение должно быть:
browser.disconnect()
или корректное завершение Playwright-контекста без закрытия пользовательского SberBrowser.
Запрещено:
browser.close()
context.close()
ctx.close()
если это закрывает пользовательскую вкладку или браузер.
В итоговом отчёте явно указать фактический используемый способ отключения.
9. Тесты
Добавить тесты:
- Material UI input найден по label;
- popup создаётся через portal;
- точное совпадение;
- нормализованное совпадение;
- единственное частичное совпадение;
- несколько частичных совпадений;
- вариант не найден;
- список не открылся;
- значение не подтвердилось после клика;
- первый вариант не выбирается автоматически;
- значение берётся из YAML;
- SberGeo не захардкожен;
- другое значение АС проходит тот же алгоритм;
- нижняя кнопка «Создать» не нажимается.
10. Не использовать нестабильные действия
Не использовать в качестве основного механизма:
- page.evaluate с ручным element.click();
- document.querySelector глобально;
- абсолютные координаты;
- индексы элементов;
- классы вида css-abc123;
- sleep как единственный способ ожидания.
Предпочитать:
- get_by_role;
- get_by_label;
- locator по aria;
- role=listbox;
- role=option;
- ожидание видимого состояния;
- ожидание изменения значения поля.
JavaScript допускается только как диагностический fallback, но не как основной рабочий путь.
11. Итоговый отчёт
Покажи:
- реальный DOM-тип поля «Выбор АС»;
- какой locator используется;
- как открывается dropdown;
- список найденных вариантов с SberGeo;
- какой именно вариант выбран;
- каким статусом завершился выбор;
- появилось ли выбранное значение в поле;
- сколько секций появилось после выбора;
- как устроено поле ФП/Модуля/Подмодуля;
- удалось ли выбрать СНЛ.Интеграции.Аудит;
- подтверждение отсутствия hardcode SberGeo;
- подтверждение, что другая АС передаётся через YAML;
- подтверждение, что нижняя кнопка «Создать» не нажималась;
- результат py_compile;
- результат тестов;
- список изменённых файлов.
Не считать задачу выполненной, если:
- только открылась форма;
- поле «Выбор АС» найдено, но значение не выбрано;
- остался статус option_not_found;
- код выбирает SberGeo независимо от YAML;
- не подтверждено появление всех секций после выбора АС.