Тры агенты Playwright: планавальнік, стваральнік і лікувальнік у додатку Live Cart.
Фрэймворк Playwright, у яком агент плануе тэставанне, іншы ствараўцы спефікацыі на базе рэальных сесый браузера, а ўсё іншае лікуе неудачы, дазволяючы адрабатваць 22 паралельных тэста прыблізна за 16 секунд.
Большасць людзей вядома дэманстрацыю: задаецца запіт да мадэлі, атрымліваецца скрыпт Playwright, ён запускаецца аднойчы, і чыраз секунд пасля ён перастае працаваць. Команда з аптэкты прыладоў следуе іншам цыклу — адвічанне, планаванне, автаматызацыя і падтрымка, — а мета тут была даць кожнам з этых этапаў адпаведную адпаведальнасць. Рэзультатам ёст тэрмінал Playwright, які можа быць перызначаны, і ў ягонай структуры ёсць троўе спецыялістаў:
- Планавальнік адвічае жывое застосоўанне і піша план тэставання.
- Генератор ператварае адзін запланаваны сцэнарый у адзін рабочы спефікат.
- Лікувальнік запускае комплекс тэставання, выявляе прычыны ўпадку тэстаў і усуне глыбокія прычыны.
Цэллю дэмантавання была маленькая прыграмма для кошыка з алгорытмам, якія веду ад заходу ў сістэму да старонкі з таварамі, кошыкам, процэсу оплата і старонкі з подзякамі. У падсумку было створана 22 автаматызаваныя сцэнарыя, якія пакрываюць усі можлівыя сцэны: успешныя рашэнні, негатыўныя сітуацыі і крайнія варыянты верыфікацыі. Яны запускаюцца паралельна, на адной з базовых старонак, якія самі агенты падтрымляюць. У справаздачы Playwright у фармаце HTML было паказана, што 22 тэсты працавалі правільна, 0 — не працавалі, 0 — давалі нестабільныя рашэнні, а весь набор тэстаў быў завершаны за 16,2 секунды.
Падготовка пры запуску кожнага агента
Спачатку павінны існаваць тры элементы. Большасць інструкцый іх працягвае, але саме яны вялікі чыннік таго, чы можна вжываць гэты рэзультат.
Сервер тэстаў MCP ад Playwright. Агенты не павінны здагадваліся ўсё па DOM, таму яны вікорыстоўваюць рэальны браузер. Одна канфігурацыйная файл паў’язуе іх між сабою:
{
"servers": {
"playwright-test": {
"type": "stdio",
"command": "npx",
"args": ["playwright", "run-test-mcp-server"]
}
}
}
Гэта дае кожнаму агенту такія інструменты, як browser_navigate, browser_snapshot і browser_click, а таксама test_run і test_debug для Healer.
Контракт фрэймворку. Файл framework.md апісвае структуру папак і правілы: селектары знаходзяцца ў pages/, траекторыі дзеяння корыстувальца — у flows/, а адрэсы і паролі — у .env. Кожны агент чытае яго перад тым, як выконваць якія-небудзь дзеяння, тады рэзультаты выглядаюць як адна кодавая база, а не тры разныя стылі.
Тэст-семен. Одна мініяцюрная спефікацыя ачыняе рэальную галоўную стороніцу і пераканваецца ў стабільнасці певных элементаў. Кожны створаны тэст запускаецца з гэтага вядомага, правільнага стану.
Якосць агента залежыць толькі ад «рэйлаў», на якіх ён працуе, і гэтыя тры элементы являюцься такімі «рэйламі».
The Planner: выбіранне таго, што заслуговае на тэст
Планавальнік узагалі не пішчытае коду. Ён ачынае прыкладку, дзейначыць як старанны тэстэр і картавае тое, што існуе: формы, аўтэнтыфікацыю, корзінку, крокі практыкавання пакупкі, поведамленні пра перакананне і станы без дадзеных.
Яго рутына:
- Адзін раз вызваць
planner_setup_page. - Дзеяначыць за дапамою інструментаў прыводчыка, чытачы кадры DOM у замяну на скрыншоты.
- Выбраць галоўныя шляхі дзеяння і способы, якімі кожны з іх можа зазнаць неудачы.
- Зберагчы план у фармаце markdown у файл
specs/-plan.md.
Кожны сцэнарый у плане мае заглавье, нумераваныя крокі, апэктываўанный рэзультат, прыпуск пра пачатковы стан (чыстая сесія, калі не зазначана інша) і шлях до файлу, у якім ён будзе зберагчыцца.
План апрэлава складаўся з 22 сцэнарыяў, разбітых на часткі для заходу ў сістэму, кошыка, апрэлава і адной цэлай працэсуальнай схемы. Такая структура практычна паследней, каліколькі Генератор ператварае назву кожнай часткі на блок test.describe, і план з кодам за сваёю структурой застаюцца сувязанымі.
Чаму отсэльны этап? Крытычнасць тэставання — гэта проблема падбору стратэгій. Калі адна просьба вымагае одночасна планавання і напісання коду, планаванне стае гorsам. Рэзультаты толькі планавання можна пераглядзець і правіць пры тым, калі ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўс
generator_read_log, які зберагае індэксы і чакае на тыя, якія справды працавалі.generator_write_test, ў рэзультаце чаго стварыцца адзін файл спэкыфікацыі.У трэцьму кроку і выходзіць значэнне. Нічога не запам’ятваецца з дадзеных трэніравання. У файле зафіксаваецца рэкорд сесіі, якая ўжо пройшла на рэальным інтэрфейсе.
Расход выканання автаматычна павінаваецца правілам фрэймворку:
// spec: specs/checkout-e2e-plan.md
// seed: tests/web/seed.spec.js
import { test, expect } from '../../../fixtures';
import { users } from '../../../testdata';test.describe.configure({ mode: 'parallel' });test.describe('E2E checkout journey', () => {
test('positive: login → add product → checkout → thank you → home', async ({ flow }) => {
await flow.completeHappyPathPurchase();
});
});
У выходным дадзеннях значнаю частка не прынесена: CSS-селектары, буквальны пароль і строкі URL. Селектары пераводзяцца ў об’екты сторанкі, а багатаэтапныя працэсы стаюць методамі класу flow:
async completeHappyPathPurchase(user = users.standard, info = checkout.valid) {
await this.goToCheckoutInformation(user);
await this.fillValidInformation(info);
await this.continueToOverview();
await this.app.checkoutOverview.expectProductVisible(products.first.name);
await this.finishOrder();
await this.backHomeToProducts();
}
Кожны тэст таксама атрымлея свой сабе браузерны кантэкст, граф аб’ектаў стораны і экзампляр прабегу праз фіксаты. Без спяльнага зменяемага стану вялікі набор тэстаў ёсць безпечны для паралельнай працы з самага пачатку, а не як наследак. Гэта і ўражае разліку межы скрыпты і фрэймворка.
Healer: выправленне правага шару
Створэнне тэстаў — гэта разовая перамога. Адтрыманне ў робочы стан — гэта постацейны кост, і самэ гэта ўражае месца трэцьяго агента. Яго цыкл:
test_runвыкананае вялікі набор тэстаў і скарыстаеся неудачамі.test_debugзупініцца на кожной неудачы.- Ён аналізуе жывы скрапшот, консоль, сеткавы трафік і неудачную асэрцыю.
- Ён дыяганазавае прычыну: змянены локатор, змінена часовая структура, змянены контракт або справжняі баг продукту.
pages/, калі змінюецца інтэрфейс, і api/endpoints/, калі змінюецца контракт.Две меры захоплення памагаюць зберагчы доверлівасць. Ён ніколі не слабяе асэрцыю толькі каб тэст працаваў успешна. Калі продукт некарэктны, а тэст правы, ён пазначае тэст функцыяй test.fixme() і коментарыем, які опісвае рэальную працэздатнасць, тады памылка застаецца відной і не знікае. Таксама ён утрымваецца ад вікорыстанняя ненадзеяных API, такіх як networkidle, як тымчасовага рашэння для адліквідацыі конфліктаў.
Працэйнае прынцып — канцентрацыя змян. Як толькі перайменаваецца кнопка, выправляецца адзін метод об’екта сторанкі, пасля чаго ўсе тэсты, якія яго вікорыстоўваюць, зноў працуюць. Паколькі 22 тэсты вікорыстоўваюць 325 ліній коду об’ектаў сторанакі, распадзеленых па 10 класаў, перэдзялёвка не пагрожуе цэлай сутнісе тэставой серыі. У сукупнасці кожны элемент вядома адпавядае за певную частку рэпазітарыю, а спяльны шар об’ектаў сторанакі ёсць тым, што падтрымае весь апарат.
Выкананне з самага пачатку да канца
Команды на налагоджэнне:
1. Copy .env.example → .env, set BASE_URL (+ credentials)
2. npm install && npx playwright install
І агент працюе па следуючым парадку:
3. Run the Planner
→ specs/checkout-e2e-plan.md (22 scenarios, reviewed by me)4. Run the Generator, scenario by scenario
→ tests/web/login/login.spec.js
→ tests/web/cart/cart.spec.js
→ tests/web/checkout/checkout.spec.js
→ tests/web/e2e/checkout-journey.spec.js5. npm test (4 workers, fully parallel)6. Any red? Run the Healer → re-run → green
Пераключэнне на іншы продукт не паўлічвае дзейнасць агентаў. Значэнне BASE_URL трэба задаць новаму продукту, перзначыць об’екты стораніцы і тэстовыя даны, а пасля зноў выдаць тыя ж тры запіты. Паколькі агенты чытаюць framework.md і .env, а не жорстка заданае назва продукту, цяжба ёсць перэноснаю і не прызначаная спецыяльна для аднаго продукту.
Наскількі ж гэта быстрэй, на самай працоўцы?
Такія тверджэння, як «AI зробіла гэта у дзесяць разоў быстрэй», не трэба прыймаць без дэтальнага аналізу. Рэчыпісанне тэста з начала да канца вручную рэдка калі стосуецца толькі набірання тэксту. Цэх значыць ачыненне DevTools, пошук стабільнага селектара, знаходжэнне кантакту ў незвычайным обгортку, паўторнае запусканне, каб пераканацца, што асэрцыя запускаецца занадта рана, і пачатак зноў. Большая частка зусіль складаецца з гэтага цыклу адкрыць, і Генератор практычна падхопляе гэты трыбут, выкананым крокі ў рэальны час і адзвячаннем пра тое, што запрацавало.
Корысты практычна відчуваюцца на калькі стадыях:
- Адаптаванне дыялеграмы тэстаў. У ручным рэжыме гэта робіцца ад случая да случая, і часта прыгнаўваюцца негатывныя сцэнарыі. Planner загадзя перыяктуее позытывныя, негатывныя і крайнія сцэнарыі.
- Пошук локейтараў. Ручны пошук у DevTools па кожнам элеменце заменяецца локейтарамі, зафіксаванымі з ужэ завершанай сесіі.
- Першы «зелены» тэст. Цыкл запісу, запуску, выправлення і павтарэння ператвараецца на стварэнне тэста на адной пазырэнай транскрыпцыі.
- Падтрымка комплексу тэстаў. Пошук у кожным спефікацыяніі зламанага селектара заменяецца выправленнем адной старонкі-об’екта, што лечыць усе залежныя тэсты.
Найбольшая еканамія даходзіць ад другога да двадцатага тэста. Першы тэст выклікае рэальныя вітраты на настройку об’ектаў сторанкі, фікстураў і пачатковых дадзенняў. Пасля гэтага новы сцэнарый пераважна складаецца з існуючых частак, і вітраты на кожны тэст быстра зніжваюцца.
Скорасць выканання выходзіць з абсалютна іншага джэрага. Паралелізм — гэта не функцыя ШЫ. Гэта правіла праектавання, якія агенты должны сабліжваць. Кожны тэст отрымае новы кантэкст з фіксатароў, і ніхто не мутыруе стану спяльнага модуля, таму налаштавання выконваюцца абсалютна паралельна: чатыры працоўнікі локальна, два ў CI з двумя перапрыбуткамі; логі і відэа запісваюцца толькі калі тэст не выйшоў. Будзь-якая серыя, якая пераіснаўляе адну сесію заходжання, не можа выконваліцца так без рызыку. Штосьце можа, таму што правілам, якое Генератор мусіў сабліжваць у кожным файле, было такое: адна сцэнарыя — адны незалежны тэст.
Чатыры урокі, якія варта пераняць
- Зменшычы ролі. Адна вялікая інструкцыя, якая плануе, піша код і дэбагуе, дае нечыстыя рэзультаты. Тры сфокусаваныя ролі, кожная з своімі інструментамі, залечаюць можная для перагляду інфармацыю на кожным этапе.
Для каго гэта падходзіць
Інжынеры QA, які вітрачаюць більшэ часу на рэмонт локейтороў, ніж на створэнне покрыцча, отрымаюць карысць. Так сама будзе з командамі, якія вікорыстоўваюць Playwright і хочуць, каб AI працавала в межах дысцыплінованай структуры, а не заменяла ёю, а таксама з усіма, хто поручае агенты Copilot чы Cursor з тэстовым серверам MCP Playwright.
Нічга з гэтага не заменяе QA. Рашэнне пра тое, што ёсць важлівым, шта лячыцца справжнім багам і якое покрыцча не хапае, застаецца за адной чалавекам. Агенты віконваюць задачы з аналізу, стварэння базовых элементоў і рэмонту, што дазволяе ствараць цыклы прабоў, генеравацыю, запуск і повторны аналіз.