Снято живьём вместе с владельцем в кабинете sasha261185, кампания 713051718. Ничего не сохранялось и не создавалось: до и после — те же 15 объявлений, кнопки «Сохранить изменения» и «Создать» не нажимались. Ключевое для задачи 14: системное окно выбора файла роботу не нужно — в форме есть input type=file с data-testid CreativeActionsMenu.FileInput, принимает png/jpeg/gif и сразу несколько файлов. Весь путь до окна загрузки проверен программным прогоном, окно открылось. Подтверждено живьём: конструктор креативов закрыт, Яндекс пишет это сам; у всех 15 креативов имя «Новый креатив», потому что поле имени одно на всю загрузку — опознание по разнице слепков и размеру остаётся единственным надёжным способом. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
12 KiB
Разметка кабинета Яндекс Директа — экраны загрузки креативов
Снято живьём 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. Что означает успех загрузки
Порядок проверок для робота:
- После
setInputFiles— дождаться, что[data-testid="CanvasFooter.SubmitButton"]перестал быть заблокированным (disabledснят). Это признак «Яндекс файлы принял». - Нажать «Создать».
- Успех создания подтверждать не по экрану, а по API: портал берёт слепок
creatives.getи сверяет разницу (см.CreativeIdMatcher). Экран может соврать, слепок — нет.
⚠️ Не измерено на живом (файлов не грузили, чтобы ничего не создавать): сколько ждать обработки после «Создать» и как выглядит ошибка «файл не подошёл». Это добирается в Task 14 на первом настоящем прогоне, до включения рубильника.
Шаг 6. Уход без следа
Закрыть окно крестиком и уйти со страницы, не нажимая [data-testid="SaveBannerButton"]
(«Сохранить изменения»). Черновик объявления никуда не сохраняется.
🔴 SaveBannerButton — единственная кнопка на этом пути, которая меняет кабинет.
Робот не должен нажимать её никогда.
3. Что подтвердилось живьём
- Конструктор креативов закрыт. Яндекс сам пишет это в форме, блок
[data-testid="CreativeCanvasSunsetNotice"]: «Конструктор креативов закрылся 1 июня. С 30 июня показы объявлений с креативами, созданными через конструктор, остановлены». - Медийная кампания = объявление на каждый размер. В группе
5776749172кампании713051718— ровно 15 объявлений, номера17786692522–17786692536, размеры: 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.