JavaRush /Курси /Claude Code SELF /Агент за дошкою: Playwright і /goal

Агент за дошкою: Playwright і /goal

Claude Code SELF
Рівень 9 , Лекція 3
Відкрита

1. Чого агент іще не вмів: торкатися живої сторінки

Гра вже готова: справжні шахи на chess.js, усі сім пунктів проходять, мітки для агента на місці. Тьома приходить до Льохи з цим — і одразу з підступом:

— Слухай, окей. Гра є, мітки є, за кого агент гратиме — вирішили. Але рухати-то фігури руками хто буде? Агент же живе в терміналі — як він потрапить до моєї дошки в браузері? Я що, за нього мишкою клацати маю?

— А ось із цього й починається головне на сьогодні, — Льоха явно чекав на це запитання. — Згадай, що агент умів досі. Читав файли, писав код, навіть минулого тижня через MCP-кабель притягнув тобі землетруси. Усе це — робота з текстом: літери, дані, рядки на диску. А ось відкрити сторінку в браузері й клацнути по ній — натиснути кнопку, схопити фігуру, перетягнути на клітинку — він не вмів. Не було в нього рук у браузері.

— А тепер будуть?

— А тепер будуть. Сьогодні агент навчиться керувати справжнім браузером. Сам відкриватиме вікно, сам рухатиме курсор, сам клацатиме. І це, чесно скажу, найвидовищніше, що ти тут побачиш.

2. Це той самий MCP-кабель, тільки до браузера

— І це що, якась нова величезна штука? — Тьома заздалегідь напружується, бо думає, що зараз буде тиждень налаштувань.

— А ось і ні, — Льоха майже задоволений. — Памʼятаєш, кілька днів тому ми MCP-кабелем дотягнулися до сервісу землетрусів? Була програма зовні, вона віддавала дані, а ми підключили її до агента кабелем. Так от, браузер підключається точно так само. Є спеціальна програма — браузер із розʼємом під MCP. Підключаємо її до агента тим самим кабелем — і агент отримує над браузером руки: відкрити сторінку, клацнути, надрукувати, зняти скриншот.

— Тобто нове щось вчити не треба?

Кабель той самий, ти його вже опанував. Нове — лише те, куди його підʼєднано. Раніше на тому кінці був сервіс із даними, тепер — браузер, яким можна керувати. Прийом один і той самий. Ця програма-браузер називається Playwright. Підключив кабелем — і в агента зʼявилися руки в браузері.

3. Підключаємо Playwright

— Досить теорії, — Льоха відкриває термінал. — Підключаємо. Одна команда:

claude mcp add playwright -- npx -y @playwright/mcp@latest

Почекай, розбери по словах, — просить Тьома, дивлячись на рядок. — А то на вигляд складнувато.

— Та не складніше за минулий раз, — Льоха розбирає по частинах. — claude mcp add — це «додай MCP-підключення», ти це вже робив кілька днів тому із землетрусами. playwright — просто імʼя, яким я називаю це підключення, щоб потім упізнавати його в списку.

— А ці дві риски?

-- — це роздільник. Усе, що стоїть праворуч від них, Claude не розбирає як свої налаштування, а передає цілком як команду запуску: «ось цю програму візьми й запусти». Праворуч якраз вона й стоїть — npx -y @playwright/mcp@latest: це «скачай з інтернету свіжий пакет @playwright/mcp і запусти його».

— А минулого разу ми писали якийсь --transport http. Тут де він?

— Гарне запитання. Минулого разу сервіс працював через мережу — десь на чужому сервері, і ми прапорцем --transport http казали: «кабель іде через інтернет, ось за такою адресою». А тут усе інакше. Ми не йдемо в мережу — ми запускаємо програму-браузер просто на твоїй машині, ось цією командою після --. Раз програма локальна, запущена поруч, Claude спілкується з нею напряму, без мережі, і ніякого --transport http не потрібно. Локальна програма проти мережевого сервісу — ось і вся різниця між двома командами.

Льоха тисне Enter — команда відпрацьовує. І одразу попереджає:

— Тепер важливе, не пропусти. Підключення додалося в налаштуваннях, але поточна сесія про нього ще не знає. Нові кабелі підʼєднуються тільки під час запуску — отже, сесію треба перезапустити. Але не просто вийти й зайти знову, а так, щоб не втратити все, що ми тут напрацювали над грою. Для цього є окремий ключ — --continue: він і підхопить свіжий кабель, і поверне весь наш контекст. Виходиш з агента й запускаєш:

claude mcp list        # перевірити: playwright → ✓ Connected
claude --continue      # перезапустити, підхопивши кабель і не втративши контекст

— У списку playwright має стояти зі статусом ✓ Connected — отже, браузер підключений і агент його бачить. Якщо статусу немає або є помилка — перш за все перевір команду і чи пакет завантажився. І майже завжди причина одна: не перезапустив сесію. Забув — агент підключення не підхопить, хоч тричі його додавай.

Далі, уже в новій сесії, глянемо, що дав це підключення:

/mcp          # показує підключені MCP та їхні інструменти

/mcp покаже playwright і список його інструментів: відкрити сторінку, клацнути, ввести текст, зняти скриншот. Ось це агент тепер і вміє робити в браузері — кожен такий інструмент наче окрема кнопка.

4. Агент робить перший хід

— А тепер просто проси словами, — Льоха набирає в сесії. — Тільки назви прямо: через Playwright. Скажеш просто «відкрий сторінку» — агент може відкрити її у звичайному браузері, яким він не керує, і дивитиметься збоку. А нам треба, щоб він відкрив її саме в браузері Playwright — тому, яким він уміє керувати. Тому імʼя й указуємо:

Через Playwright відкрий мою гру game.html у браузері.
Ти граєш за чорних. Дочекайся свого ходу, зроби хід і надішли скриншот дошки.

— А тепер дивись на екран, — Льоха не квапить.

За секунду нічого. Потім само відкривається вікно браузера — те саме, Playwright-ове, де видно кожен рух агента. У ньому завантажується дошка. Тьома рухає білу пішку своєю рукою — він же за білих. Хід переходить до чорних. І тут курсор у вікні сам підʼїжджає до чорного коня, підхоплює його, веде на клітинку, відпускає. У чат падає скриншот дошки.

Офігеть! — Тьома аж підстрибує, тицяє пальцем у екран. — Він справді сам пішов! Я нічого не чіпав — а фігура поїхала!

— Сам, — усміхається Льоха. — А тепер дивись, як він це зробив. Прочитав на сторінці мітку data-turn, побачив "b" — зрозумів, що настала його черга, чорні. Подивився на дошку, вибрав хід, клацнув по фігурі, клацнув по клітинці. Ти за нього жодного разу не торкався мишки. Ось тобі й «браузер ожив» — не на словах, а ось воно: вікно є, курсор рухається сам.

5. /goal: агент крутить до результату

Тьома вже загорівся:

— Слухай, а можна ще крутіше? Щоб я не по одному ходу командував, а сказав «доіграй партію» — і пішов, а він сам довів до кінця?

— Можна, і для цього в Claude Code є окрема потужна команда — /goal, «задана мета». Штука крута, запамʼятай її. Зазвичай ти як працюєш: даєш агенту крок, він зробив, чекаєш, даєш наступний. А /goal перевертає це. Ти даєш не кроки, а умову, за якої справу можна вважати завершеною — і йдеш.

Агент далі сам повторює цикл: зробив спробу → перевірив, чи виконано умову → не виконано, робить ще → і так, поки не зійдеться. Причому перевіряє не він сам собі на око: після кожного кроку підключається окремий невидимий перевіряльник (швидка модель) і вирішує — досягнуто мети чи ні. Досягнуто — агент зупиняється. Це й є «поставив задачу й пішов»: повертаєшся — а все готово.

— Це ж узагалі для чого завгодно так можна! — доходить до Тьми. — Не лише для шахів.

— Для чого завгодно, де ви можете чітко описати, що означає «готово», — киває Льоха. — А в нас із шахами це якраз є. Памʼятаєш свою мітку data-game-over? Ось вона тут і згодиться як умова:

/goal на дошці зʼявився атрибут data-game-over="true"

— Агент грає хід за ходом і після кожного звіряє: став data-game-over у "true" чи ще ні. Партія дійшла до мату, мітка стала — агент зупинився сам. А ви тим часом хоч чай пийте.

Тьома світиться:

— Та це ж крутість у квадраті! Мало того, що він сам ходить — так ще й усю партію без мене доведе: загадали, пішли, повернулися — готово.

— Ага. А вимкнути режим, коли набридне:

/goal clear     # прибрати загадану мету

І тут Льоха ставить чесну межу — не повчаючи, просто відзначає:

— Тільки поміть одну річ. Умову, яку ти вписав, — data-game-over — ти взяв готову. Ти ж сам цю мітку в гру й заклав, коли збирав її, — тепер просто скопіював її в /goal. А ось самому вигадати, за якої умови задача взагалі вважається виконаною, щоб машині можна було довірити перевірку, — це окрема доросла навичка, до неї дійдемо набагато пізніше. Поки — береш готову умову й насолоджуєшся, як агент сам крутить до результату.

Замовлено, — Тьома вже не дуже слухає застереження, йому не терпиться запустити.

6. Той самий браузер — для будь-якої живої сторінки

— Слухай, — міркує Тьома на ходу, — а раз він уміє ходити по сторінках… це ж не тільки про мою гру?

— Не тільки, — киває Льоха. — Браузер-то спільний. Тією самою рукою агент відкриє будь-яку живу сторінку й пройде по ній сценарій. Памʼятаєш лендинг, який ти викотив в інтернет ще на пʼятому рівні? Ось по ньому тією ж рукою можна швидко пробігтися — відкрити, дійти до потрібного місця, повернути скриншот: усе на місці, сторінка жива.

— Тобто це не лише цирк «він грає, а я дивлюся».

— Зараз — здебільшого цирк, не буду брехати, — Льоха не роздуває. — Але браузер під рукою в агента — штука спільна, не тільки для іграшок. Тією самою рукою можна пробігтися по вже викладеному й глянути, чи воно живе. Просто тримай у голові: рука ця спільна.

— Ну що, голова не пухне? — Льоха тягнеться закрити термінал. — Дивись, що в тебе тепер у руках. Playwright — це агент за кермом справжнього браузера: сам відкрив вікно, сам клацає, сам надіслав скриншот. Підключили його тим самим mcp add, що й землетруси, тільки без мережі — як програму просто тут, на машині; не забув перезапустити сесію — і mcp list показав Connected. Далі агент читає мітки прямо на сторінці — data-turn, data-game-over — і по них розуміє, що до чого, замість того щоб гадати по картинці. А /goal — це коли ви дали не кроки, а умову, і пішли: він сам крутить до результату.

Усе нормально, — киває Тьома. — Одне тільки це твоє «бери готову умову» — так собі радість.

— На готовому поки й живи, — усміхається Льоха. — Своє вигадувати навчишся, дай час. От тепер — можна збирати по-справжньому.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ