{"id":34743,"date":"2026-09-15T05:00:00","date_gmt":"2026-09-15T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=34743"},"modified":"2026-09-17T10:04:50","modified_gmt":"2026-09-17T08:04:50","slug":"playwright-i-ai-agents-mcp-cli-i-debugowanie-testow-co-dzis-naprawde-dziala","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/playwright-i-ai-agents-mcp-cli-i-debugowanie-testow-co-dzis-naprawde-dziala\/","title":{"rendered":"Playwright i AI: Agents, MCP, CLI i debugowanie test\u00f3w. Co dzi\u015b naprawd\u0119 dzia\u0142a?"},"content":{"rendered":"\n<p>W artykule przybli\u017c\u0119 Ci, co Playwright potrafi dzi\u015b w po\u0142\u0105czeniu z AI. Chc\u0119 te\u017c odpowiedzie\u0107 na pytanie, kt\u00f3re ostatnio do\u015b\u0107 cz\u0119sto pada na konferencjach i w rozmowach z zespo\u0142ami: Czy Playwright rzeczywi\u015bcie jest obecnie dobrym narz\u0119dziem open source do automatyzacji test\u00f3w UI, je\u015bli patrze\u0107 na niego przez pryzmat AI?<\/p>\n\n\n\n<p>Od razu zaznacz\u0119, \u017ce nie b\u0119dzie to wpis w stylu \u201ewpisujesz prompt i masz gotowy framework\u201d. Poka\u017c\u0119 Ci konkretne funkcje i powiem, co u mnie zadzia\u0142a\u0142o, a co kosztowa\u0142o mnie sporo eksperymentowania. Wszystkie wersje, komendy i flagi w tym tek\u015bcie odnosz\u0105 si\u0119 do Playwrighta 1.62.1, czyli wersji stabilnej na sierpie\u0144 2026.<\/p>\n\n\n\n<p>Ta cz\u0119\u015b\u0107 to przegl\u0105d ca\u0142o\u015bci: co dok\u0142adnie dostajesz, jak to uruchomi\u0107 i do czego si\u0119 nadaje. W cz\u0119\u015bci drugiej wejd\u0119 g\u0142\u0119biej \u2013 w regu\u0142y, kt\u00f3re trzeba dopisa\u0107 agentom, w koszt tokenowy MCP kontra CLI, w bezpiecze\u0144stwo i w debugowanie test\u00f3w z agentem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co dok\u0142adnie Playwright oferuje w obszarze AI?<\/strong><\/h2>\n\n\n\n<p>Dzi\u015b mamy do dyspozycji cztery obszary, kt\u00f3re warto zna\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Playwright Agents<\/strong> \u2013 trzej subagenci (planner, generator, healer), kt\u00f3rych definicj\u0119 instalujesz jedn\u0105 komend\u0105.<\/li>\n\n\n\n<li><strong>Playwright MCP<\/strong> \u2013 serwer MCP (Model Context Protocol) daj\u0105cy modelowi bezpo\u015bredni dost\u0119p do przegl\u0105darki.<\/li>\n\n\n\n<li><strong>Playwright CLI<\/strong> \u2013 nowsze podej\u015bcie, zoptymalizowane pod k\u0105tem zu\u017cycia token\u00f3w.<\/li>\n\n\n\n<li><strong>Debugowanie wspierane przez AI<\/strong> \u2013 m.in. przycisk \u201eCopy prompt\u201d w raporcie HTML, trace viewerze i UI mode, a od 1.59 r\u00f3wnie\u017c flaga <code>--debug=cli<\/code> i polecenie <code>npx playwright trace<\/code>, przeznaczone wprost dla agent\u00f3w.<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b518fd&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b518fd\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"464\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image1-1024x464.png\" alt=\"Ryc. 1 Cztery obszary AI w Playwright: agenci, MCP, CLI i debugowanie, z wersjami i efektem ka\u017cdego z nich\" class=\"wp-image-34744\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image1-1024x464.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image1-300x136.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image1-768x348.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image1-1536x696.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image1.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 1 Cztery obszary AI w Playwright: agenci, MCP, CLI i debugowanie, z wersjami i efektem ka\u017cdego z nich<\/figcaption><\/figure>\n\n\n\n<p>Ka\u017cdy z tych element\u00f3w rozwi\u0105zuje troch\u0119 inny problem. Przejd\u017amy przez nie po kolei.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Playwright Agents<\/strong><\/h2>\n\n\n\n<p>Playwright Agents to ciekawy pomys\u0142 na to, \u017ceby trzech subagent\u00f3w pomaga\u0142o w codziennej pracy in\u017cyniera automatyzacji test\u00f3w. Funkcja pojawi\u0142a si\u0119 w Playwrighcie 1.56 i dzieli si\u0119 na trzy role:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Planner<\/strong> \u2013 eksploruje uruchomion\u0105 aplikacj\u0119 w przegl\u0105darce i tworzy plan test\u00f3w w formacie Markdown. Dostajesz plik ze scenariuszami, warunkami wst\u0119pnymi, krokami i oczekiwanymi rezultatami. Najwa\u017cniejsze jest to, \u017ce to artefakt czytelny dla cz\u0142owieka, wi\u0119c mo\u017cesz go przejrze\u0107 i poprawi\u0107, zanim ktokolwiek napisze linijk\u0119 kodu.<\/li>\n\n\n\n<li><strong>Generator<\/strong> \u2013 zamienia zaakceptowany plan na pliki <code>.spec.ts<\/code>. Nie robi tego \u201ena sucho\u201d na podstawie kodu \u017ar\u00f3d\u0142owego, tylko wykonuje kroki w \u017cywej przegl\u0105darce i weryfikuje lokatory na bie\u017c\u0105co. W wygenerowanym pliku zostawia komentarze <code>\/\/ spec: i \/\/ seed:<\/code>, wskazuj\u0105ce scenariusz i seed, z kt\u00f3rych wyr\u00f3s\u0142 dany test. Drobiazg, ale bardzo u\u0142atwia review.<\/li>\n\n\n\n<li><strong>Healer<\/strong> \u2013 zaczyna od uruchomienia ca\u0142ego zestawu test\u00f3w, \u017ceby ustali\u0107, kt\u00f3re testy nie przechodz\u0105. Potem odtwarza kroki, w kt\u00f3rych wyst\u0105pi\u0142 b\u0142\u0105d, sprawdza bie\u017c\u0105cy stan UI w poszukiwaniu odpowiednika elementu lub przep\u0142ywu, proponuje poprawk\u0119 i powtarza przebieg, dop\u00f3ki test nie przejdzie albo dop\u00f3ki nie zatrzymaj\u0105 go zabezpieczenia. Je\u017celi uzna, \u017ce zepsuta jest aplikacja, a nie test, powinien pomin\u0105\u0107 test, zamiast zamiata\u0107 b\u0142\u0105d pod dywan.<br>Dokumentacja (Playwrighta) stawia spraw\u0119 uczciwie: <strong>wynikiem pracy healera jest albo test przechodz\u0105cy albo pomini\u0119ty<\/strong>. Rzuca si\u0119 przy tym w oczy jedno: healer nie dostaje ani jednego narz\u0119dzia do klikania. Jego lista to inspekcja strony, konsola, sie\u0107, <code>evaluate<\/code>, generowanie lokator\u00f3w, wyszukiwanie w plikach i ich edycja oraz listowanie, uruchamianie i debugowanie test\u00f3w. Naprawia kod, a nie interakcj\u0119.<\/li>\n<\/ol>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b521f3&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b521f3\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"448\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image2-1024x448.png\" alt=\"Przep\u0142yw Playwright Agents z zaznaczonymi bramkami review cz\u0142owieka\" class=\"wp-image-34746\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image2-1024x448.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image2-300x131.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image2-768x336.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image2-1536x672.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image2-370x162.png 370w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image2.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 2 Przep\u0142yw Playwright Agents z zaznaczonymi bramkami review cz\u0142owieka<\/figcaption><\/figure>\n\n\n\n<p>Odczarujmy od razu ten mechanizm. Definicja agenta to zwyk\u0142y plik Markdown: nag\u0142\u00f3wek z metadanymi, zestaw instrukcji i lista narz\u0119dzi MCP, kt\u00f3re ten agent ma prawo wywo\u0142a\u0107. W nag\u0142\u00f3wku znajduje si\u0119 te\u017c pole <code>model:<\/code>, a w 1.62.1 wszystkie trzy definicje maj\u0105 tam wpisane <code>sonnet<\/code>. To znaczy, \u017ce wyb\u00f3r modelu nie jest w pe\u0142ni Twoj\u0105 decyzj\u0105 w kliencie, tylko warto\u015bci\u0105 w pliku, kt\u00f3r\u0105 mo\u017cesz zmieni\u0107, pami\u0119taj\u0105c, \u017ce kolejne <code>init-agents<\/code> wpisze j\u0105 z powrotem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Jak to uruchomi\u0107?<\/strong><\/h3>\n\n\n\n<p>Konfiguracja jest prosta. Potrzebujesz Playwrighta w wersji 1.56 lub nowszej i jednej komendy w katalogu projektu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nnpx playwright init-agents --loop=vscode\n# albo\nnpx playwright init-agents --loop=claude\n<\/pre><\/div>\n\n\n<p>Flaga <code>--loop<\/code> m\u00f3wi Playwrightowi, dla jakiego klienta ma wygenerowa\u0107 definicje agent\u00f3w. W 1.62 przyjmuje sze\u015b\u0107 warto\u015bci: <code>claude, codex, copilot, opencode, vscode i vscode-legacy<\/code>. Je\u017celi sprawdzisz to w dokumentacji, znajdziesz tylko cztery <code>- copilot i vscode-legacy<\/code> wypisuje dopiero <code>--help<\/code>. Przy VS Code potrzebujesz wersji 1.105 lub nowszej, bo wcze\u015bniejsze nie maj\u0105 pe\u0142nego wsparcia dla trybu agentowego.<\/p>\n\n\n\n<p>Po uruchomieniu komendy dostajesz trzy pliki z definicjami agent\u00f3w (po jednym na rol\u0119), konfiguracj\u0119 serwera MCP, katalog <code>specs\/<\/code> z kr\u00f3tkim README oraz \u2013 je\u017celi jeszcze go nie masz \u2013 tzw. seed test. Dok\u0142adne \u015bcie\u017cki zale\u017c\u0105 od wybranej warto\u015bci <code>--loop<\/code>: Claude Code dostaje definicje w <code>.claude\/agents\/<\/code> i plik <code>.mcp.json<\/code> w katalogu projektu, a <code>--loop=vscode<\/code> zapisuje je jako <code>.github\/agents\/&lt;nazwa>.agent.md<\/code> z wpisem w <code>.vscode\/mcp.json<\/code>. Je\u017celi szukasz chat mode&#8217;\u00f3w w <code>.github\/chatmodes\/<\/code>, to jest ju\u017c \u015bcie\u017cka legacy, dost\u0119pna pod osobn\u0105 flag\u0105 <code>--loop=vscode-legacy<\/code>. W repo zostaje wi\u0119c <code>specs\/<\/code> z planami w Markdownie i <code>tests\/<\/code> z wygenerowanymi testami, a w\u015br\u00f3d nich <code>tests\/seed.spec.ts<\/code>.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b529e9&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b529e9\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"501\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image3-1024x501.png\" alt=\"Wynik npx playwright init-agents dla dw\u00f3ch klient\u00f3w: te same trzy role, dwa uk\u0142ady plik\u00f3w\" class=\"wp-image-34748\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image3-1024x501.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image3-300x147.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image3-768x376.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image3-1536x751.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image3.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 3 Wynik npx playwright init-agents dla dw\u00f3ch klient\u00f3w: te same trzy role, dwa uk\u0142ady plik\u00f3w<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Kolejne kroki<\/strong><\/h3>\n\n\n\n<p>Wygenerowanie plik\u00f3w to dopiero po\u0142owa sprawy, bo samo z siebie nic si\u0119 nie uruchomi.<\/p>\n\n\n\n<p>Agent\u00f3w wywo\u0142ujesz z czatu swojego klienta \u2013 w Claude Code prosz\u0105c o plannera, generator albo healera po nazwie, w VS Code wybieraj\u0105c jednego z listy agent\u00f3w w czacie. Kolejno\u015b\u0107 jest taka, jak zaprojektowano role: planner zapisuje plan w <code>specs\/<\/code>, Ty przegl\u0105dasz ten Markdown, generator zamienia zaakceptowany plan na testy w <code>tests\/<\/code>, a healer wchodzi dopiero wtedy, gdy co\u015b ju\u017c nie przechodzi.<\/p>\n\n\n\n<p><strong>Wa\u017cny element z dokumentacji:<\/strong> definicje agent\u00f3w nale\u017cy regenerowa\u0107 przy ka\u017cdej aktualizacji Playwrighta, \u017ceby podci\u0105gn\u0105\u0107 nowe narz\u0119dzia i instrukcje. To nie jest kosmetyka, bo te pliki zawieraj\u0105 list\u0119 narz\u0119dzi MCP, a ta lista zmienia si\u0119 mi\u0119dzy wersjami.<\/p>\n\n\n\n<p>Je\u017celi korzystasz ju\u017c z Playwrighta w wersji 1.62 lub nowszej, jest jeszcze jedno u\u0142atwienie: serwer MCP i CLI s\u0105 teraz w tej samej paczce co Playwright, wi\u0119c uruchomisz je przez <code>npx playwright mcp i npx playwright cli<\/code>, bez osobnej instalacji. To dzi\u015b domy\u015blna droga, wi\u0119c zacznij w\u0142a\u015bnie od niej. Obok <code>init-agents<\/code> dosz\u0142a te\u017c komenda <code>npx playwright init-skills<\/code> instaluj\u0105ca skille Playwrighta dla Twojego klienta (<code>--loop=claude albo --loop=agents<\/code>). To osobny mechanizm w stosunku do definicji agent\u00f3w i \u0142atwo go przeoczy\u0107, bo dokumentacja po\u015bwi\u0119ca mu znacznie mniej miejsca.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Seed test<\/strong><\/h3>\n\n\n\n<p>Jeden z tych plik\u00f3w zas\u0142uguje na wi\u0119cej uwagi ni\u017c zwykle dostaje: seed test.<\/p>\n\n\n\n<p>Wygl\u0105da jak pusta za\u015blepka, a w praktyce decyduje o tym, czy agent w og\u00f3le zobaczy Twoj\u0105 aplikacj\u0119 i w jakim stylu napisze testy. To r\u00f3wnie\u017c miejsce na logowanie. Planner i generator eksploruj\u0105 \u017cyw\u0105 aplikacj\u0119, wi\u0119c je\u017celi Twoja stoi za ekranem logowania, to w\u0142a\u015bnie seed test podaje im zalogowan\u0105 sesj\u0119 przez <code>storageState<\/code>. Bez tego agent sp\u0119dzi ca\u0142y przebieg, wpatruj\u0105c si\u0119 w formularz logowania.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Jaka jest jako\u015b\u0107 wygenerowanego kodu?<\/strong><\/h3>\n\n\n\n<p>I tutaj przechodzimy do sedna, bo to jest pytanie, kt\u00f3re dostaj\u0119 najcz\u0119\u015bciej.<\/p>\n\n\n\n<p>Z mojej perspektywy, <strong>je\u017celi nie dasz subagentom zasad, kt\u00f3rych maj\u0105 przestrzega\u0107, jako\u015b\u0107 wygenerowanego kodu b\u0119dzie przeci\u0119tna<\/strong>. I nie chodzi o to, \u017ce kod nie b\u0119dzie dzia\u0142a\u0142. Chodzi o to, \u017ce b\u0119dzie dzia\u0142a\u0142 w spos\u00f3b, kt\u00f3rego nie chcesz mie\u0107 w repozytorium.<\/p>\n\n\n\n<p>To zreszt\u0105 nie jest wy\u0142\u0105cznie moja obserwacja. Dokumentacja Playwrighta sama zastrzega przy generatorze, \u017ce wygenerowane testy mog\u0105 zawiera\u0107 b\u0142\u0119dy, kt\u00f3re dopiero healer ma naprawi\u0107 (<a href=\"https:\/\/playwright.dev\/docs\/test-agents\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Test Agents<\/a>).<\/p>\n\n\n\n<p>Drugi sygna\u0142 tej samej sprawy znajdziesz w definicji generatora. Przyk\u0142ad, na kt\u00f3rym uczy si\u0119 model, jest w <code>playwright-test-generator.agent.md<\/code>, w sekcji z instrukcj\u0105 generowania kodu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\ntest(&#039;Add Valid Todo&#039;, async { page } =&gt; {\n  \/\/ 1. Click in the &quot;What needs to be done?&quot; input field\n  await page.click(...);\n\n  ...\n});\n<\/pre><\/div>\n\n\n<p><code>page.click()<\/code> to stare API akcji na selektorze, a nie lokator \u2013 dokumentacja Playwrighta oznacza je jako <strong>discouraged<\/strong> i odsy\u0142a do <code>locator.click()<\/code>. Je\u017celi zastanawiasz si\u0119, sk\u0105d w wygenerowanych testach bior\u0105 si\u0119 konstrukcje, kt\u00f3rych nie chcesz w repo, to masz w\u0142a\u015bnie jedno ze \u017ar\u00f3de\u0142.<\/p>\n\n\n\n<p>Najbardziej bolesny przypadek, na jaki si\u0119 natkn\u0105\u0142em, dotyczy\u0142 jednak healera. Zdarza\u0142o si\u0119, \u017ce agent zamiast sensownie poprawi\u0107 test po prostu usuwa\u0142 asercj\u0119 albo znacz\u0105co upraszcza\u0142 scenariusz. Test przechodzi\u0142, metryka wygl\u0105da\u0142a dobrze, a warto\u015b\u0107 takiego testu spada\u0142a praktycznie do zera. I nie jest to anegdota, tylko konsekwencja tego, co healer ma zapisane w swojej definicji \u2013 rozbieram to na czynniki pierwsze w drugiej cz\u0119\u015bci artyku\u0142u, razem z list\u0105 regu\u0142, kt\u00f3re u mnie ten problem ograniczy\u0142y.<\/p>\n\n\n\n<p>Podsumowuj\u0105c: agenci \u015bwietnie przyspieszaj\u0105 pierwszy przebieg i zbieranie dowod\u00f3w. Nie zast\u0119puj\u0105 natomiast review cz\u0142owieka przy \u015bcie\u017ckach krytycznych pod wzgl\u0119dem biznesowym. Powiem wprost, na czym dzi\u015b stoj\u0119: <strong>agent\u00f3w traktuj\u0119 nadal jako obszar do eksperymentowania, a nie jako element procesu, na kt\u00f3rym m\u00f3g\u0142bym polega\u0107<\/strong>. Pewniej sprawdzaj\u0105 mi si\u0119 MCP i CLI \u2013 tam widz\u0119 dok\u0142adnie, co dostaj\u0119, i sam decyduj\u0119, co z tym zrobi\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Playwright MCP<\/strong><\/h2>\n\n\n\n<p>Playwright MCP to serwer, kt\u00f3ry daje modelowi zestaw narz\u0119dzi do sterowania przegl\u0105dark\u0105: nawigacja, klikanie, wpisywanie tekstu, robienie snapshot\u00f3w drzewa dost\u0119pno\u015bci. Je\u017celi to ostatnie poj\u0119cie jest dla Ciebie nowe: drzewo dost\u0119pno\u015bci to strona widziana tak, jak widz\u0105 j\u0105 technologie asystuj\u0105ce \u2013 role, nazwy i stany, bez szumu znacznik\u00f3w i styl\u00f3w. Dlatego jest znacznie ta\u0144sze ni\u017c surowy HTML i znacznie bardziej u\u017cyteczne dla modelu ni\u017c zrzut ekranu.<\/p>\n\n\n\n<p>Model nie zgaduje na podstawie kodu \u017ar\u00f3d\u0142owego, tylko operuje na realnie dzia\u0142aj\u0105cej stronie. Dlatego generowane lokatory s\u0105 zwykle sensowne i oparte na rolach. Nie chodzi o to, \u017ce CSS jest z\u0142y, bo selektor oparty na stabilnym atrybucie czy na <code>data-testid<\/code> jest w porz\u0105dku. Chodzi o to, \u017ce model, kt\u00f3ry strony nie widzi, si\u0119ga po pierwszy selektor znaleziony w kodzie, a taki zwykle rozpada si\u0119 przy pierwszej zmianie struktury.<\/p>\n\n\n\n<p>W domy\u015blnej konfiguracji serwer wystawia 24 narz\u0119dzia: nawigacj\u0119, klikni\u0119cia, wpisywanie tekstu, snapshot drzewa dost\u0119pno\u015bci, wyszukiwanie w snapshocie, zrzut ekranu, obs\u0142ug\u0119 dialog\u00f3w, podgl\u0105d request\u00f3w i kilka drobniejszych.<\/p>\n\n\n\n<p>Po w\u0142\u0105czeniu wszystkich opcjonalnych grup narz\u0119dzi (w dokumentacji: capabilities) \u2013 <code>network, storage, devtools, pdf, vision, testing i config<\/code> \u2013 jest ich \u0142\u0105cznie 69. Wszystkie siedem podajesz we fladze <code>--caps<\/code>, ale nie szukaj ich w <code>--help<\/code>: wypisuje dzi\u015b tylko <code>vision, pdf i devtools<\/code>. Zwr\u00f3\u0107 uwag\u0119 zw\u0142aszcza na <code>testing<\/code>: to stamt\u0105d bior\u0105 si\u0119 <code>browser_generate_locator<\/code> i rodzina <code>browser_verify_*<\/code>, czyli narz\u0119dzia zaprojektowane wprost pod pisanie asercji. Liczby dotycz\u0105 <code>@playwright\/mcp<\/code> w wersji 0.0.79 i rosn\u0105 z wydania na wydanie, wi\u0119c traktuj je jak przej\u015bciowy stan, a nie sta\u0142\u0105.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b53811&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b53811\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"410\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image4-1024x410.png\" alt=\"Playwright MCP: 24 narz\u0119dzia domy\u015blnie, 69 po w\u0142\u0105czeniu wszystkich siedmiu grup --caps\" class=\"wp-image-34750\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image4-1024x410.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image4-300x120.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image4-768x307.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image4-1536x614.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image4.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 4 Playwright MCP: 24 narz\u0119dzia domy\u015blnie, 69 po w\u0142\u0105czeniu wszystkich siedmiu grup &#8211;caps<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Playwright MCP w praktyce<\/strong><\/h3>\n\n\n\n<p>Praktyczne zastosowania, kt\u00f3re u mnie si\u0119 sprawdzi\u0142y:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eksploracja aplikacji i wyci\u0105ganie struktury HTML konkretnej strony.<\/li>\n\n\n\n<li>Generowanie page object\u00f3w dla nowego widoku.<\/li>\n\n\n\n<li>Szybkie prototypowanie scenariusza, zanim usi\u0105d\u0119 do pisania go na czysto.<\/li>\n<\/ul>\n\n\n\n<p>I tutaj wa\u017cna uwaga, bo \u0142atwo o skr\u00f3t my\u015blowy: Playwright Agents faktycznie dzia\u0142aj\u0105 na MCP, ale nie na tym serwerze, o kt\u00f3rym mowa wy\u017cej. <code>init-agents<\/code> konfiguruje wbudowany serwer o nazwie <code>playwright-test<\/code>, uruchamiany przez <code>npx playwright run-test-mcp-server<\/code>. Do tych samych narz\u0119dzi przegl\u0105darkowych dok\u0142ada takie, kt\u00f3rych samodzielny <code>@playwright\/mcp<\/code> nie ma: zapis i zatwierdzenie planu test\u00f3w, generowanie pliku testowego oraz listowanie, uruchamianie i debugowanie test\u00f3w przez test runner.<\/p>\n\n\n\n<p>Innymi s\u0142owy: <strong>to jest nadzbi\u00f3r, a nie ta sama paczka.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Playwright CLI<\/strong><\/h2>\n\n\n\n<p>I tu dochodzimy do narz\u0119dzia, kt\u00f3re moim zdaniem jest <strong>najciekawsz\u0105 nowo\u015bci\u0105 ostatnich miesi\u0119cy<\/strong>.<\/p>\n\n\n\n<p>Kr\u00f3tka uwaga na wypadek, gdyby ten skr\u00f3t by\u0142 dla Ciebie nowy. CLI to <em>command line interface<\/em>, czyli interfejs linii polece\u0144: zamiast klika\u0107 w GUI albo wywo\u0142ywa\u0107 narz\u0119dzia przez protok\u00f3\u0142, korzystasz z konsoli i wpisujesz komendy.<\/p>\n\n\n\n<p>Playwright CLI (paczka <code>@playwright\/cli<\/code>) to interfejs linii polece\u0144 do automatyzacji przegl\u0105darki, zaprojektowany z my\u015bl\u0105 o agentach koduj\u0105cych.<\/p>\n\n\n\n<p>W praktyce wygl\u0105da to tak:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n# instalacja globalna - w projekcie masz to samo pod `npx playwright cli`\nnpm install -g @playwright\/cli@latest\nplaywright-cli install-browser\n\n# instalacja skilli dla Twojego agenta\nplaywright-cli install --skills\n\n# przyk\u0142adowa sesja\nplaywright-cli open https:\/\/demo.playwright.dev\/todomvc\/ --headed\nplaywright-cli snapshot\nplaywright-cli fill e8 &quot;Write tests&quot;\nplaywright-cli press Enter\nplaywright-cli screenshot\n<\/pre><\/div>\n\n\n<p>Zwr\u00f3\u0107 uwag\u0119 na e8. To kompaktowa referencja do elementu, pochodz\u0105ca ze snapshotu drzewa dost\u0119pno\u015bci, kt\u00f3ry wyl\u0105dowa\u0142 na dysku. Nie ma tu d\u0142ugich selektor\u00f3w CSS ani ca\u0142ego drzewa w kontek\u015bcie modelu. Numery s\u0105 oczywi\u015bcie przyk\u0142adowe \u2013 u Ciebie ten sam element dostanie inny ref. Co wa\u017cniejsze: ref dzia\u0142a tylko do najbli\u017cszej zmiany strony; po nawigacji snapshot trzeba zrobi\u0107 ponownie. <strong>P\u0119tla pracy agenta wygl\u0105da wi\u0119c tak<\/strong>: zr\u00f3b snapshot, odczytaj z pliku potrzebny <code>ref<\/code>, wykonaj akcj\u0119, zr\u00f3b kolejny snapshot.<\/p>\n\n\n\n<p><strong>Przy pisaniu test\u00f3w liczy si\u0119 jednak co\u015b jeszcze, co\u015b wa\u017cniejszego ni\u017c same tokeny<\/strong>: ka\u017cda akcja wykonana przez <code>playwright-cli<\/code> zwraca odpowiadaj\u0105cy jej kod Playwrighta w TypeScripcie. Nie musisz zgadywa\u0107, jak agent trafi\u0142 w element, ani przepisywa\u0107 tego z pami\u0119ci, bo dostajesz gotow\u0105 linijk\u0119 do wklejenia do testu.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b54365&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b54365\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"564\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image5-1024x564.png\" alt=\"Sesja Playwright CLI: ref ze snapshotu na wej\u015bciu, gotowy TypeScript na wyj\u015bciu\" class=\"wp-image-34752\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image5-1024x564.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image5-300x165.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image5-768x423.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image5-1536x846.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image5.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 5 Sesja Playwright CLI: ref ze snapshotu na wej\u015bciu, gotowy TypeScript na wyj\u015bciu<\/figcaption><\/figure>\n\n\n\n<p>Warto te\u017c wiedzie\u0107, \u017ce skill dostarczany razem z CLI to nie tylko spis komend. W <code>references\/test-generation.md<\/code> znajdziesz kompletny przep\u0142yw \u201eplan \u2192 generate \u2192 heal\u201d: eksploracja aplikacji, zapis specyfikacji, wygenerowanie test\u00f3w i diagnozowanie tych, kt\u00f3re nie przechodz\u0105 \u2013 wszystko oparte na <code>--debug=cli i attach<\/code>, bez MCP i bez subagent\u00f3w. To te same trzy role co w Playwright Agents, tylko przeniesione do warstwy CLI i opisane w Markdownie zamiast w definicjach agent\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Pu\u0142apki<\/strong><\/h3>\n\n\n\n<p>Zanim to narz\u0119dzie trafi do firmowego pipeline&#8217;u,<strong>sprawd\u017a numery wersji<\/strong>: <code>@playwright\/cli<\/code> jest dzi\u015b w wersji 0.1.x, podczas gdy sam Playwright jest w wersji 1.62.1. Paczka jest przed 1.0, wi\u0119c komendy i flagi potrafi\u0105 si\u0119 zmieni\u0107 mi\u0119dzy wydaniami. W CI przypnij konkretn\u0105 wersj\u0119 zamiast korzysta\u0107 z <code>@latest<\/code>.<\/p>\n\n\n\n<p><strong>Jest tu jeszcze jedna pu\u0142apka.<\/strong> Przyk\u0142ady wy\u017cej u\u017cywaj\u0105 globalnego <code>playwright-cli<\/code>, bo tak s\u0105 napisane oficjalne skille, ale to nie to samo binarium co <code>npx playwright cli<\/code> z Twojego projektu: <code>@playwright\/cli 0.1.18<\/code> ci\u0105gnie za sob\u0105 w\u0142asnego Playwrighta w wersji <code>1.63.0-alpha<\/code>. Je\u017celi zale\u017cy Ci na jednej wersji runnera i przegl\u0105darki w ca\u0142ym repo, korzystaj z wariantu wbudowanego, a globalny zostaw do eksperyment\u00f3w.<\/p>\n\n\n\n<p>Sama dokumentacja Microsoftu stawia spraw\u0119 uczciwie: <strong>MCP i CLI to nie s\u0105 narz\u0119dzia konkurencyjne, tylko komplementarne. <\/strong>MCP nadal ma sens tam, gdzie potrzebujesz trwa\u0142ego stanu, bogatej introspekcji i iteracyjnego rozumowania nad struktur\u0105 strony. CLI wygrywa tam, gdzie agent musi jednocze\u015bnie obs\u0142ugiwa\u0107 przegl\u0105dark\u0119, du\u017ce repozytorium, testy i rozumowanie w ograniczonym oknie kontekstowym. Szczeg\u00f3\u0142owe por\u00f3wnanie, razem z liczbami, znajdziesz w kolejnej cz\u0119\u015bci artyku\u0142u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Debugowanie test\u00f3w Playwright z AI<\/strong><\/h2>\n\n\n\n<p>Czwarty obszar, kt\u00f3ry przybli\u017c\u0119, to debugowanie. I tu Playwright do\u0142o\u017cy\u0142 w ostatnich wydaniach najwi\u0119cej.<\/p>\n\n\n\n<p>W skr\u00f3cie masz dzi\u015b do dyspozycji:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Copy prompt<\/strong> \u2013 przy ka\u017cdym b\u0142\u0119dzie w raporcie HTML, w trace viewerze i w UI mode pojawia si\u0119 przycisk kopiuj\u0105cy do schowka gotowy prompt z komunikatem b\u0142\u0119du, fragmentem kodu testu i snapshotem strony. To najprostsza i, moim zdaniem, najbardziej niedoceniana funkcja, kt\u00f3ra jest z nami od 1.51.<\/li>\n\n\n\n<li><strong>Fix with AI w VS Code<\/strong> \u2013 ikona iskierek przy komunikacie b\u0142\u0119du, kt\u00f3ra analizuje kontekst i, korzystaj\u0105c z GitHub Copilota, proponuje poprawk\u0119 bezpo\u015brednio w edytorze.<\/li>\n\n\n\n<li><strong>Trace viewer<\/strong> \u2013 nadal moje g\u0142\u00f3wne narz\u0119dzie do debugowania i AI go nie zast\u0105pi\u0142o. Zast\u0105pi\u0142o natomiast \u017cmudne przepisywanie tego, co w nim widz\u0119, do okna czatu.<\/li>\n\n\n\n<li><strong><code>npx playwright trace<\/code><\/strong> \u2013 nowo\u015b\u0107 z 1.59, kt\u00f3ra rozwi\u0105zuje bardzo konkretny problem: agent nie umie klika\u0107 w GUI trace viewera, ale potrafi odpyta\u0107 trace komendami.<\/li>\n\n\n\n<li><code><strong>--debug=cli<\/strong> \u2013<\/code> druga nowo\u015b\u0107 z 1.59: test zatrzymuje si\u0119 i wystawia jako sesj\u0119 CLI, do kt\u00f3rej agent (albo Ty) mo\u017ce si\u0119 pod\u0142\u0105czy\u0107 i przej\u015b\u0107 go krok po kroku z \u017cyw\u0105 przegl\u0105dark\u0105.<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b54d4d&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b54d4d\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"694\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image6-1024x694.png\" alt=\"Copy prompt w raporcie HTML \u2013 jeden przycisk przy ka\u017cdym b\u0142\u0119dzie\" class=\"wp-image-34754\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image6-1024x694.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image6-300x203.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image6-768x521.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image6-1536x1042.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image6.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 6 Copy prompt w raporcie HTML \u2013 jeden przycisk przy ka\u017cdym b\u0142\u0119dzie<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b5524c&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b5524c\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"515\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image7-1024x515.png\" alt=\"Cztery sekcje promptu ze schowka i ich udzia\u0142 w 2834 znakach\" class=\"wp-image-34756\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image7-1024x515.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image7-300x151.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image7-768x386.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image7-1536x773.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image7.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 7 Cztery sekcje promptu ze schowka i ich udzia\u0142 w 2834 znakach<\/figcaption><\/figure>\n\n\n\n<p>Ka\u017cde z tych narz\u0119dzi nadaje si\u0119 do czego innego i ka\u017cdemu po\u015bwi\u0119cam osobny fragment w cz\u0119\u015bci drugiej artyku\u0142u.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ab6af1b557cf&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ab6af1b557cf\" class=\"wp-block-image aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"827\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image8-1024x827.png\" alt=\"Trace viewer z zaznaczon\u0105 akcj\u0105, kt\u00f3ra nie przesz\u0142a, zak\u0142adk\u0105 Errors i przyciskiem Copy prompt\" class=\"wp-image-34758\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image8-1024x827.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image8-300x242.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image8-768x620.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image8-1536x1241.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/image8.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ryc. 8 Trace viewer z zaznaczon\u0105 akcj\u0105, kt\u00f3ra nie przesz\u0142a, zak\u0142adk\u0105 Errors i przyciskiem Copy prompt<\/figcaption><\/figure>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Testing-Lab-Desktop_.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Testing-Lab-Mob_.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Testing-Lab-Desktop_.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\" >Testing &#038; QA<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                Zapewnij jako\u015b\u0107, wydajno\u015b\u0107 i bezpiecze\u0144stwo swojego oprogramowania dzi\u0119ki naszym us\u0142ugom testowania i automatyzacji test\u00f3w.\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/oferta\/testing-qa\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>Oferta Testing&amp;QA<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co z tego wynika?<\/strong><\/h2>\n\n\n\n<p>Przez ostatni rok Playwright przeszed\u0142 drog\u0119 od \u201eda si\u0119 podpi\u0105\u0107 MCP\u201d do kompletnego zestawu narz\u0119dzi agentowych w standardzie.<\/p>\n\n\n\n<p>Cztery obszary, przez kt\u00f3re przeszli\u015bmy, maj\u0105 jedn\u0105 wsp\u00f3ln\u0105 cech\u0119: <strong>\u017caden z nich nie zdejmuje z Ciebie review. <\/strong>Agenci przyspieszaj\u0105 start, MCP daje modelowi oczy, CLI mie\u015bci to wszystko w oknie kontekstowym, a debugowanie skraca drog\u0119 od czerwonego testu do przyczyny. Ale cokolwiek z nich wyjdzie \u2013 lokator, page object, szkic scenariusza, poprawka od healera \u2013 <strong>trafia do repo dopiero przez Twoje r\u0119ce. Model widzia\u0142 stron\u0119, ale nie widzia\u0142 Twoich konwencji.<\/strong><\/p>\n\n\n\n<p>W drugiej cz\u0119\u015bci artyku\u0142u zejd\u0119 poziom ni\u017cej: poka\u017c\u0119 regu\u0142y, kt\u00f3re trzeba dopisa\u0107 generatorowi i healerowi, dwa tryby awarii healera na konkretnych diffach, ile naprawd\u0119 kosztuje MCP w por\u00f3wnaniu z CLI, o czym trzeba pami\u0119ta\u0107, wpuszczaj\u0105c agenta na realn\u0105 aplikacj\u0119, oraz jak wygl\u0105da debugowanie testu razem z agentem.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;34743&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;2&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Playwright i AI: Agents, MCP, CLI i debugowanie test\u00f3w. Co dzi\u015b naprawd\u0119 dzia\u0142a?&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W artykule przybli\u017c\u0119 Ci, co Playwright potrafi dzi\u015b w po\u0142\u0105czeniu z AI. Chc\u0119 te\u017c odpowiedzie\u0107 na pytanie, kt\u00f3re ostatnio do\u015b\u0107 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/playwright-i-ai-agents-mcp-cli-i-debugowanie-testow-co-dzis-naprawde-dziala\/\">Continued<\/a><\/p>\n","protected":false},"author":215,"featured_media":34760,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[15041,12795,1579,1546,682],"class_list":["post-34743","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-agentic-ai","tag-agentic-testing","tag-playwright","tag-przeglad-narzedzi","tag-artificial-intelligence"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/09\/Coding-2.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/215"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=34743"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34743\/revisions"}],"predecessor-version":[{"id":34764,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34743\/revisions\/34764"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/34760"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=34743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=34743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=34743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}