Загрузка данных


Продолжай работу в существующем 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;
- не подтверждено появление всех секций после выбора АС.