Files
portal/bots/yandex-creatives/docs/cabinet-flow.md
T
Дмитрий 5b8813b033 docs робот креативов: разметка экранов загрузки в кабинете Директа
Снято живьём вместе с владельцем в кабинете sasha261185, кампания 713051718.
Ничего не сохранялось и не создавалось: до и после — те же 15 объявлений,
кнопки «Сохранить изменения» и «Создать» не нажимались.

Ключевое для задачи 14: системное окно выбора файла роботу не нужно —
в форме есть input type=file с data-testid CreativeActionsMenu.FileInput,
принимает png/jpeg/gif и сразу несколько файлов. Весь путь до окна загрузки
проверен программным прогоном, окно открылось.

Подтверждено живьём: конструктор креативов закрыт, Яндекс пишет это сам;
у всех 15 креативов имя «Новый креатив», потому что поле имени одно на всю
загрузку — опознание по разнице слепков и размеру остаётся единственным
надёжным способом.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 17:41:56 +03:00

12 KiB
Raw Blame History

Разметка кабинета Яндекс Директа — экраны загрузки креативов

Снято живьём 27.07.2026 в боевом кабинете sasha261185 вместе с владельцем. Ничего не сохранялось, ничего не создавалось: до и после — ровно 15 объявлений в группе 5776749172, кнопка «Сохранить изменения» не нажималась ни разу.

Источник задачи — план docs/superpowers/plans/2026-07-27-yandex-creative-robot.md, Task 11. Снимок экрана — docs/superpowers/findings/2026-07-27-yandex-konstruktor-zakryt/2026-07-27-ekran-zagruzki-kreativov.png (боковая панель на снимке намеренно скрыта: в кадр попадали логин и остаток счёта).


0. Главный вывод для Task 14

Системное окно «Выберите файл» роботу не нужно. В форме объявления лежит обычное <input type="file"> с data-testid="CreativeActionsMenu.FileInput", accept="image/png,image/jpeg,image/jpg,image/gif", multiple. Playwright кладёт файлы прямо в него (locator.setInputFiles), диалог операционной системы не открывается.

Весь путь до окна загрузки проходится программно — проверено живьём: последовательность кликов ниже была выполнена скриптом, окно открылось.


1. Признак «вход в кабинет жив»

Что Значение
Страница проверки https://direct.yandex.ru/wizard/overview/?ulogin=<логин>
Устойчивый признак элемент [data-testid="Sidebar.BalanceExpanded"] — блок баланса с кнопкой «Пополнить»
Запасной признак [data-testid="SidebarUserControl"] — содержит текст логина
Признак «вход слетел» адрес после перехода начинается с https://passport.yandex.ru/ или блок баланса не появился за 15 с

Проверять оба условия: редирект на passport.yandex.ru — самый надёжный сигнал, отсутствие блока баланса ловит случай «страница отдалась, но кабинет не авторизован».


2. Путь до окна загрузки

Все шаги — на одной странице, переходов между адресами внутри пути нет.

Шаг 1. Открыть форму нового объявления

https://direct.yandex.ru/dna/banners-edit?ulogin=<логин>&campaigns-ids=<номер кампании>&groups-ids=<номер группы>&is-new=1
  • Успех: появился [data-testid="BannersEditPage"], внутри — заголовок «Баннер» и метка «Черновик».
  • Ждать: до 20 с (форма догружается отдельно от каркаса страницы, каркас появляется раньше).

🔴 Почему именно форма НОВОГО объявления, а не существующего. Пока не нажата «Сохранить изменения», в кабинете ничего не появляется. Робот использует эту форму только как «прихожую» к окну загрузки: он грузит креативы и уходит, объявление не создаётся. Лезть в существующее живое объявление нельзя — там можно случайно испортить работающую рекламу.

Шаг 2. Открыть меню креатива

  • Кнопка: [data-testid="ImageCreativeEditor.OpenMenu"] — подпись «Добавить», внутри блока [data-testid="ImageCreativeEditor"] (заголовок «Креатив»).
  • Успех: появилось меню с заголовком «Готовые креативы HTML5».
  • Ждать: до 5 с.

Шаг 3. Выбрать «Загрузить креативы»

Пункты меню:

Подпись Селектор
Загрузить креативы [data-testid="ImageCreativeEditor.Menu.add-html5"]
Выбрать из ранее загруженных тот же префикс ImageCreativeEditor.Menu.*; роботу не нужен
  • Успех: появилось окно [data-testid="CanvasModal.html5"].
  • Ждать: до 10 с.

Шаг 4. Окно загрузки

Содержимое окна [data-testid="CanvasModal.html5"]:

Элемент Селектор Заметка
Вкладки role="tab" с именами «Мои креативы» / «Загрузить» / «Архивные» своих data-testid у вкладок нет — искать по роли и имени; «Загрузить» выбрана по умолчанию, переключать не надо
Имя будущего креатива [data-testid="CanvasNameLabel"] текст «Новый креатив»
Карандашик «переименовать» кнопка [data-testid="Button"] внутри CanvasNameLabel, класс canvas-editable-label__btn_action_edit-name см. §4
Площадка «перетащите файлы» текст «Перетащите файлы с баннерами сюда»
Кнопка «Загрузить» [data-testid="Html5Dropzone.UploadButton"] — это div, не button роботу не нужна: он кладёт файлы прямо в input
Поле файлов [data-testid="CreativeActionsMenu.FileInput"] accept="image/png,image/jpeg,image/jpg,image/gif", multiple
Кнопка «Создать» [data-testid="CanvasFooter.SubmitButton"] серая, пока не выбраны файлы — это и есть проверка «файлы приняты»
Кнопка «Отмена» [data-testid="CanvasFooter.CancelButton"] — это div
Крестик «закрыть» [data-testid="CanvasModal.html5.CloseButton"]

Внутри окна есть второй input[type=file] (у площадки перетаскивания) — без data-testid и без accept. Робот должен работать именно с CreativeActionsMenu.FileInput, отбор по data-testid, не «первый попавшийся input».

Шаг 5. Что означает успех загрузки

Порядок проверок для робота:

  1. После setInputFiles — дождаться, что [data-testid="CanvasFooter.SubmitButton"] перестал быть заблокированным (disabled снят). Это признак «Яндекс файлы принял».
  2. Нажать «Создать».
  3. Успех создания подтверждать не по экрану, а по API: портал берёт слепок creatives.get и сверяет разницу (см. CreativeIdMatcher). Экран может соврать, слепок — нет.

⚠️ Не измерено на живом (файлов не грузили, чтобы ничего не создавать): сколько ждать обработки после «Создать» и как выглядит ошибка «файл не подошёл». Это добирается в Task 14 на первом настоящем прогоне, до включения рубильника.

Шаг 6. Уход без следа

Закрыть окно крестиком и уйти со страницы, не нажимая [data-testid="SaveBannerButton"] («Сохранить изменения»). Черновик объявления никуда не сохраняется.

🔴 SaveBannerButton — единственная кнопка на этом пути, которая меняет кабинет. Робот не должен нажимать её никогда.


3. Что подтвердилось живьём

  • Конструктор креативов закрыт. Яндекс сам пишет это в форме, блок [data-testid="CreativeCanvasSunsetNotice"]: «Конструктор креативов закрылся 1 июня. С 30 июня показы объявлений с креативами, созданными через конструктор, остановлены».
  • Медийная кампания = объявление на каждый размер. В группе 5776749172 кампании 713051718 — ровно 15 объявлений, номера 1778669252217786692536, размеры: 336×280, 480×320, 160×600, 320×50, 320×100, 300×250, 320×480, 300×500, 970×250, 1000×120, 240×600, 240×400, 728×90, 300×300, 300×600.
  • Имена для опознания не годятся. У всех 15 подпись «Новый креатив» — это имя по умолчанию из поля CanvasNameLabel, и оно одно на всю загрузку: владелец залил все файлы разом, поэтому имя у всех совпало. Опознание по разнице слепков и размеру остаётся единственным надёжным способом.
  • Список объявлений в левой колонке формы: [data-testid="NavigationItem.Banner.<номер>"], текст вида «336x280, Новый креатив».

4. Открытый вопрос — имя креатива можно задавать

У поля имени есть карандашик (canvas-editable-label__btn_action_edit-name), то есть креатив можно назвать своим именем — например liderra-<кампания>-300x250. Если грузить по одному файлу за раз и каждому давать своё имя, опознание стало бы прямым, без сверки слепков.

Решение не принято, ядро не трогаем. Сверка слепков уже написана, покрыта тестами и работает; переход на имена — это переделка готового куска ради удобства. Записано как возможность, решать владельцу. Минусы перехода: грузить придётся по одному файлу вместо пачки (дольше), и мы начнём зависеть от того, что Яндекс не подрежет и не подменит наше имя.


5. Чего этот файл НЕ покрывает

  • Поведение при ошибке загрузки (файл не тех размеров, слишком тяжёлый) — не проверялось.
  • Сколько живёт вход в кабинет без действий — не проверялось.
  • Лимиты Яндекса на число креативов и темп загрузки — не проверялись.
  • Что происходит с уже загруженными креативами при перезаливке набора — открытый вопрос спеки §10.