{"id":31174,"date":"2025-10-06T21:04:35","date_gmt":"2025-10-06T18:04:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/"},"modified":"2025-10-06T21:04:35","modified_gmt":"2025-10-06T18:04:35","slug":"playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/","title":{"rendered":"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma"},"content":{"rendered":"<style>\n  \/* Temel yan\u0131t veren stil ayarlar\u0131 *\/\n  body {\n    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n    line-height: 1.7;\n    color: #333;\n    max-width: 1000px;\n    margin: 0 auto;\n    padding: 20px;\n    background-color: #f9f9f9;\n  }\n  h2, h3 {\n    color: #2c3e50;\n    margin-top: 35px;\n    margin-bottom: 15px;\n  }\n  h2 {\n    font-size: 2em;\n    border-bottom: 2px solid #3498db;\n    padding-bottom: 10px;\n  }\n  h3 {\n    font-size: 1.5em;\n    color: #3498db;\n  }\n  p {\n    margin-bottom: 1em;\n  }\n  pre {\n    background-color: #e8e8e8;\n    padding: 18px;\n    border-radius: 8px;\n    overflow-x: auto;\n    margin: 20px 0;\n    font-family: 'Consolas', 'Monaco', 'Lucida Console', monospace;\n    font-size: 0.9em;\n    line-height: 1.4;\n  }\n  code {\n    font-family: 'Consolas', 'Monaco', 'Lucida Console', monospace;\n    background-color: #eee;\n    padding: 2px 4px;\n    border-radius: 3px;\n  }\n  table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 25px 0;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n  }\n  table, th, td {\n    border: 1px solid #ddd;\n    padding: 12px;\n    text-align: left;\n  }\n  th {\n    background-color: #3498db;\n    color: white;\n    font-weight: bold;\n  }\n  tr:nth-child(even) {\n    background-color: #f2f2f2;\n  }\n  tr:hover {\n    background-color: #e6f7ff;\n  }\n  ul, ol {\n    margin-left: 20px;\n    margin-bottom: 1em;\n  }\n  li {\n    margin-bottom: 0.5em;\n  }\n  .expert-tip {\n    background-color: #e6f7ff;\n    border-left: 6px solid #3498db;\n    padding: 20px;\n    margin: 30px 0;\n    font-style: italic;\n    color: #2c3e50;\n    border-radius: 5px;\n    box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n  }\n  \/* Mobil uyumluluk i\u00e7in medya sorgusu \u00f6rne\u011fi *\/\n  @media (max-width: 768px) {\n    body {\n      padding: 15px;\n    }\n    h2 {\n      font-size: 1.8em;\n    }\n    h3 {\n      font-size: 1.3em;\n    }\n    table, thead, tbody, th, td, tr {\n      display: block;\n    }\n    thead tr {\n      position: absolute;\n      top: -9999px;\n      left: -9999px;\n    }\n    tr {\n      border: 1px solid #ccc;\n      margin-bottom: 10px;\n    }\n    td {\n      border: none;\n      border-bottom: 1px solid #eee;\n      position: relative;\n      padding-left: 50%;\n      text-align: right;\n    }\n    td:before {\n      position: absolute;\n      top: 12px;\n      left: 12px;\n      width: 45%;\n      padding-right: 10px;\n      white-space: nowrap;\n      text-align: left;\n      font-weight: bold;\n      color: #555;\n    }\n    \/* Her bir td i\u00e7in data-label \u00f6zniteli\u011fi kullanmak en iyisidir *\/\n    td:nth-of-type(1):before { content: \"Ajan:\"; }\n    td:nth-of-type(2):before { content: \"G\u00f6rev:\"; }\n    td:nth-of-type(3):before { content: \"\u00d6rnek \u0130\u015flev:\"; }\n  }\n<\/style>\n<p>Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright&#8217;\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi ba\u015ftan sona nas\u0131l optimize edece\u011finizi, h\u0131zl\u0131 ve hatas\u0131z test senaryolar\u0131 olu\u015fturup s\u00fcrd\u00fcrece\u011finizi ke\u015ffedin. Bu teknik makale, ger\u00e7ek d\u00fcnya \u00f6rnekleri ile Playwright&#8217;\u0131n g\u00fcc\u00fcn\u00fc anlaman\u0131za yard\u0131mc\u0131 olacak.<\/p>\n<p>Modern web uygulamalar\u0131, her ge\u00e7en g\u00fcn daha karma\u015f\u0131k hale geliyor. Dinamik i\u00e7erikler, farkl\u0131 cihazlarda responsive tasar\u0131mlar ve s\u00fcrekli g\u00fcncellemeler, web otomasyonu s\u00fcre\u00e7lerini zorlu bir g\u00f6rev haline getiriyor. Geleneksel otomasyon yakla\u015f\u0131mlar\u0131, bu h\u0131zl\u0131 de\u011fi\u015fime ayak uydurmakta zorlanabiliyor; test senaryolar\u0131 s\u0131k s\u0131k k\u0131r\u0131l\u0131yor, bak\u0131m maliyetleri art\u0131yor ve geli\u015ftirme d\u00f6ng\u00fcs\u00fc yava\u015fl\u0131yor. \u0130\u015fte tam da bu noktada, Playwright gibi g\u00fc\u00e7l\u00fc bir taray\u0131c\u0131 otomasyon arac\u0131 ile Yapay Zeka (YZ) destekli ajanlar\u0131n entegrasyonu, otomasyonun gelece\u011fini yeniden \u015fekillendiriyor.<\/p>\n<p>Playwright ajanlar\u0131, otomasyon s\u00fcre\u00e7lerini insan m\u00fcdahalesine olan ihtiyac\u0131 en aza indirerek, daha ak\u0131ll\u0131, esnek ve kendi kendine yeten sistemler olu\u015fturmay\u0131 hedefler. Bu ajanlar, manuel olarak yap\u0131lmas\u0131 gereken planlama, kodlama ve hata ay\u0131klama gibi g\u00f6revleri otomatikle\u015ftirerek, otomasyon m\u00fchendislerinin daha stratejik i\u015flere odaklanmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir web uygulamas\u0131n\u0131n kay\u0131t formunu test etmek istedi\u011finizde, geleneksel y\u00f6ntemde ad\u0131mlar\u0131 manuel olarak belirler, kodu kendiniz yazar ve hata olu\u015ftu\u011funda neyin yanl\u0131\u015f gitti\u011fini bulup d\u00fczeltirsiniz. Ancak ajan tabanl\u0131 bir sistemde, siz sadece &#8220;Kullan\u0131c\u0131 kay\u0131t i\u015flemini test et&#8221; dersiniz ve sistem gerisini halleder. Bu, otomasyonu sadece bir ara\u00e7 olmaktan \u00e7\u0131kar\u0131p, adeta bir ekip \u00fcyesi haline getirir.<\/p>\n<p>Bu yakla\u015f\u0131m\u0131n temel amac\u0131, otomasyonun &#8220;yarat\u0131m ve bak\u0131m&#8221; y\u00fck\u00fcn\u00fc hafifletmektir. Geli\u015ftiriciler ve test m\u00fchendisleri, s\u0131k\u0131c\u0131 ve tekrarlayan g\u00f6revler yerine, uygulaman\u0131n mimarisi, performans\u0131 veya yeni \u00f6zelliklerin test edilebilirli\u011fi gibi daha \u00fcst d\u00fczey konulara odaklanabilirler. Playwright ajanlar\u0131, \u00f6zellikle s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) ortamlar\u0131nda testlerin daha h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayarak, \u00fcr\u00fcn kalitesini art\u0131r\u0131r ve pazara \u00e7\u0131k\u0131\u015f s\u00fcresini k\u0131salt\u0131r. B\u00f6ylece, otomasyon art\u0131k sadece bir zorunluluk de\u011fil, rekabet avantaj\u0131 sa\u011flayan stratejik bir yat\u0131r\u0131m haline gelir. \u00d6n\u00fcm\u00fczdeki b\u00f6l\u00fcmlerde, bu ajanlar\u0131n her birinin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 ve nas\u0131l \u00e7al\u0131\u015ft\u0131klar\u0131n\u0131 detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z.<\/p>\n<h3>Playwright Nedir ve Otomasyon D\u00fcnyas\u0131ndaki Yeri Neresidir?<\/h3>\n<p>Playwright, Microsoft taraf\u0131ndan geli\u015ftirilen modern, a\u00e7\u0131k kaynakl\u0131 bir web otomasyon k\u00fct\u00fcphanesidir. Chromium (Google Chrome, Microsoft Edge), Firefox ve WebKit (Safari) gibi pop\u00fcler taray\u0131c\u0131lar \u00fczerinde u\u00e7tan uca (end-to-end) testler \u00e7al\u0131\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Node.js (JavaScript\/TypeScript), Python, Java ve .NET gibi bir\u00e7ok programlama dili deste\u011fi sunar, bu da onu geni\u015f bir geli\u015ftirici kitlesi i\u00e7in cazip k\u0131lar. Playwright, h\u0131zl\u0131, g\u00fcvenilir ve taray\u0131c\u0131lar aras\u0131 testler yazmak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 seti sunar.<\/p>\n<p>Playwright&#8217;\u0131 di\u011fer otomasyon ara\u00e7lar\u0131ndan ay\u0131ran temel \u00f6zellikler \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Taray\u0131c\u0131lar Aras\u0131 Destek:<\/strong> Tek bir API ile Chromium, Firefox ve WebKit&#8217;i destekler, bu da farkl\u0131 taray\u0131c\u0131larda tutarl\u0131 testler yazmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Otomatik Beklemeler:<\/strong> Sayfa elementlerinin g\u00f6r\u00fcn\u00fcr, etkin veya etkile\u015fime haz\u0131r olmas\u0131n\u0131 otomatik olarak bekler, b\u00f6ylece manuel beklemelerin neden oldu\u011fu flakiness (tutars\u0131z test sonu\u00e7lar\u0131) oran\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>Paralel \u00c7al\u0131\u015ft\u0131rma:<\/strong> Testleri farkl\u0131 taray\u0131c\u0131larda veya farkl\u0131 ortamlarda e\u015f zamanl\u0131 olarak \u00e7al\u0131\u015ft\u0131rabilir, bu da test s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<\/li>\n<li><strong>Test \u0130zleme ve Hata Ay\u0131klama:<\/strong> Testlerin ekran g\u00f6r\u00fcnt\u00fclerini, video kay\u0131tlar\u0131n\u0131 ve DOM snapshot&#8217;lar\u0131n\u0131 otomatik olarak yakalar, bu da hata ay\u0131klama s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca Playwright Inspector gibi ara\u00e7larla g\u00f6rsel hata ay\u0131klama imkan\u0131 sunar.<\/li>\n<li><strong>Geli\u015fmi\u015f Etkile\u015fimler:<\/strong> Dosya y\u00fckleme, s\u00fcr\u00fckle-b\u0131rak, klavye\/fare etkile\u015fimleri gibi karma\u015f\u0131k senaryolar\u0131 destekler.<\/li>\n<li><strong>\u0130zolasyon ve Performans:<\/strong> Her test i\u00e7in tamamen izole edilmi\u015f bir taray\u0131c\u0131 ba\u011flam\u0131 (browser context) olu\u015fturur, b\u00f6ylece testler birbirini etkilemez ve temiz bir ortamda \u00e7al\u0131\u015f\u0131r. Bu, test performans\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Otomasyon d\u00fcnyas\u0131nda Playwright&#8217;\u0131n yeri, \u00f6zellikle dinamik ve modern web uygulamalar\u0131n\u0131n test edilmesi konusunda lider bir konumdad\u0131r. Geli\u015ftiricilerin h\u0131zl\u0131 geri bildirim almas\u0131n\u0131 sa\u011flarken, ayn\u0131 zamanda son kullan\u0131c\u0131n\u0131n deneyimini taklit eden ger\u00e7ek\u00e7i testler yazmalar\u0131na olanak tan\u0131r. Playwright&#8217;\u0131n sa\u011flam mimarisi ve geni\u015fletilebilir yap\u0131s\u0131, yukar\u0131da bahsedece\u011fimiz ak\u0131ll\u0131 ajanlar\u0131n geli\u015ftirilmesi i\u00e7in m\u00fckemmel bir temel sa\u011flar. Bu sayede, test otomasyonu sadece kod yazmaktan ibaret olmaktan \u00e7\u0131k\u0131p, ak\u0131ll\u0131 sistemlerin otomasyonu y\u00f6netti\u011fi bir evrime do\u011fru ilerlemektedir.<\/p>\n<h2>Planlay\u0131c\u0131 Ajan (Planner Agent): Otomasyon Stratejinizi Nas\u0131l Olu\u015fturursunuz?<\/h2>\n<p>Bir web otomasyon projesine ba\u015flarken en kritik a\u015famalardan biri, neyin test edilece\u011fini ve bu testlerin hangi ad\u0131mlarla ger\u00e7ekle\u015ftirilece\u011fini planlamakt\u0131r. Geleneksel yakla\u015f\u0131mlarda bu s\u00fcre\u00e7 genellikle manuel olarak, test m\u00fchendislerinin tecr\u00fcbeleri ve gereksinim dok\u00fcmanlar\u0131n\u0131 yorumlamalar\u0131yla ilerler. Ancak karma\u015f\u0131k uygulamalarda veya s\u0131k de\u011fi\u015fen senaryolarda bu planlama a\u015famas\u0131 olduk\u00e7a zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k olabilir. \u0130\u015fte Planner Agent, bu sorunu \u00e7\u00f6zmek i\u00e7in devreye girer. Planner Agent, temel olarak, do\u011fal dil girdilerini (\u00f6rne\u011fin, &#8220;Kullan\u0131c\u0131 sisteme giri\u015f yapmal\u0131 ve profilini g\u00f6r\u00fcnt\u00fclemeli&#8221;) alarak, bu iste\u011fi otomasyon ad\u0131mlar\u0131na d\u00f6n\u00fc\u015ft\u00fcren ak\u0131ll\u0131 bir sistemdir.<\/p>\n<p>Planner Agent&#8217;\u0131n \u00e7al\u0131\u015fma prensibi, B\u00fcy\u00fck Dil Modelleri (LLM&#8217;ler) veya karma\u015f\u0131k kural tabanl\u0131 algoritmalarla desteklenir. Bu ajan, bir otomasyon senaryosunun hedeflerini anlar ve bu hedeflere ula\u015fmak i\u00e7in mant\u0131kl\u0131 bir ad\u0131m dizisi olu\u015fturur. \u00d6rne\u011fin, &#8220;e-ticaret sitesinde \u00fcr\u00fcn arama ve sepete ekleme&#8221; gibi bir senaryo verildi\u011finde, Planner Agent \u015fu ad\u0131mlar\u0131 \u00e7\u0131karabilir:<\/p>\n<ol>\n<li>Taray\u0131c\u0131y\u0131 ba\u015flat ve ana sayfaya git.<\/li>\n<li>Arama \u00e7ubu\u011funu bul ve \u00fcr\u00fcn ad\u0131n\u0131 (\u00f6rn. &#8220;laptop&#8221;) gir.<\/li>\n<li>Arama d\u00fc\u011fmesine t\u0131kla veya Enter tu\u015funa bas.<\/li>\n<li>Arama sonu\u00e7lar\u0131n\u0131n y\u00fcklendi\u011fini do\u011frula.<\/li>\n<li>\u0130lk \u00fcr\u00fcne t\u0131kla.<\/li>\n<li>\u00dcr\u00fcn detay sayfas\u0131n\u0131n y\u00fcklendi\u011fini do\u011frula.<\/li>\n<li>&#8220;Sepete Ekle&#8221; d\u00fc\u011fmesini bul ve t\u0131kla.<\/li>\n<li>Sepetin g\u00fcncellendi\u011fini veya \u00fcr\u00fcn\u00fcn sepete eklendi\u011fini do\u011frulayan bir mesaj\u0131n g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc kontrol et.<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar, daha sonra Generator Agent taraf\u0131ndan ger\u00e7ek Playwright koduna d\u00f6n\u00fc\u015ft\u00fcr\u00fclecek bir yol haritas\u0131 g\u00f6revi g\u00f6r\u00fcr. Planner Agent, sadece ad\u0131mlar\u0131 listelemekle kalmaz, ayn\u0131 zamanda bu ad\u0131mlar\u0131n s\u0131ras\u0131n\u0131, ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve olas\u0131 ko\u015fullu dallanmalar\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurabilir. \u00d6rne\u011fin, bir &#8220;\u00f6deme&#8221; senaryosunda, &#8220;\u00f6deme y\u00f6ntemi se\u00e7&#8221; ad\u0131m\u0131, &#8220;kredi kart\u0131 bilgileri girildi\u011finde&#8221; veya &#8220;PayPal se\u00e7ildi\u011finde&#8221; gibi farkl\u0131 alt ad\u0131mlara ayr\u0131labilir. Bu sayede, Planner Agent, otomasyon stratejisinin temelini olu\u015fturan, mant\u0131ksal olarak do\u011fru ve kapsaml\u0131 bir plan sunar.<\/p>\n<p>Planner Agent&#8217;\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri, test senaryosu tasar\u0131m\u0131n\u0131 demokratikle\u015ftirmesidir. Teknik olmayan i\u015f payda\u015flar\u0131 bile do\u011fal dil kullanarak test fikirlerini iletebilir ve bu fikirler h\u0131zla otomasyon planlar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir. Bu, test s\u00fcrecinin daha erken a\u015famalar\u0131nda ba\u015flanmas\u0131n\u0131 (shift-left testing) ve i\u015f gereksinimlerinin do\u011frudan otomasyon testlerine yans\u0131mas\u0131n\u0131 sa\u011flar. Sonu\u00e7 olarak, Playwright tabanl\u0131 test otomasyon projelerinde Planner Agent, zaman kazand\u0131ran, hata oran\u0131n\u0131 azaltan ve daha kapsaml\u0131 test stratejileri olu\u015fturulmas\u0131na yard\u0131mc\u0131 olan vazge\u00e7ilmez bir bile\u015fendir.<\/p>\n<pre><code>\n\/\/ Planner Agent'\u0131n basitle\u015ftirilmi\u015f bir kullan\u0131m senaryosu\nconst playwright = require('playwright'); \/\/ Playwright k\u00fct\u00fcphanesinin import edildi\u011fini varsayal\u0131m.\nconst { OpenAI } = require('openai'); \/\/ Veya benzer bir LLM k\u00fct\u00fcphanesi\n\n\/\/ Bu bir sim\u00fclasyon fonksiyonudur. Ger\u00e7ek bir senaryoda bu k\u0131s\u0131m bir AI modeli ile etkile\u015fime girer.\nasync function planAutomationScenario(scenarioDescription) {\n    console.log(<code>\\n--------------------------------------------<\/code>);\n    console.log(<code>Planner Ajan\u0131: Otomasyon senaryosu planlan\u0131yor: \"${scenarioDescription}\"<\/code>);\n    console.log(<code>--------------------------------------------<\/code>);\n\n    \/\/ Burada yapay zeka (LLM) veya kural tabanl\u0131 bir mant\u0131kla ad\u0131m ad\u0131m plan olu\u015fturulur.\n    \/\/ \u00d6rne\u011fin, bir LLM'e \"Kullan\u0131c\u0131 sisteme giri\u015f yapmal\u0131\" komutunu verirsiniz.\n    \/\/ LLM size bu ad\u0131mlar\u0131 JSON veya benzeri bir formatta d\u00f6nd\u00fcr\u00fcr.\n    let steps = [];\n\n    if (scenarioDescription.includes(\"sisteme ba\u015far\u0131l\u0131 bir \u015fekilde giri\u015f yapmas\u0131\")) {\n        steps = [\n            \"Taray\u0131c\u0131y\u0131 ba\u015flat ve belirtilen giri\u015f sayfas\u0131na git.\",\n            \"Kullan\u0131c\u0131 ad\u0131 giri\u015f alan\u0131n\u0131 bul ve 'testkullanici' ile doldur.\",\n            \"\u015eifre giri\u015f alan\u0131n\u0131 bul ve 'testparola' ile doldur.\",\n            \"Giri\u015f yap d\u00fc\u011fmesine t\u0131kla.\",\n            \"Giri\u015fin ba\u015far\u0131l\u0131 oldu\u011funu g\u00f6steren bir mesaj\u0131n veya dashboard elementinin g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc do\u011frula.\",\n            \"Taray\u0131c\u0131y\u0131 kapat.\"\n        ];\n    } else if (scenarioDescription.includes(\"\u00fcr\u00fcn aramas\u0131 yapmas\u0131 ve sepete eklemesi\")) {\n        steps = [\n            \"Taray\u0131c\u0131y\u0131 ba\u015flat ve ana sayfaya git.\",\n            \"Arama \u00e7ubu\u011funu bul ve 'laptop' kelimesini yaz.\",\n            \"Arama d\u00fc\u011fmesine t\u0131kla.\",\n            \"Arama sonu\u00e7lar\u0131 sayfas\u0131n\u0131n y\u00fcklendi\u011fini do\u011frula.\",\n            \"\u0130lk \u00fcr\u00fcne t\u0131kla.\",\n            \"\u00dcr\u00fcn detay sayfas\u0131n\u0131n y\u00fcklendi\u011fini do\u011frula.\",\n            \"Sepete Ekle d\u00fc\u011fmesine t\u0131kla.\",\n            \"Sepete ekleme i\u015fleminin ba\u015far\u0131l\u0131 oldu\u011funu g\u00f6steren bir bildirimin g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc do\u011frula.\",\n            \"Taray\u0131c\u0131y\u0131 kapat.\"\n        ];\n    } else {\n        console.warn(\"Belirtilen senaryo i\u00e7in \u00f6nceden tan\u0131mlanm\u0131\u015f bir plan bulunamad\u0131. Genel ad\u0131mlar olu\u015fturuluyor.\");\n        steps = [\n            \"Taray\u0131c\u0131y\u0131 ba\u015flat ve ba\u015flang\u0131\u00e7 URL'sine git.\",\n            \"Sayfadaki temel etkile\u015fimleri ger\u00e7ekle\u015ftir.\",\n            \"Beklenen sonucun olu\u015ftu\u011funu do\u011frula.\",\n            \"Taray\u0131c\u0131y\u0131 kapat.\"\n        ];\n    }\n\n    console.log(\"Olu\u015fturulan Ad\u0131mlar:\");\n    steps.forEach((step, index) => console.log(<code>${index + 1}. ${step}<\/code>));\n    console.log(<code>--------------------------------------------<\/code>);\n    return steps;\n}\n\n\/\/ \u00d6rnek kullan\u0131m (makalede bu fonksiyonun daha sonra entegre ak\u0131\u015fta kullan\u0131laca\u011f\u0131 belirtilecek)\n\/\/ planAutomationScenario(\"Kullan\u0131c\u0131n\u0131n sisteme ba\u015far\u0131l\u0131 bir \u015fekilde giri\u015f yapmas\u0131\").then(steps => {\n\/\/     console.log(\"\\nPlanlama tamamland\u0131. Bir sonraki a\u015fama kod \u00fcretimi.\");\n\/\/ });\n\n<\/pre>\n<p><\/code><\/p>\n<h2>\u00dcretici Ajan (Generator Agent): Planlar\u0131 Koda D\u00f6n\u00fc\u015ft\u00fcrme Sanat\u0131<\/h2>\n<p>Planner Agent taraf\u0131ndan olu\u015fturulan detayl\u0131 plan veya ad\u0131m dizisi, tek ba\u015f\u0131na bir otomasyon testi olu\u015fturmak i\u00e7in yeterli de\u011fildir. Bu plan\u0131n, taray\u0131c\u0131n\u0131n anlayabilece\u011fi ve Playwright k\u00fct\u00fcphanesi arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131labilecek ger\u00e7ek koda d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi gerekir. \u0130\u015fte burada Generator Agent devreye girer. Generator Agent, Planner'\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 alarak, Playwright'\u0131n API'lerini kullanarak otomatik olarak \u00e7al\u0131\u015fan, hatas\u0131z ve okunabilir test kodlar\u0131 \u00fcreten ak\u0131ll\u0131 bir bile\u015fendir.<\/p>\n<p>Generator Agent'\u0131n g\u00fcc\u00fc, hem \u00f6nceden tan\u0131mlanm\u0131\u015f Playwright kod kal\u0131plar\u0131n\u0131 kullanabilmesinde hem de YZ destekli yakla\u015f\u0131mlarla (\u00f6zellikle B\u00fcy\u00fck Dil Modelleri) daha karma\u015f\u0131k senaryolar i\u00e7in \u00f6zel kodlar \u00fcretebilmesinde yatar. \u00d6rne\u011fin, Planner \"Kullan\u0131c\u0131 ad\u0131 giri\u015f alan\u0131n\u0131 bul ve doldur\" dedi\u011finde, Generator Agent bu talimat\u0131 Playwright'\u0131n <code>page.fill()<\/code> metoduna \u00e7evirir. Ancak, sadece bu kadarla kalmaz; do\u011fru se\u00e7icileri (selector) tahmin etme, elementlerin y\u00fcklenmesini bekleme (<code>page.waitForSelector()<\/code>) ve hata durumunda uygun istisnalar\u0131 ele alma gibi n\u00fcanslar\u0131 da koduna dahil edebilir. Bu sayede \u00fcretilen kod, sadece \u00e7al\u0131\u015fmakla kalmaz, ayn\u0131 zamanda robust (sa\u011flam) ve s\u00fcrd\u00fcr\u00fclebilir olur.<\/p>\n<p>Ger\u00e7ek bir senaryoda, Generator Agent a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 ger\u00e7ekle\u015ftirebilir:<\/p>\n<ol>\n<li>Planner'dan gelen her bir ad\u0131m\u0131 analiz eder.<\/li>\n<li>Her ad\u0131ma kar\u015f\u0131l\u0131k gelen en uygun Playwright metodunu ve parametrelerini belirler.<\/li>\n<li>Sayfa elementlerini tan\u0131mlamak i\u00e7in CSS se\u00e7iciler, XPath veya metin bazl\u0131 se\u00e7iciler (<code>:has-text()<\/code>) gibi y\u00f6ntemleri kullan\u0131r. Bu se\u00e7icileri belirlerken, ge\u00e7mi\u015f test verilerinden, sayfan\u0131n DOM yap\u0131s\u0131ndan veya hatta anl\u0131k sayfa analiziyle YZ destekli tahminlerden faydalanabilir.<\/li>\n<li>\u00dcretilen kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131rmak i\u00e7in yorumlar, de\u011fi\u015fkenler ve uygun formatlama ekler.<\/li>\n<li>Kodun \u00e7al\u0131\u015ft\u0131r\u0131labilir bir Playwright test dosyas\u0131 format\u0131nda (\u00f6rn. JavaScript veya TypeScript) \u00e7\u0131kt\u0131s\u0131n\u0131 verir.<\/li>\n<\/ol>\n<p>Generator Agent'\u0131n sundu\u011fu en b\u00fcy\u00fck avantaj, otomasyon testlerini yazma s\u00fcresini dramatik bir \u015fekilde k\u0131saltmas\u0131d\u0131r. Geli\u015ftiriciler ve test m\u00fchendisleri, s\u0131k\u0131c\u0131 ve tekrarlayan kod yazma i\u015flemlerinden kurtulur. Bu, \u00f6zellikle h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fclerine sahip projelerde ve s\u00fcrekli de\u011fi\u015fen UI'lara sahip uygulamalarda b\u00fcy\u00fck bir zaman tasarrufu sa\u011flar. Dahas\u0131, YZ destekli Generator Agent'lar, insan hatalar\u0131ndan kaynaklanabilecek yaz\u0131m yanl\u0131\u015flar\u0131n\u0131 veya mant\u0131k hatalar\u0131n\u0131 minimuma indirerek, \u00fcretilen kodun kalitesini art\u0131r\u0131r. Bu, test otomasyonunda h\u0131z, verimlilik ve g\u00fcvenilirli\u011fi bir araya getirerek, projelerin daha h\u0131zl\u0131 ve hatas\u0131z bir \u015fekilde tamamlanmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<pre><code>\n\/\/ Generator Agent'\u0131n basitle\u015ftirilmi\u015f bir kod \u00fcretim senaryosu\nasync function generatePlaywrightCode(plannedSteps, url) {\n    console.log(<code>\\n--------------------------------------------<\/code>);\n    console.log(<code>Generator Ajan\u0131: Planlar\u0131 koda d\u00f6n\u00fc\u015ft\u00fcr\u00fcyor...<\/code>);\n    console.log(<code>--------------------------------------------<\/code>);\n\n    let code = <code>const { chromium, firefox, webkit } = require(&#039;playwright&#039;);\n\n\/\/ Otomatik olu\u015fturulan Playwright testi\n\/\/ L\u00fctfen bu kodu ger\u00e7ek bir senaryoda g\u00fcvenli bir \u015fekilde \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun.\n\n(async () => {\n    let browser;\n    try {\n        \/\/ Taray\u0131c\u0131 se\u00e7imi, \u00f6rne\u011fin Chromium\n        browser = await chromium.launch({ headless: true, timeout: 60000 }); \/\/ Gizli modda \u00e7al\u0131\u015ft\u0131r\n        const context = await browser.newContext();\n        const page = await context.newPage();\n\n        console.log(&#039;Taray\u0131c\u0131 ba\u015flat\u0131ld\u0131 ve sayfa a\u00e7\u0131ld\u0131.&#039;);\n\n        await page.goto(&#039;${url}&#039;, { waitUntil: &#039;domcontentloaded&#039; });\n        console.log(\\<\/code>URL'ye gidildi: ${url}\\<code>);<\/code>;\n\n    plannedSteps.forEach(step => {\n        \/\/ Her ad\u0131m i\u00e7in uygun Playwright API \u00e7a\u011fr\u0131lar\u0131n\u0131 ekleme\n        if (step.includes(\"URL'ye git\")) {\n            \/\/ Zaten ba\u015flang\u0131\u00e7ta ekledik, tekrardan ka\u00e7\u0131nabiliriz.\n        } else if (step.includes(\"Kullan\u0131c\u0131 ad\u0131 giri\u015f alan\u0131n\u0131 bul ve\")) {\n            code += <code>await page.fill(&#039;input[name=\"username\"]&#039;, &#039;testkullanici&#039;);\\n<\/code>;\n            code += <code>console.log(&#039;Kullan\u0131c\u0131 ad\u0131 dolduruldu.&#039;);\\n<\/code>;\n        } else if (step.includes(\"\u015eifre giri\u015f alan\u0131n\u0131 bul ve\")) {\n            code += <code>await page.fill(&#039;input[name=\"password\"]&#039;, &#039;testparola&#039;);\\n<\/code>;\n            code += <code>console.log(&#039;\u015eifre dolduruldu.&#039;);\\n<\/code>;\n        } else if (step.includes(\"Giri\u015f yap d\u00fc\u011fmesine t\u0131kla\")) {\n            code += <code>await page.click(&#039;button:has-text(\"Giri\u015f Yap\")&#039;);\\n<\/code>;\n            code += <code>console.log(&#039;Giri\u015f yap d\u00fc\u011fmesine t\u0131kland\u0131.&#039;);\\n<\/code>;\n        } else if (step.includes(\"ba\u015far\u0131l\u0131 oldu\u011funu g\u00f6steren bir mesaj\u0131n veya dashboard elementinin g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc do\u011frula\")) {\n            code += <code>await page.waitForSelector(&#039;.success-message&#039;, { state: &#039;visible&#039;, timeout: 10000 });\\n<\/code>;\n            code += <code>console.log(&#039;Giri\u015f ba\u015far\u0131l\u0131 mesaj\u0131\/dashboard elementi g\u00f6r\u00fcnt\u00fclendi.&#039;);\\n<\/code>;\n            code += <code>\/\/ Alternatif olarak, sayfan\u0131n belirli bir URL&#039;ye y\u00f6nlendirildi\u011fini de kontrol edebiliriz.\n    \/\/ await page.waitForURL(&#039;**\/dashboard&#039;, { timeout: 10000 });\\n<\/code>;\n        } else if (step.includes(\"Arama \u00e7ubu\u011funu bul ve\")) {\n            code += <code>await page.fill(&#039;input[name=\"search\"]&#039;, &#039;laptop&#039;);\\n<\/code>;\n            code += <code>console.log(&#039;Arama \u00e7ubu\u011funa &#039;laptop&#039; yaz\u0131ld\u0131.&#039;);\\n<\/code>;\n        } else if (step.includes(\"Arama d\u00fc\u011fmesine t\u0131kla\")) {\n            code += <code>await page.click(&#039;button[type=\"submit\"]:has-text(\"Ara\")&#039;);\\n<\/code>;\n            code += <code>console.log(&#039;Arama d\u00fc\u011fmesine t\u0131kland\u0131.&#039;);\\n<\/code>;\n        } else if (step.includes(\"Arama sonu\u00e7lar\u0131 sayfas\u0131n\u0131n y\u00fcklendi\u011fini do\u011frula\")) {\n            code += <code>await page.waitForSelector(&#039;.search-results-list&#039;, { state: &#039;visible&#039;, timeout: 10000 });\\n<\/code>;\n            code += <code>console.log(&#039;Arama sonu\u00e7lar\u0131 g\u00f6r\u00fcnt\u00fclendi.&#039;);\\n<\/code>;\n        } else if (step.includes(\"\u0130lk \u00fcr\u00fcne t\u0131kla\")) {\n            code += <code>await page.click(&#039;.search-results-list a:first-child&#039;);\\n<\/code>;\n            code += <code>console.log(&#039;\u0130lk \u00fcr\u00fcne t\u0131kland\u0131.&#039;);\\n<\/code>;\n        } else if (step.includes(\"\u00dcr\u00fcn detay sayfas\u0131n\u0131n y\u00fcklendi\u011fini do\u011frula\")) {\n            code += <code>await page.waitForSelector(&#039;.product-details&#039;, { state: &#039;visible&#039;, timeout: 10000 });\\n<\/code>;\n            code += <code>console.log(&#039;\u00dcr\u00fcn detay sayfas\u0131 y\u00fcklendi.&#039;);\\n<\/code>;\n        } else if (step.includes(\"Sepete Ekle d\u00fc\u011fmesine t\u0131kla\")) {\n            code += <code>await page.click(&#039;button:has-text(\"Sepete Ekle\")&#039;);\\n<\/code>;\n            code += <code>console.log(&#039;\u00dcr\u00fcn sepete eklendi.&#039;);\\n<\/code>;\n        } else if (step.includes(\"Sepete ekleme i\u015fleminin ba\u015far\u0131l\u0131 oldu\u011funu g\u00f6steren bir bildirimin g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc do\u011frula\")) {\n            code += <code>await page.waitForSelector(&#039;.add-to-cart-success-message&#039;, { state: &#039;visible&#039;, timeout: 10000 });\\n<\/code>;\n            code += <code>console.log(&#039;Sepete ekleme ba\u015far\u0131l\u0131 bildirimi g\u00f6r\u00fcnt\u00fclendi.&#039;);\\n<\/code>;\n        } else if (step.includes(\"Taray\u0131c\u0131y\u0131 kapat\")) {\n            \/\/ En sonda halledilecek.\n        } else {\n            code += <code>\/\/ Uyar\u0131: &#039;${step}&#039; ad\u0131m\u0131 i\u00e7in Playwright kodu otomatik olarak \u00fcretilemedi.\\n<\/code>;\n            code += <code>\/\/ Manuel m\u00fcdahale gerekebilir.\\n<\/code>;\n        }\n    });\n\n    code += <code>console.log(&#039;Test ba\u015far\u0131yla tamamland\u0131.&#039;);\n    } catch (error) {\n        console.error(&#039;Test s\u0131ras\u0131nda bir hata olu\u015ftu:&#039;, error);\n        \/\/ Hata an\u0131nda ekran g\u00f6r\u00fcnt\u00fcs\u00fc almak yard\u0131mc\u0131 olabilir\n        if (browser) {\n            const page = await browser.newPage(); \/\/ Hata an\u0131nda sayfa hala eri\u015filebilir mi kontrol etmek gerek\n            await page.screenshot({ path: &#039;failure_screenshot.png&#039; });\n            console.log(&#039;Hata ekran g\u00f6r\u00fcnt\u00fcs\u00fc kaydedildi: failure_screenshot.png&#039;);\n        }\n        process.exit(1); \/\/ Hata durumunda uygulama \u00e7\u0131k\u0131\u015f\u0131\n    } finally {\n        if (browser) {\n            await browser.close();\n            console.log(&#039;Taray\u0131c\u0131 kapat\u0131ld\u0131.&#039;);\n        }\n    }\n})();<\/code>;\n    console.log(\"Olu\u015fturulan Playwright Kodu:\\n\");\n    console.log(code);\n    console.log(<code>--------------------------------------------<\/code>);\n    return code;\n}\n\n\/\/ \u00d6rnek kullan\u0131m (yukar\u0131daki Planner output'unu kullanarak)\n\/\/ const samplePlannedSteps = [\n\/\/     \"Taray\u0131c\u0131y\u0131 ba\u015flat ve belirtilen giri\u015f sayfas\u0131na git.\",\n\/\/     \"Kullan\u0131c\u0131 ad\u0131 giri\u015f alan\u0131n\u0131 bul ve 'testkullanici' ile doldur.\",\n\/\/     \"\u015eifre giri\u015f alan\u0131n\u0131 bul ve 'testparola' ile doldur.\",\n\/\/     \"Giri\u015f yap d\u00fc\u011fmesine t\u0131kla.\",\n\/\/     \"Giri\u015fin ba\u015far\u0131l\u0131 oldu\u011funu g\u00f6steren bir mesaj\u0131n veya dashboard elementinin g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc do\u011frula.\",\n\/\/     \"Taray\u0131c\u0131y\u0131 kapat.\"\n\/\/ ];\n\/\/ generatePlaywrightCode(samplePlannedSteps, \"https:\/\/example.com\/login\");\n\n<\/pre>\n<p><\/code><\/p>\n<aside class=\"expert-tip\">\n  Uzman \u0130pucu: Generator Agent'\u0131n etkinli\u011fini art\u0131rmak i\u00e7in, ona sadece metinsel ad\u0131mlar de\u011fil, ayn\u0131 zamanda sayfan\u0131n DOM yap\u0131s\u0131 veya ge\u00e7mi\u015f etkile\u015fim verileri gibi ek ba\u011flam bilgileri de sa\u011flayabilirsiniz. Bu, daha do\u011fru se\u00e7icilerin belirlenmesine yard\u0131mc\u0131 olur.<br \/>\n<\/aside>\n<h2>Onar\u0131c\u0131 Ajan (Healer Agent): Hatalar\u0131 Otomatik Olarak Nas\u0131l Giderirsiniz?<\/h2>\n<p>Otomasyon testlerinin en b\u00fcy\u00fck zorluklar\u0131ndan biri, testlerin s\u0131k s\u0131k \"k\u0131r\u0131lmas\u0131d\u0131r\" (flakiness). Web uygulamalar\u0131nda yap\u0131lan k\u00fc\u00e7\u00fck bir UI de\u011fi\u015fikli\u011fi (bir d\u00fc\u011fmenin metninin de\u011fi\u015fmesi, bir elementin ID'sinin g\u00fcncellenmesi veya bir DOM yap\u0131s\u0131n\u0131n yeniden d\u00fczenlenmesi), daha \u00f6nce m\u00fckemmel \u00e7al\u0131\u015fan bir testin ba\u015far\u0131s\u0131z olmas\u0131na neden olabilir. Bu durum, otomasyon bak\u0131m maliyetlerini art\u0131r\u0131r ve test s\u00fcrecini yava\u015flat\u0131r. Healer Agent, tam da bu noktada devreye girerek, ba\u015far\u0131s\u0131z olan testleri otomatik olarak tespit eder, hatan\u0131n k\u00f6k nedenini analiz eder ve m\u00fcmk\u00fcnse kendi kendine onar\u0131r.<\/p>\n<p>Healer Agent'\u0131n temel i\u015flevi, test \u00e7al\u0131\u015ft\u0131rma s\u0131ras\u0131nda olu\u015fan hatalar\u0131 izlemek ve bu hatalar\u0131n nedenini anlamakt\u0131r. \u00d6rne\u011fin, bir test \"Se\u00e7ici bulunamad\u0131\" hatas\u0131 verdi\u011finde, Healer Agent bu mesaj\u0131 ve hata an\u0131ndaki sayfan\u0131n DOM yap\u0131s\u0131n\u0131 analiz eder. Playwright'\u0131n otomatik kay\u0131t \u00f6zellikleri (trace viewer) veya YZ destekli g\u00f6rsel analiz teknikleri kullanarak, ilgili elementin konumunu, \u00f6zelliklerini veya metnini tarayarak yeni bir se\u00e7ici bulmaya \u00e7al\u0131\u015f\u0131r. E\u011fer yeni bir se\u00e7ici bulunursa, test kodunu otomatik olarak g\u00fcnceller ve testin tekrar \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Healer Agent'\u0131n ger\u00e7ekle\u015ftirebilece\u011fi onar\u0131m senaryolar\u0131na \u00f6rnekler:<\/p>\n<ul>\n<li><strong>Se\u00e7ici G\u00fcncelleme:<\/strong> Bir elementin ID'si veya class'\u0131 de\u011fi\u015fti\u011finde, Healer Agent sayfan\u0131n mevcut DOM'unu tarayarak ayn\u0131 element i\u00e7in yeni ve ge\u00e7erli bir se\u00e7ici bulur. \u00d6rne\u011fin, <code>#oldId<\/code> yerine <code>.new-class<\/code> veya <code>[data-test-id=\"updated\"]<\/code> se\u00e7icilerini \u00f6nerebilir veya do\u011frudan kodu g\u00fcncelleyebilir.<\/li>\n<li><strong>Bekleme S\u00fcresi Ayar\u0131:<\/strong> Bir elementin y\u00fcklenmesi beklenen s\u00fcreden daha uzun s\u00fcrd\u00fc\u011f\u00fcnde (timeout hatas\u0131), Healer Agent testin bekleme s\u00fcresini art\u0131rabilir veya daha uygun bir bekleme stratejisi (\u00f6rn. belirli bir metin g\u00f6r\u00fcnene kadar bekleme) \u00f6nerebilir.<\/li>\n<li><strong>Alternatif Yol Bulma:<\/strong> Bir etkile\u015fim yolu (\u00f6rn. bir men\u00fc \u00f6\u011fesine t\u0131klama) ge\u00e7ersiz hale geldi\u011finde, Healer Agent, ayn\u0131 i\u015flevselli\u011fe ula\u015fmak i\u00e7in alternatif bir UI yolu (\u00f6rn. farkl\u0131 bir men\u00fcden eri\u015fim) bulmaya \u00e7al\u0131\u015fabilir.<\/li>\n<li><strong>UI De\u011fi\u015fikliklerine Adaptasyon:<\/strong> K\u00fc\u00e7\u00fck metin de\u011fi\u015fiklikleri veya d\u00fc\u011fme konumlar\u0131n\u0131n de\u011fi\u015fmesi gibi durumlarda, g\u00f6rsel tan\u0131ma algoritmalar\u0131 veya metin tabanl\u0131 se\u00e7icilerle (<code>:has-text()<\/code>) uyum sa\u011flayabilir.<\/li>\n<\/ul>\n<p>Healer Agent, test otomasyonunun s\u00fcrd\u00fcr\u00fclebilirli\u011fi a\u00e7\u0131s\u0131ndan kritik bir role sahiptir. Otomatik onar\u0131m yetene\u011fi sayesinde, test bak\u0131m\u0131na ayr\u0131lan s\u00fcreyi ve maliyetleri \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Test m\u00fchendisleri, k\u0131r\u0131lan testleri manuel olarak inceleyip d\u00fczeltmek yerine, Healer Agent'\u0131n \u00f6nerilerini g\u00f6zden ge\u00e7irip onaylayarak veya daha karma\u015f\u0131k durumlara odaklanarak zaman kazan\u0131r. Bu, s\u00fcrekli de\u011fi\u015fen agile geli\u015ftirme ortamlar\u0131nda otomasyonun g\u00fcvenilirli\u011fini ve verimlili\u011fini koruman\u0131n anahtarlar\u0131ndan biridir.<\/p>\n<pre><code>\n\/\/ Healer Agent'\u0131n basitle\u015ftirilmi\u015f bir hata tespiti ve onar\u0131m senaryosu\nasync function healPlaywrightTest(generatedCode, testFailureLog, pageContext) {\n    console.log(<code>\\n--------------------------------------------<\/code>);\n    console.log(<code>Healer Ajan\u0131: Hata tespiti ve onar\u0131m\u0131 ba\u015flat\u0131l\u0131yor...<\/code>);\n    console.log(<code>Hata Logu: ${testFailureLog}<\/code>);\n    console.log(<code>--------------------------------------------<\/code>);\n\n    let healedCode = generatedCode;\n    let repairPerformed = false;\n\n    \/\/ Ger\u00e7ek bir senaryoda, pageContext'ten o anki DOM yap\u0131s\u0131, ekran g\u00f6r\u00fcnt\u00fcs\u00fc vb. al\u0131n\u0131r.\n    \/\/ Varsay\u0131msal olarak, testFailureLog'u analiz ediyoruz.\n\n    if (testFailureLog.includes(\"Selector not found: button:has-text(\\\"Giri\u015f Yap\\\")\")) {\n        console.log(\"Tespit: 'Giri\u015f Yap' butonu bulunamad\u0131. Alternatif se\u00e7ici aran\u0131yor...\");\n        \/\/ Burada Playwright'\u0131n otomatik kay\u0131t veya AI destekli alternatif se\u00e7ici bulma yetenekleri devreye girer.\n        \/\/ \u00d6rne\u011fin, sayfan\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\u0131n\u0131r, DOM analizi yap\u0131l\u0131r, benzer metinler aran\u0131r.\n        const alternativeSelector = 'button.login-submit-btn'; \/\/ Varsay\u0131msal alternatif\n        healedCode = healedCode.replace('button:has-text(\"Giri\u015f Yap\")', alternativeSelector);\n        console.log(<code>Onar\u0131ld\u0131: Se\u00e7ici &#039;${alternativeSelector}&#039; olarak de\u011fi\u015ftirildi.<\/code>);\n        repairPerformed = true;\n    } else if (testFailureLog.includes(\"Timeout exceeded while waiting for selector: .success-message\")) {\n        console.log(\"Tespit: Ba\u015far\u0131 mesaj\u0131 beklenenden uzun s\u00fcrd\u00fc. Bekleme s\u00fcresi art\u0131r\u0131l\u0131yor...\");\n        \/\/ Bekleme s\u00fcresini art\u0131rma veya farkl\u0131 bir do\u011frulama y\u00f6ntemi ekleme\n        healedCode = healedCode.replace('await page.waitForSelector(\\'.success-message\\', { state: \\'visible\\', timeout: 10000 });',\n                                        'await page.waitForSelector(\\'.success-message\\', { state: \\'visible\\', timeout: 20000 });'); \/\/ 20 saniye\n        console.log(\"Onar\u0131ld\u0131: Bekleme s\u00fcresi 20 saniyeye \u00e7\u0131kar\u0131ld\u0131.\");\n        repairPerformed = true;\n    } else if (testFailureLog.includes(\"input[name=\\\"username\\\"]\")) {\n        console.log(\"Tespit: Kullan\u0131c\u0131 ad\u0131 inputu bulunamad\u0131. Alternatif se\u00e7ici aran\u0131yor...\");\n        const alternativeUsernameSelector = 'input#usernameField'; \/\/ Varsay\u0131msal\n        healedCode = healedCode.replace('input[name=\"username\"]', alternativeUsernameSelector);\n        console.log(<code>Onar\u0131ld\u0131: Kullan\u0131c\u0131 ad\u0131 se\u00e7ici &#039;${alternativeUsernameSelector}&#039; olarak de\u011fi\u015ftirildi.<\/code>);\n        repairPerformed = true;\n    }\n    \/\/ Daha fazla hata senaryosu ve onar\u0131m mant\u0131\u011f\u0131 eklenebilir.\n\n    if (repairPerformed) {\n        console.log(\"\\nHealer Ajan\u0131 taraf\u0131ndan yap\u0131lan onar\u0131mlar:\\n\");\n        console.log(healedCode);\n    } else {\n        console.log(\"Healer Ajan\u0131 bu hatay\u0131 otomatik olarak onaramad\u0131. Manuel m\u00fcdahale gerekebilir.\");\n    }\n    console.log(<code>--------------------------------------------<\/code>);\n    return { healedCode, repairPerformed };\n}\n\n\/\/ \u00d6rnek kullan\u0131m (yukar\u0131daki Generator output'unu ve sim\u00fcle edilmi\u015f bir hatay\u0131 kullanarak)\n\/\/ const sampleGeneratedCode = <code>\/\/ const { chromium } = require(&#039;playwright&#039;);\n\/\/ (async () => {\n\/\/     const browser = await chromium.launch();\n\/\/     const page = await browser.newPage();\n\/\/     await page.goto(&#039;https:\/\/example.com\/login&#039;);\n\/\/     await page.fill(&#039;input[name=\"username\"]&#039;, &#039;testkullanici&#039;);\n\/\/     await page.fill(&#039;input[name=\"password\"]&#039;, &#039;testparola&#039;);\n\/\/     await page.click(&#039;button:has-text(\"Giri\u015f Yap\")&#039;); \/\/ Bu sat\u0131rda hata oldu\u011funu varsayal\u0131m\n\/\/     await page.waitForSelector(&#039;.success-message&#039;, { state: &#039;visible&#039;, timeout: 10000 });\n\/\/     await browser.close();\n\/\/ })();\n\/\/<\/code>;\n\/\/ const failedLog = \"Error: Timeout 30000ms exceeded while waiting for selector \\\"button:has-text(\\\"Giri\u015f Yap\\\")\\\"\";\n\/\/ healPlaywrightTest(sampleGeneratedCode, failedLog, {}); \/\/ pageContext bo\u015f ge\u00e7ildi, sim\u00fclasyon ama\u00e7l\u0131\n\n<\/pre>\n<p><\/code><\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: Ajanlar Birlikte Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Playwright'\u0131n Planner, Generator ve Healer ajanlar\u0131, tek ba\u015flar\u0131na g\u00fc\u00e7l\u00fc olsalar da, as\u0131l potansiyellerini entegre bir i\u015f ak\u0131\u015f\u0131nda ortaya koyarlar. Birbirlerini tamamlayarak, otomasyon s\u00fcrecini ba\u015ftan sona otomatikle\u015ftirir ve s\u00fcrekli iyile\u015ftirirler. Gelin, bu \u00fc\u00e7 ajan\u0131n bir web projesinin otomasyon ya\u015fam d\u00f6ng\u00fcs\u00fcnde nas\u0131l birlikte \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bir vaka analizi \u00fczerinden inceleyelim.<\/p>\n<p><strong>Vaka Analizi: E-ticaret Uygulamas\u0131 i\u00e7in \u00dcr\u00fcn Sat\u0131n Alma Otomasyonu<\/strong><\/p>\n<p>Bir e-ticaret \u015firketinin, m\u00fc\u015fterilerinin sorunsuz bir al\u0131\u015fveri\u015f deneyimi ya\u015fad\u0131\u011f\u0131ndan emin olmak i\u00e7in \"\u00fcr\u00fcn sat\u0131n alma\" s\u00fcrecini u\u00e7tan uca test etmek istedi\u011fini varsayal\u0131m. Bu, genellikle birden \u00e7ok ad\u0131m i\u00e7eren karma\u015f\u0131k bir senaryodur.<\/p>\n<ol>\n<li>\n    <strong>Planner Agent Devrede: Planlama A\u015famas\u0131<\/strong><\/p>\n<p>Test m\u00fchendisi veya i\u015f analisti, Planner Agent'a do\u011fal dilde bir talep iletir: \"Kullan\u0131c\u0131 bir e-ticaret sitesinde bir \u00fcr\u00fcn aray\u0131p sepete eklemeli, \u00f6deme yapmal\u0131 ve sipari\u015fi onaylamal\u0131.\"<\/p>\n<p>Planner Agent, bu talebi analiz eder ve a\u015fa\u011f\u0131daki gibi mant\u0131ksal bir ad\u0131m dizisi olu\u015fturur:<\/p>\n<ul>\n<li>Taray\u0131c\u0131y\u0131 ba\u015flat ve e-ticaret sitesinin ana sayfas\u0131na git.<\/li>\n<li>Arama \u00e7ubu\u011funu kullanarak \"ak\u0131ll\u0131 telefon\" ara.<\/li>\n<li>Arama sonu\u00e7lar\u0131ndan ilk \u00fcr\u00fcn\u00fc se\u00e7 ve \u00fcr\u00fcn detay sayfas\u0131na git.<\/li>\n<li>\"Sepete Ekle\" d\u00fc\u011fmesine t\u0131kla.<\/li>\n<li>Sepet sayfas\u0131na git ve \"\u00d6deme Yap\" d\u00fc\u011fmesine t\u0131kla.<\/li>\n<li>Giri\u015f yap veya misafir olarak devam et.<\/li>\n<li>Adres bilgilerini doldur.<\/li>\n<li>\u00d6deme y\u00f6ntemini (\u00f6rne\u011fin, kredi kart\u0131) se\u00e7 ve bilgileri gir.<\/li>\n<li>\"Sipari\u015fi Onayla\" d\u00fc\u011fmesine t\u0131kla.<\/li>\n<li>Sipari\u015fin ba\u015far\u0131yla verildi\u011fini do\u011frulayan sayfay\u0131 veya mesaj\u0131 kontrol et.<\/li>\n<li>Taray\u0131c\u0131y\u0131 kapat.<\/li>\n<\/ul>\n<p>Bu plan, test otomasyonunun yol haritas\u0131n\u0131 olu\u015fturur.<\/p>\n<\/li>\n<li>\n    <strong>Generator Agent Devrede: Kod \u00dcretimi<\/strong><\/p>\n<p>Planner'dan gelen ad\u0131m dizisi, Generator Agent'a aktar\u0131l\u0131r. Generator Agent, bu ad\u0131mlar\u0131 al\u0131p, her ad\u0131m i\u00e7in uygun Playwright API \u00e7a\u011fr\u0131lar\u0131n\u0131 ve se\u00e7icileri (varsay\u0131lan veya YZ destekli tahminlerle) kullanarak JavaScript (veya ba\u015fka bir dil) tabanl\u0131 bir Playwright test kodu \u00fcretir. \u00d6rne\u011fin, \"Arama \u00e7ubu\u011funu kullanarak 'ak\u0131ll\u0131 telefon' ara\" ad\u0131m\u0131, <code>await page.fill('input[name=\"search\"]', 'ak\u0131ll\u0131 telefon');<\/code> ve <code>await page.click('button[type=\"submit\"]');<\/code> gibi kod sat\u0131rlar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr.<\/p>\n<p>\u00dcretilen kod, bir test dosyas\u0131na kaydedilir ve art\u0131k \u00e7al\u0131\u015ft\u0131r\u0131lmaya haz\u0131rd\u0131r. Bu a\u015fama, manuel kod yazma s\u00fcresini ortadan kald\u0131r\u0131r ve testlerin \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde olu\u015fturulmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n    <strong>Playwright \u00c7al\u0131\u015ft\u0131rma ve Healer Agent Devrede: Hata Tespiti ve Onar\u0131m<\/strong><\/p>\n<p>\u00dcretilen Playwright kodu, CI\/CD i\u015flem hatt\u0131n\u0131n bir par\u00e7as\u0131 olarak veya manuel olarak \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Testin ba\u015far\u0131yla ge\u00e7ti\u011fini varsayal\u0131m.<\/p>\n<p>Ancak, birka\u00e7 g\u00fcn sonra, e-ticaret sitesinde k\u00fc\u00e7\u00fck bir UI de\u011fi\u015fikli\u011fi yap\u0131l\u0131r: \"Sepete Ekle\" d\u00fc\u011fmesinin metni \"Sepete Ekle +\" olarak g\u00fcncellenir ve se\u00e7ici olarak kullan\u0131lan <code>button:has-text(\"Sepete Ekle\")<\/code> art\u0131k \u00e7al\u0131\u015fmaz. Bu durum, testi ba\u015far\u0131s\u0131z k\u0131lar ve \"Selector not found\" hatas\u0131 f\u0131rlat\u0131l\u0131r.<\/p>\n<p>\u0130\u015fte bu noktada Healer Agent devreye girer. Ba\u015far\u0131s\u0131z olan testin hata logunu ve hata an\u0131ndaki sayfan\u0131n DOM yap\u0131s\u0131n\u0131 (e\u011fer yakalanm\u0131\u015fsa) analiz eder. Healer Agent, a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyebilir:<\/p>\n<ul>\n<li>Hata logunda \"Selector not found\" hatas\u0131n\u0131 tespit eder ve etkilenen se\u00e7iciyi (<code>button:has-text(\"Sepete Ekle\")<\/code>) tan\u0131mlar.<\/li>\n<li>Sayfan\u0131n mevcut DOM'unu ve hata an\u0131ndaki ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc (Playwright trace viewer ile kaydedilen) kullanarak, \"Sepete Ekle +\" metnine sahip bir d\u00fc\u011fme olup olmad\u0131\u011f\u0131n\u0131 arar.<\/li>\n<li>Yeni bir ge\u00e7erli se\u00e7ici olan <code>button:has-text(\"Sepete Ekle +\")<\/code> veya <code>button[data-test-id=\"add-to-cart-button\"]<\/code> gibi daha sa\u011flam bir se\u00e7ici bulur.<\/li>\n<li>Generator Agent taraf\u0131ndan \u00fcretilen orijinal kodu bu yeni se\u00e7iciyle g\u00fcnceller.<\/li>\n<li>G\u00fcncellenmi\u015f testi otomatik olarak yeniden \u00e7al\u0131\u015ft\u0131r\u0131r. Yeni test bu sefer ba\u015far\u0131l\u0131 olur.<\/li>\n<\/ul>\n<p>Healer Agent, bu otomatik onar\u0131m sayesinde, testin k\u0131r\u0131lmas\u0131n\u0131 \u00f6nler ve manuel m\u00fcdahaleye gerek kalmadan otomasyonun s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu, otomasyonun bak\u0131m y\u00fck\u00fcn\u00fc b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r ve test m\u00fchendislerinin daha de\u011ferli i\u015flere odaklanmas\u0131na olanak tan\u0131r.<\/p>\n<\/li>\n<\/ol>\n<p>Bu entegre i\u015f ak\u0131\u015f\u0131, Playwright ajanlar\u0131n\u0131n sadece test otomasyonunu basitle\u015ftirmekle kalmay\u0131p, ayn\u0131 zamanda onu daha ak\u0131ll\u0131, esnek ve kendi kendine yeten bir sistem haline getirdi\u011fini g\u00f6stermektedir. Bu, gelece\u011fin web otomasyonu i\u00e7in yeni bir standart belirlemektedir.<\/p>\n<pre><code>\n\/\/ B\u00fct\u00fcnle\u015fik Ajan Ak\u0131\u015f\u0131 (Conceptual - Makaledeki basitle\u015ftirilmi\u015f fonksiyonlar\u0131 kullan\u0131r)\n\n\/\/ Not: Ger\u00e7ek bir uygulamada, bu fonksiyonlar farkl\u0131 mod\u00fcllerde tan\u0131mlan\u0131r\n\/\/ ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi daha sofistike olur. Bu sadece bir entegrasyon g\u00f6sterimidir.\n\n\/\/ Planner Agent fonksiyonu (yukar\u0131da tan\u0131ml\u0131)\n\/\/ async function planAutomationScenario(scenarioDescription) { ... }\n\n\/\/ Generator Agent fonksiyonu (yukar\u0131da tan\u0131ml\u0131)\n\/\/ async function generatePlaywrightCode(plannedSteps, url) { ... }\n\n\/\/ Healer Agent fonksiyonu (yukar\u0131da tan\u0131ml\u0131)\n\/\/ async function healPlaywrightTest(generatedCode, testFailureLog, pageContext) { ... }\n\n\nasync function runFullAutomationScenario(description, initialUrl) {\n    console.log(\"\\n--- Playwright Ajanlar\u0131 ile Otomasyon Senaryosu Ba\u015flat\u0131l\u0131yor ---\");\n    console.log(<code>Senaryo Hedefi: \"${description}\"<\/code>);\n\n    \/\/ Ad\u0131m 1: Planner Ajan\u0131 - Otomasyon Ad\u0131mlar\u0131n\u0131 Planla\n    console.log(\"\\n[Planner Ajan\u0131] Planlama a\u015famas\u0131...\");\n    const plannedSteps = await planAutomationScenario(description);\n    if (!plannedSteps || plannedSteps.length === 0) {\n        console.error(\"Planner Ajan\u0131 bir plan olu\u015fturamad\u0131. \u0130\u015flem iptal ediliyor.\");\n        return;\n    }\n    console.log(\"Planlama tamamland\u0131. Olu\u015fturulan ad\u0131mlar:\\n\", plannedSteps.map((s, i) => <code>${i+1}. ${s}<\/code>).join('\\n'));\n\n    \/\/ Ad\u0131m 2: Generator Ajan\u0131 - Plan\u0131 Playwright Koduna \u00c7evir\n    console.log(\"\\n[Generator Ajan\u0131] Kod \u00fcretim a\u015famas\u0131...\");\n    let generatedCode = await generatePlaywrightCode(plannedSteps, initialUrl);\n    if (!generatedCode) {\n        console.error(\"Generator Ajan\u0131 kod \u00fcretemedi. \u0130\u015flem iptal ediliyor.\");\n        return;\n    }\n    console.log(\"Playwright kodu ba\u015far\u0131yla \u00fcretildi.\");\n    \/\/ Ger\u00e7ekte, bu kodu bir dosyaya yaz\u0131p ayr\u0131 bir s\u00fcre\u00e7te \u00e7al\u0131\u015ft\u0131rabilirsiniz.\n    \/\/ const fs = require('fs');\n    \/\/ fs.writeFileSync('temp_test_script.js', generatedCode);\n\n    \/\/ Ad\u0131m 3: Playwright Testini \u00c7al\u0131\u015ft\u0131r ve Hata Durumunu Sim\u00fcle Et\/\u0130zle\n    console.log(\"\\n[Test \u00c7al\u0131\u015ft\u0131r\u0131c\u0131] \u00dcretilen kodu \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor ve hata denetleniyor...\");\n    let testSuccess = false;\n    let failureLog = \"\";\n    let attempt = 0;\n    const maxAttempts = 2; \/\/ \u0130lk deneme + bir onar\u0131m denemesi\n\n    while (attempt < maxAttempts) {\n        console.log(<code>\\nDeneme ${attempt + 1}\/${maxAttempts}: Playwright testi sim\u00fcle ediliyor...<\/code>);\n        try {\n            \/\/ Ger\u00e7ek bir senaryoda burada 'generatedCode' \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.\n            \/\/ \u00d6rne\u011fin: require('child_process').execSync('node temp_test_script.js', { stdio: 'inherit' });\n            \/\/ Biz burada basit bir rastgele hata sim\u00fclasyonu kullan\u0131yoruz.\n            if (attempt === 0 && Math.random() < 0.6) { \/\/ \u0130lk denemede %60 hata ihtimali\n                const errors = [\n                    \"Error: Timeout 30000ms exceeded while waiting for selector \\\"button:has-text(\\\"Giri\u015f Yap\\\")\\\"\",\n                    \"Error: Selector not found: input[name=\\\"username\\\"]\",\n                    \"Error: Page navigated away before asserting success message (.success-message)\"\n                ];\n                failureLog = errors[Math.floor(Math.random() * errors.length)];\n                throw new Error(failureLog);\n            }\n            testSuccess = true;\n            console.log(\"Playwright testi ba\u015far\u0131yla tamamland\u0131!\");\n            break; \/\/ Ba\u015far\u0131l\u0131ysa d\u00f6ng\u00fcden \u00e7\u0131k\n        } catch (error) {\n            testSuccess = false;\n            failureLog = error.message;\n            console.error(<code>Playwright testi ba\u015far\u0131s\u0131z oldu: ${failureLog}<\/code>);\n        }\n\n        \/\/ Ad\u0131m 4: Healer Ajan\u0131 - Hatalar\u0131 Onar (E\u011fer test ba\u015far\u0131s\u0131z olursa)\n        if (!testSuccess) {\n            console.log(\"\\n[Healer Ajan\u0131] Hata tespit edildi, onar\u0131m deneniyor...\");\n            const { healedCode: newHealedCode, repairPerformed } = await healPlaywrightTest(generatedCode, failureLog, {}); \/\/ pageContext bo\u015f ge\u00e7ildi\n            if (repairPerformed) {\n                generatedCode = newHealedCode; \/\/ Kodu onar\u0131lm\u0131\u015f haliyle g\u00fcncelle\n                console.log(\"Healer Ajan\u0131 ba\u015far\u0131l\u0131 bir onar\u0131m yapt\u0131. Test yeniden deneniyor.\");\n                \/\/ fs.writeFileSync('temp_test_script.js', generatedCode); \/\/ Onar\u0131lm\u0131\u015f kodu kaydet\n            } else {\n                console.log(\"Healer Ajan\u0131 otomatik bir onar\u0131m yapamad\u0131. Manuel m\u00fcdahale gerekebilir.\");\n                break; \/\/ Onar\u0131m yap\u0131lamazsa d\u00f6ng\u00fcden \u00e7\u0131k\n            }\n        }\n        attempt++;\n    }\n\n    if (testSuccess) {\n        console.log(\"\\n--- Otomasyon Senaryosu Ba\u015far\u0131yla Tamamland\u0131 ---\");\n    } else {\n        console.log(\"\\n--- Otomasyon Senaryosu Onar\u0131ma Ra\u011fmen Ba\u015far\u0131s\u0131z Oldu ---\");\n        console.log(\"Son hata detay\u0131: \", failureLog);\n    }\n}\n\n\/\/ \u00d6rnek kullan\u0131m:\n\/\/ runFullAutomationScenario(\"Kullan\u0131c\u0131n\u0131n sisteme ba\u015far\u0131l\u0131 bir \u015fekilde giri\u015f yapmas\u0131\", \"https:\/\/example.com\/login\");\n\/\/ runFullAutomationScenario(\"Kullan\u0131c\u0131n\u0131n bir e-ticaret sitesinde \u00fcr\u00fcn aramas\u0131 yapmas\u0131 ve sepete eklemesi\", \"https:\/\/example.com\/shop\");\n\n<\/pre>\n<p><\/code><\/p>\n<h2>\u0130leri Seviye Uygulamalar ve Entegrasyon \u0130pu\u00e7lar\u0131<\/h2>\n<p>Playwright ajanlar\u0131n\u0131n temel i\u015fleyi\u015fini anlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi bu ajanlar\u0131 daha karma\u015f\u0131k senaryolarda nas\u0131l kullanabilece\u011fimizi ve mevcut geli\u015ftirme s\u00fcre\u00e7lerimize nas\u0131l entegre edebilece\u011fimizi inceleyelim. \u0130leri seviye uygulamalar, bu sistemlerin potansiyelini tam olarak ortaya \u00e7\u0131kararak, test otomasyonunu bir sonraki seviyeye ta\u015f\u0131r.<\/p>\n<h3>CI\/CD Ortamlar\u0131na Entegrasyon<\/h3>\n<p>Playwright ajanlar\u0131n\u0131n g\u00fcc\u00fc, \u00f6zellikle s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) i\u015flem hatlar\u0131na entegre edildi\u011finde ortaya \u00e7\u0131kar. Bir kod de\u011fi\u015fikli\u011fi yap\u0131ld\u0131\u011f\u0131nda, otomatik olarak tetiklenen bir CI\/CD pipeline'\u0131 i\u00e7erisinde Planner, Generator ve Healer ajanlar\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015fabilir:<\/p>\n<ol>\n<li><strong>Geli\u015ftirme A\u015famas\u0131nda Planner\/Generator:<\/strong> Yeni bir \u00f6zellik geli\u015ftirilirken, geli\u015ftiriciler veya test uzmanlar\u0131, yeni \u00f6zelli\u011fin kullan\u0131c\u0131 senaryolar\u0131n\u0131 do\u011fal dilde Planner'a iletir. Planner bu senaryolar\u0131 planlar, Generator ise h\u0131zl\u0131ca Playwright test kodunu \u00fcretir. Bu kod, an\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131larak ilk geri bildirim al\u0131n\u0131r.<\/li>\n<li><strong>CI Pipeline'\u0131nda Otomatik Test ve Healer:<\/strong> Kod depoya g\u00f6nderildi\u011finde, CI pipeline'\u0131 tetiklenir. Generator taraf\u0131ndan \u00fcretilen t\u00fcm Playwright testleri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. E\u011fer herhangi bir test ba\u015far\u0131s\u0131z olursa, Healer Agent devreye girer. Hata loglar\u0131n\u0131 ve test an\u0131ndaki konteksti analiz ederek, otomatik bir d\u00fczeltme \u00f6nerir. Bu d\u00fczeltme, manuel olarak g\u00f6zden ge\u00e7irilip onaylanabilir veya belirli g\u00fcven e\u015fiklerinin \u00fczerindeyse otomatik olarak uygulanabilir. Bu, k\u0131r\u0131lan testlerin an\u0131nda onar\u0131lmas\u0131n\u0131 sa\u011flayarak CI\/CD ak\u0131\u015f\u0131n\u0131n kesintisiz devam etmesine olanak tan\u0131r.<\/li>\n<li><strong>Geri Bildirim D\u00f6ng\u00fcs\u00fc:<\/strong> Healer taraf\u0131ndan yap\u0131lan onar\u0131mlar, Planner ve Generator ajanlar\u0131n\u0131n \u00f6\u011frenme algoritmalar\u0131na geri beslenebilir. B\u00f6ylece, ajanlar zamanla daha ak\u0131ll\u0131 hale gelir ve gelecekteki test \u00fcretimi ve onar\u0131m s\u00fcre\u00e7leri daha da iyile\u015fir.<\/li>\n<\/ol>\n<h3>Yapay Zeka Destekli Geli\u015fmi\u015f Teknikler<\/h3>\n<p>Playwright ajanlar\u0131n\u0131n etkinli\u011fini art\u0131rmak i\u00e7in YZ'nin daha derinlemesine entegrasyonu m\u00fcmk\u00fcnd\u00fcr:<\/p>\n<ul>\n<li><strong>G\u00f6rsel Regresyon Testleri ve Anormallik Tespiti:<\/strong> Healer Agent, sadece kod de\u011fi\u015fikliklerini de\u011fil, ayn\u0131 zamanda g\u00f6rsel farkl\u0131l\u0131klar\u0131 da tespit edebilir. Makine \u00f6\u011frenimi tabanl\u0131 g\u00f6r\u00fcnt\u00fc i\u015fleme algoritmalar\u0131 kullanarak, bir UI elementinin beklenen g\u00f6r\u00fcn\u00fcm\u00fcnden sapma olup olmad\u0131\u011f\u0131n\u0131 belirleyebilir. E\u011fer bir UI elementinin konumu veya rengi de\u011fi\u015fmi\u015fse, bunu bir \"g\u00f6rsel regresyon\" olarak alg\u0131layabilir ve ilgili se\u00e7iciyi veya test ad\u0131m\u0131n\u0131 buna g\u00f6re ayarlayabilir.<\/li>\n<li><strong>Do\u011fal Dil \u0130\u015fleme (NLP) ile Daha Ak\u0131ll\u0131 Planner:<\/strong> Planner Agent'\u0131n NLP yetenekleri geli\u015ftirilerek, sadece senaryo a\u00e7\u0131klamalar\u0131 de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131 hikayeleri, gereksinim belgeleri veya sohbet kay\u0131tlar\u0131 gibi farkl\u0131 kaynaklardan bilgi alarak test senaryolar\u0131 olu\u015fturabilir. Bu, otomasyonun i\u015f s\u00fcre\u00e7lerine daha s\u0131k\u0131 entegre olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Self-Healing Beyond Selectors:<\/strong> Healer Agent, sadece se\u00e7icileri de\u011fil, ayn\u0131 zamanda test ak\u0131\u015f\u0131n\u0131n mant\u0131\u011f\u0131n\u0131 da potansiyel olarak d\u00fczeltebilir. \u00d6rne\u011fin, bir formda beklenmedik bir zorunlu alan ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, Healer Agent bu alan\u0131 doldurmak i\u00e7in uygun veriyi bulmaya \u00e7al\u0131\u015fabilir veya test senaryosunu g\u00fcncelleyebilir.<\/li>\n<li><strong>Test Verisi \u00dcretimi:<\/strong> YZ, sadece test kodunu de\u011fil, ayn\u0131 zamanda test i\u00e7in gerekli olan verileri (kullan\u0131c\u0131 isimleri, e-postalar, adresler vb.) de \u00fcretebilir. Bu, testlerin daha ger\u00e7ek\u00e7i ve kapsaml\u0131 olmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h3>Dinamik Uygulamalar ve SPA'lar \u0130\u00e7in Optimizasyon<\/h3>\n<p>Tek sayfa uygulamalar\u0131 (SPA'lar) ve yo\u011fun JavaScript kullanan dinamik web siteleri, otomasyon i\u00e7in \u00f6zel zorluklar sunar. Playwright ajanlar\u0131, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in optimize edilebilir:<\/p>\n<ul>\n<li><strong>Ak\u0131ll\u0131 Beklemeler:<\/strong> Healer Agent, bir elementin y\u00fcklenmesini beklerken sadece basit bir <code>waitForSelector<\/code> kullanmak yerine, sayfan\u0131n a\u011f isteklerini, DOM de\u011fi\u015fikliklerini veya belirli bir API \u00e7a\u011fr\u0131s\u0131n\u0131n tamamlanmas\u0131n\u0131 bekleyebilir. Bu, dinamik y\u00fcklemelerden kaynaklanan flakiness'\u0131 azalt\u0131r.<\/li>\n<li><strong>Context-Aware Se\u00e7iciler:<\/strong> Generator Agent, dinamik olarak de\u011fi\u015fen ID'ler veya class'lar yerine, daha sa\u011flam olan <code>data-testid<\/code> nitelikleri veya metin tabanl\u0131 se\u00e7icileri (<code>page.getByText()<\/code>) tercih edebilir. YZ algoritmalar\u0131, bir elementin en kararl\u0131 se\u00e7icisini belirlemek i\u00e7in DOM'un ge\u00e7mi\u015f versiyonlar\u0131n\u0131 ve mevcut durumu kar\u015f\u0131la\u015ft\u0131rabilir.<\/li>\n<li><strong>Paralel Test Ortamlar\u0131:<\/strong> Playwright'\u0131n h\u0131zl\u0131 paralel \u00e7al\u0131\u015ft\u0131rma yetene\u011fi, ajanlar\u0131n \u00fcretip onard\u0131\u011f\u0131 testlerin \u00e7ok say\u0131da sanal ortamda e\u015f zamanl\u0131 olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. Bu, regresyon testlerinin k\u0131sa s\u00fcrede tamamlanmas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<p>Sonu\u00e7 olarak, Playwright ajanlar\u0131, ileri seviye uygulamalar ve entegrasyon ipu\u00e7lar\u0131yla birlikte kullan\u0131ld\u0131\u011f\u0131nda, test otomasyonunun verimlili\u011fini, g\u00fcvenilirli\u011fini ve adaptasyon yetene\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131ran ve \u00fcr\u00fcn kalitesini g\u00fcvence alt\u0131na alan stratejik bir avantaj sunar.<\/p>\n<h2>Playwright Ajanlar\u0131 ile Gelece\u011fin Otomasyonu: Avantajlar ve Zorluklar<\/h2>\n<p>Playwright'\u0131n Planner, Generator ve Healer ajanlar\u0131, web otomasyonunda devrim niteli\u011finde bir yakla\u015f\u0131m sunmaktad\u0131r. Bu entegre sistemin sundu\u011fu say\u0131s\u0131z avantaj\u0131n yan\u0131 s\u0131ra, uygulanmas\u0131 ve y\u00f6netilmesi gereken belirli zorluklar da bulunmaktad\u0131r. Bu b\u00f6l\u00fcmde, bu yeni nesil otomasyonun faydalar\u0131n\u0131 ve potansiyel engellerini dengeli bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Avantajlar:<\/h3>\n<ol>\n<li><strong>H\u0131z ve Verimlilik Art\u0131\u015f\u0131:<\/strong>\n<ul>\n<li><strong>H\u0131zl\u0131 Test Olu\u015fturma:<\/strong> Planner ve Generator ajanlar\u0131, do\u011fal dil girdilerinden saniyeler i\u00e7inde \u00e7al\u0131\u015fan test kodlar\u0131 \u00fcreterek manuel test yazma s\u00fcresini ortadan kald\u0131r\u0131r. Bu, \u00f6zellikle h\u0131zl\u0131 de\u011fi\u015fen agile ortamlarda b\u00fcy\u00fck bir zaman tasarrufu sa\u011flar.<\/li>\n<li><strong>Otomatik Bak\u0131m:<\/strong> Healer Agent, test k\u0131r\u0131lmalar\u0131n\u0131 otomatik olarak tespit edip onararak, test bak\u0131m\u0131na harcanan zaman\u0131 ve eforu \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Bu, test m\u00fchendislerinin daha de\u011ferli g\u00f6revlere odaklanmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Daha Y\u00fcksek Kalite ve G\u00fcvenilirlik:<\/strong>\n<ul>\n<li><strong>Tutarl\u0131 Testler:<\/strong> Ajanlar taraf\u0131ndan \u00fcretilen kodlar, genellikle insan taraf\u0131ndan yaz\u0131lan kodlardan daha az hataya sahiptir ve Playwright'\u0131n en iyi pratiklerini takip eder. Bu, testlerin daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Kapsaml\u0131 Test Senaryolar\u0131:<\/strong> Planner Agent, karma\u015f\u0131k senaryolar i\u00e7in bile kapsaml\u0131 ve mant\u0131ksal olarak do\u011fru ad\u0131mlar olu\u015fturarak daha iyi test kapsam\u0131 sa\u011flar.<\/li>\n<li><strong>Daha Az Flakiness:<\/strong> Healer Agent'\u0131n otomatik onar\u0131m yetene\u011fi, UI de\u011fi\u015fikliklerinden kaynaklanan flakiness'\u0131 azalt\u0131r, b\u00f6ylece test sonu\u00e7lar\u0131na olan g\u00fcven artar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Eri\u015filebilirlik ve \u0130\u015fbirli\u011fi:<\/strong>\n<ul>\n<li><strong>Demokratikle\u015fen Otomasyon:<\/strong> Planner Agent'\u0131n do\u011fal dil i\u015fleme yetenekleri sayesinde, teknik olmayan i\u015f payda\u015flar\u0131 bile test senaryolar\u0131n\u0131 kolayca tan\u0131mlayabilir. Bu, i\u015f ve teknik ekipler aras\u0131ndaki ileti\u015fimi ve i\u015fbirli\u011fini g\u00fc\u00e7lendirir.<\/li>\n<li><strong>Standardizasyon:<\/strong> Generator Agent, Playwright testlerinin belirli bir standarda ve yap\u0131ya g\u00f6re olu\u015fturulmas\u0131n\u0131 sa\u011flayarak, kod kalitesini ve okunabilirli\u011fini art\u0131r\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong>\n<ul>\n<li><strong>Paralel \u00c7al\u0131\u015ft\u0131rma:<\/strong> Playwright'\u0131n yerle\u015fik paralel test \u00e7al\u0131\u015ft\u0131rma yetene\u011fi, ajanlar taraf\u0131ndan \u00fcretilen testlerin b\u00fcy\u00fck \u00f6l\u00e7ekte ve h\u0131zl\u0131 bir \u015fekilde y\u00fcr\u00fct\u00fclmesine olanak tan\u0131r.<\/li>\n<li><strong>S\u00fcrekli \u0130yile\u015ftirme:<\/strong> Ajanlar, ge\u00e7mi\u015f test sonu\u00e7lar\u0131ndan ve onar\u0131m verilerinden \u00f6\u011frenerek zamanla daha ak\u0131ll\u0131 hale gelir, bu da sistemin uzun vadeli s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>Zorluklar:<\/h3>\n<ol>\n<li><strong>Ba\u015flang\u0131\u00e7 Maliyeti ve Karma\u015f\u0131kl\u0131k:<\/strong>\n<ul>\n<li><strong>Kurulum ve Entegrasyon:<\/strong> Bu ajanlar\u0131 kurmak, e\u011fitmek ve mevcut sistemlerle entegre etmek ba\u015flang\u0131\u00e7ta \u00f6nemli bir yat\u0131r\u0131m (zaman, kaynak ve uzmanl\u0131k) gerektirebilir.<\/li>\n<li><strong>YZ Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131:<\/strong> Ajanlar\u0131n \u00e7o\u011fu YZ modellerine (\u00f6zellikle LLM'lere) dayan\u0131yorsa, bu modellerin maliyeti, performans\u0131 ve g\u00fcvenilirli\u011fi \u00f6nemli bir fakt\u00f6r haline gelir. Modelin yanl\u0131\u015f sonu\u00e7lar \u00fcretmesi test kalitesini d\u00fc\u015f\u00fcrebilir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Geli\u015fmi\u015f Hata Ay\u0131klama ve G\u00f6zetim \u0130htiyac\u0131:<\/strong>\n<ul>\n<li><strong>\"Kara Kutu\" Sorunu:<\/strong> Ajanlar\u0131n otomatik olarak kod \u00fcretip onarmas\u0131, s\u00fcre\u00e7 \u00fczerinde tam kontrol\u00fc zorla\u015ft\u0131rabilir. Neden bir testin k\u0131r\u0131ld\u0131\u011f\u0131n\u0131 veya nas\u0131l onar\u0131ld\u0131\u011f\u0131n\u0131 anlamak i\u00e7in derinlemesine bir g\u00f6zetim ve hata ay\u0131klama mekanizmas\u0131 gereklidir.<\/li>\n<li><strong>G\u00fcven Sorunu:<\/strong> Otomatik olarak \u00fcretilen ve onar\u0131lan kodlara tam g\u00fcven duymak zaman alabilir. Ba\u015flang\u0131\u00e7ta manuel do\u011frulama ve g\u00f6zden ge\u00e7irme s\u00fcre\u00e7leri gerekli olabilir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Dinamik ve De\u011fi\u015fken Ortamlara Adaptasyon:<\/strong>\n<ul>\n<li><strong>A\u015f\u0131r\u0131 De\u011fi\u015fim:<\/strong> \u00c7ok h\u0131zl\u0131 ve k\u00f6kl\u00fc UI de\u011fi\u015fiklikleri olan projelerde, Healer Agent'\u0131n bile otomatik onar\u0131m yetenekleri yetersiz kalabilir ve manuel m\u00fcdahale ka\u00e7\u0131n\u0131lmaz hale gelebilir.<\/li>\n<li><strong>Edge Durumlar\u0131:<\/strong> Ajanlar, insan d\u00fc\u015f\u00fcncesinin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ve nadir g\u00f6r\u00fclen \"edge case\" senaryolar\u0131n\u0131 her zaman do\u011fru bir \u015fekilde yakalayamayabilir. Bu durumlar i\u00e7in yine de insan uzmanl\u0131\u011f\u0131na ihtiya\u00e7 duyulacakt\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>G\u00fcvenlik ve Gizlilik Endi\u015feleri:<\/strong>\n<ul>\n<li><strong>Veri Hassasiyeti:<\/strong> E\u011fer ajanlar \u00fcretim ortam\u0131 verileriyle veya hassas bilgilerle \u00e7al\u0131\u015f\u0131yorsa, g\u00fcvenlik ve gizlilik protokollerinin \u00e7ok dikkatli bir \u015fekilde uygulanmas\u0131 gerekir.<\/li>\n<li><strong>Yanl\u0131\u015f Kod Enjeksiyonu:<\/strong> Generator veya Healer ajanlar\u0131n\u0131n k\u00f6t\u00fc niyetli veya yanl\u0131\u015f kod \u00fcretme ihtimali (k\u00fc\u00e7\u00fck de olsa) dikkate al\u0131nmal\u0131 ve g\u00fcvenlik kontrolleri uygulanmal\u0131d\u0131r.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Playwright ajanlar\u0131, do\u011fru strateji ve dikkatli bir uygulama ile web otomasyonunda \u00f6nemli faydalar sa\u011flayabilir. Ancak, potansiyel zorluklar\u0131n fark\u0131nda olmak ve bunlar\u0131 ele almak i\u00e7in uygun \u00f6nlemleri almak, bu teknolojinin ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6neme sahiptir. Gelecekte, bu ajanlar\u0131n daha da geli\u015ferek, otomasyon s\u00fcre\u00e7lerini daha da sorunsuz hale getirmesi beklenmektedir.<\/p>\n<h2>Sonu\u00e7: Web Otomasyonunda Yeni Bir \u00c7a\u011f<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131n kalitesi ve g\u00fcvenilirli\u011fi her zamankinden daha kritik hale gelmi\u015ftir. Playwright gibi modern otomasyon ara\u00e7lar\u0131, geli\u015ftiricilere ve test m\u00fchendislerine e\u015fsiz yetenekler sunarken, Planner, Generator ve Healer ajanlar\u0131n\u0131n entegrasyonu, otomasyon d\u00fcnyas\u0131nda yeni bir \u00e7a\u011f\u0131n kap\u0131lar\u0131n\u0131 aralamaktad\u0131r. Bu makalede ele ald\u0131\u011f\u0131m\u0131z gibi, bu ajanlar, otomasyon s\u00fcrecini ba\u015ftan sona d\u00fc\u015f\u00fcnerek, planlayarak, kodlayarak ve hatta olu\u015fan hatalar\u0131 onararak insan m\u00fcdahalesini minimuma indirmeyi hedefler.<\/p>\n<p>Planner Agent, do\u011fal dil girdilerinden ak\u0131ll\u0131 test stratejileri olu\u015fturarak otomasyonun temelini atar. Generator Agent, bu stratejileri h\u0131zl\u0131 ve verimli bir \u015fekilde \u00e7al\u0131\u015f\u0131r Playwright koduna d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Son olarak, Healer Agent, testlerin k\u0131r\u0131lmas\u0131n\u0131 otomatik olarak onararak, otomasyon bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve testlerin s\u00fcrekli g\u00fcvenilirli\u011fini sa\u011flar. Bu entegre yakla\u015f\u0131m, web otomasyonunu sadece bir g\u00f6rev olmaktan \u00e7\u0131kar\u0131p, yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn ak\u0131ll\u0131 ve otonom bir par\u00e7as\u0131 haline getirir.<\/p>\n<p>\u015e\u00fcphesiz, bu yeni nesil otomasyon \u00e7\u00f6z\u00fcmlerinin getirdi\u011fi avantajlar (h\u0131z, g\u00fcvenilirlik, verimlilik ve i\u015fbirli\u011fi) olduk\u00e7a fazlad\u0131r. Ancak, kurulum maliyetleri, YZ ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ve karma\u015f\u0131kl\u0131k gibi zorluklar\u0131n da dikkatle ele al\u0131nmas\u0131 gerekmektedir. Yine de, Playwright ajanlar\u0131, \u00f6zellikle s\u00fcrekli entegrasyon ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerine dahil edildi\u011finde, yaz\u0131l\u0131m kalitesini art\u0131rma, pazara \u00e7\u0131k\u0131\u015f s\u00fcresini k\u0131saltma ve geli\u015ftirme ekiplerinin stratejik konulara odaklanmas\u0131n\u0131 sa\u011flama potansiyeline sahiptir.<\/p>\n<p>Gelecekte, bu ajanlar\u0131n daha da geli\u015ferek, daha ak\u0131ll\u0131, adaptif ve hatta proaktif hale gelmeleri beklenmektedir. Kendi kendine \u00f6\u011frenen algoritmalar ve daha derinlemesine YZ entegrasyonu sayesinde, otomasyon testleri, de\u011fi\u015fen UI'lara an\u0131nda adapte olabilecek, potansiyel sorunlar\u0131 tahmin edebilecek ve hatta yeni test senaryolar\u0131n\u0131 kendili\u011finden \u00f6nerebilecek hale gelecektir. Playwright ajanlar\u0131, web otomasyonunun gelece\u011fini \u015fekillendiren ve yaz\u0131l\u0131m test s\u00fcre\u00e7lerini k\u00f6kten d\u00f6n\u00fc\u015ft\u00fcren bu heyecan verici yolculukta \u00f6nemli bir kilometre ta\u015f\u0131d\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n<h4>Playwright ajanlar\u0131 her t\u00fcr web projesi i\u00e7in uygun mudur?<\/h4>\n<p>Evet, modern web projelerinin \u00e7o\u011fu i\u00e7in Playwright ajanlar\u0131 olduk\u00e7a uygun ve etkilidir. \u00d6zellikle dinamik, JavaScript yo\u011fun uygulamalar, tek sayfa uygulamalar (SPA'lar) ve responsive tasar\u0131mlar i\u00e7in g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunar. Geleneksel multi-page uygulamalarda da sorunsuz \u00e7al\u0131\u015f\u0131r. Ancak, \u00e7ok eski, flash tabanl\u0131 veya standart d\u0131\u015f\u0131, eri\u015filebilir olmayan elementlere sahip teknolojiler kullanan projelerde entegrasyon ve se\u00e7ici belirleme i\u00e7in ek \u00e7aba gerekebilir.<\/p>\n<\/li>\n<li>\n<h4>Bu ajanlar yapay zeka olmadan da \u00e7al\u0131\u015fabilir mi?<\/h4>\n<p>Generator ve Planner ajanlar\u0131 temel olarak kural tabanl\u0131 sistemlerle de \u00e7al\u0131\u015fabilir; yani \u00f6nceden tan\u0131mlanm\u0131\u015f \u015fablonlar veya belirli kelime e\u015fle\u015ftirmeleriyle de plan ve kod \u00fcretebilirler. Ancak, yapay zeka (\u00f6zellikle GenAI ve B\u00fcy\u00fck Dil Modelleri) entegrasyonu, onlar\u0131n daha ak\u0131ll\u0131, esnek ve karma\u015f\u0131k, \u00f6nceden tan\u0131mlanmam\u0131\u015f senaryolar\u0131 anlay\u0131p \u00e7\u00f6zme yeteneklerini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Healer ajan\u0131 ise hatan\u0131n k\u00f6k nedenini bulma ve alternatif \u00e7\u00f6z\u00fcmler \u00fcretme konusunda AI'dan ve \u00f6\u011frenme algoritmalar\u0131ndan b\u00fcy\u00fck \u00f6l\u00e7\u00fcde faydalan\u0131r, bu nedenle AI olmadan etkisi s\u0131n\u0131rl\u0131 kalabilir.<\/p>\n<\/li>\n<li>\n<h4>Playwright ajanlar\u0131n\u0131 uygulamaya ba\u015flamak i\u00e7in ne kadar deneyim gerekiyor?<\/h4>\n<p>Temel Playwright bilgisi, JavaScript\/TypeScript programlama deneyimi ve web otomasyon kavramlar\u0131na a\u015final\u0131k ba\u015flang\u0131\u00e7 i\u00e7in yeterlidir. Ancak, ajan mant\u0131\u011f\u0131n\u0131 kendi projenize entegre etmek, \u00f6zelle\u015ftirmek ve YZ modelleriyle etkile\u015fime ge\u00e7mek i\u00e7in daha derinlemesine otomasyon mimarisi, yaz\u0131l\u0131m m\u00fchendisli\u011fi ve belki de temel YZ\/makine \u00f6\u011frenimi prensipleri bilgisi faydal\u0131 olacakt\u0131r. Mevcut AI k\u00fct\u00fcphaneleri ve Playwright API'si bu s\u00fcreci basitle\u015ftirmektedir.<\/p>\n<\/li>\n<li>\n<h4>Bu yakla\u015f\u0131m\u0131n otomasyon test maliyetleri \u00fczerindeki etkisi nedir?<\/h4>\n<p>Ba\u015flang\u0131\u00e7ta bu ajanlar\u0131 kurmak, entegre etmek ve e\u011fitmek i\u00e7in bir yat\u0131r\u0131m maliyeti olabilir (YZ hizmetleri, geli\u015ftirici zaman\u0131 vb.). Ancak, uzun vadede test yazma s\u00fcresini k\u0131saltarak (Generator), test bak\u0131m\u0131n\u0131 otomatikle\u015ftirerek (Healer) ve hatalar\u0131 h\u0131zla gidererek \u00f6nemli \u00f6l\u00e7\u00fcde operasyonel maliyet tasarrufu sa\u011flar. \u00d6zellikle b\u00fcy\u00fck, s\u00fcrekli de\u011fi\u015fen projelerde ve s\u0131k s\u0131k yeni \u00f6zelliklerin eklendi\u011fi durumlarda, ROI (yat\u0131r\u0131m getirisi) olduk\u00e7a y\u00fcksek olacakt\u0131r, \u00e7\u00fcnk\u00fc manuel m\u00fcdahale ihtiyac\u0131 azal\u0131r ve geli\u015ftirme d\u00f6ng\u00fcleri h\u0131zlan\u0131r.<\/p>\n<\/li>\n<li>\n<h4>Ajanlar taraf\u0131ndan \u00fcretilen kodun kalitesi ve okunabilirli\u011fi nas\u0131l sa\u011flan\u0131r?<\/h4>\n<p>Generator Agent, \u00fcretilen kodun kalitesini ve okunabilirli\u011fini art\u0131rmak i\u00e7in \u00e7e\u015fitli stratejiler kullan\u0131r. Bu stratejiler aras\u0131nda Playwright'\u0131n resmi \u00f6nerilerine uygun API \u00e7a\u011fr\u0131lar\u0131 kullanma, uygun de\u011fi\u015fken isimleri ve yorumlar ekleme, kod formatlama standartlar\u0131na uyma ve tekrarlanan kal\u0131plar\u0131 fonksiyonlara veya yard\u0131mc\u0131 metotlara d\u00f6n\u00fc\u015ft\u00fcrme yer al\u0131r. Ayr\u0131ca, \u00fcretilen kod, bir kod inceleme s\u00fcreci veya otomatik kod analizi ara\u00e7lar\u0131yla denetlenerek kalitesi s\u00fcrekli iyile\u015ftirilebilir. YZ modelleri, zamanla daha \"temiz\" ve s\u00fcrd\u00fcr\u00fclebilir kod \u00fcretmek \u00fczere e\u011fitilebilir.<\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright&#8217;\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31174","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma<\/title>\n<meta name=\"description\" content=\"Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright&#039;\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi ba\u015ftan sona nas\u0131l optimize edece\u011finizi, h\u0131zl\u0131 ve hatas\u0131z test senaryolar\u0131 olu\u015fturup s\u00fcrd\u00fcrece\u011finizi ke\u015ffedin. Bu teknik makale, ger\u00e7ek d\u00fcnya \u00f6rnekleri ile Playwright&#039;\u0131n g\u00fcc\u00fcn\u00fc anlaman\u0131za yard\u0131mc\u0131 olacak.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma\" \/>\n<meta property=\"og:description\" content=\"Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright&#039;\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi ba\u015ftan sona nas\u0131l optimize edece\u011finizi, h\u0131zl\u0131 ve hatas\u0131z test senaryolar\u0131 olu\u015fturup s\u00fcrd\u00fcrece\u011finizi ke\u015ffedin. Bu teknik makale, ger\u00e7ek d\u00fcnya \u00f6rnekleri ile Playwright&#039;\u0131n g\u00fcc\u00fcn\u00fc anlaman\u0131za yard\u0131mc\u0131 olacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-06T18:04:35+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"39 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma\",\"datePublished\":\"2025-10-06T18:04:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/\"},\"wordCount\":5569,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/\",\"name\":\"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-06T18:04:35+00:00\",\"description\":\"Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright'\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi ba\u015ftan sona nas\u0131l optimize edece\u011finizi, h\u0131zl\u0131 ve hatas\u0131z test senaryolar\u0131 olu\u015fturup s\u00fcrd\u00fcrece\u011finizi ke\u015ffedin. Bu teknik makale, ger\u00e7ek d\u00fcnya \u00f6rnekleri ile Playwright'\u0131n g\u00fcc\u00fcn\u00fc anlaman\u0131za yard\u0131mc\u0131 olacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma","description":"Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright'\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi ba\u015ftan sona nas\u0131l optimize edece\u011finizi, h\u0131zl\u0131 ve hatas\u0131z test senaryolar\u0131 olu\u015fturup s\u00fcrd\u00fcrece\u011finizi ke\u015ffedin. Bu teknik makale, ger\u00e7ek d\u00fcnya \u00f6rnekleri ile Playwright'\u0131n g\u00fcc\u00fcn\u00fc anlaman\u0131za yard\u0131mc\u0131 olacak.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/","og_locale":"tr_TR","og_type":"article","og_title":"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma","og_description":"Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright'\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi ba\u015ftan sona nas\u0131l optimize edece\u011finizi, h\u0131zl\u0131 ve hatas\u0131z test senaryolar\u0131 olu\u015fturup s\u00fcrd\u00fcrece\u011finizi ke\u015ffedin. Bu teknik makale, ger\u00e7ek d\u00fcnya \u00f6rnekleri ile Playwright'\u0131n g\u00fcc\u00fcn\u00fc anlaman\u0131za yard\u0131mc\u0131 olacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-06T18:04:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"39 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma","datePublished":"2025-10-06T18:04:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/"},"wordCount":5569,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/","url":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/","name":"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-06T18:04:35+00:00","description":"Web otomasyonunda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan zorluklar, s\u00fcre\u00e7leri karma\u015f\u0131k hale getirebilir. Playwright'\u0131n Planner, Generator ve Healer ajanlar\u0131 sayesinde, otomasyon s\u00fcre\u00e7lerinizi ba\u015ftan sona nas\u0131l optimize edece\u011finizi, h\u0131zl\u0131 ve hatas\u0131z test senaryolar\u0131 olu\u015fturup s\u00fcrd\u00fcrece\u011finizi ke\u015ffedin. Bu teknik makale, ger\u00e7ek d\u00fcnya \u00f6rnekleri ile Playwright'\u0131n g\u00fcc\u00fcn\u00fc anlaman\u0131za yard\u0131mc\u0131 olacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/playwright-ajanlari-otomasyonu-planlama-uretme-ve-onarma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Playwright Ajanlar\u0131: Otomasyonu Planlama, \u00dcretme ve Onarma"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31174"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31174\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}