{"id":38458,"date":"2026-01-31T15:41:00","date_gmt":"2026-01-31T12:41:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38458"},"modified":"2026-01-31T15:41:00","modified_gmt":"2026-01-31T12:41:00","slug":"react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/","title":{"rendered":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin sa\u011flanmas\u0131, uygulaman\u0131n ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Kullan\u0131c\u0131 beklentilerini kar\u015f\u0131layan, hatas\u0131z ve g\u00fcvenilir uygulamalar olu\u015fturmak, kapsaml\u0131 test stratejileri gerektirir. Bu stratejiler genellikle birim testleri (unit tests), entegrasyon testleri (integration tests) ve u\u00e7tan uca (end-to-end &#8211; E2E) testler gibi farkl\u0131 seviyelerde uygulan\u0131r. Son y\u0131llarda, bu test hiyerar\u015fisine ek olarak &#8220;bile\u015fen testi&#8221; (component testing) kavram\u0131 da b\u00fcy\u00fck \u00f6nem kazanm\u0131\u015ft\u0131r. Bile\u015fen testleri, modern \u00f6n y\u00fcz (frontend) geli\u015ftirme yakla\u015f\u0131mlar\u0131nda, \u00f6zellikle React gibi bile\u015fen tabanl\u0131 k\u00fct\u00fcphanelerle \u00e7al\u0131\u015f\u0131rken, geli\u015ftiricilere \u00f6nemli avantajlar sunar.<\/p>\n<p>Bu makalede, React uygulamalar\u0131 i\u00e7in bile\u015fen testlerinin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve Playwright gibi g\u00fc\u00e7l\u00fc bir taray\u0131c\u0131 otomasyon arac\u0131yla nas\u0131l etkili bir \u015fekilde uygulanabilece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Playwright&#8217;\u0131n sundu\u011fu \u00f6zel bile\u015fen testi \u00f6zellikleri sayesinde, React bile\u015fenlerinizi ger\u00e7ek taray\u0131c\u0131 ortam\u0131nda, izole bir \u015fekilde test ederek geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rabilir ve uygulaman\u0131z\u0131n kalitesini art\u0131rabilirsiniz.<\/p>\n<h3>Bile\u015fen Testi Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Yaz\u0131l\u0131mda bir &#8220;bile\u015fen&#8221; (component), uygulaman\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn (UI) k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z ve yeniden kullan\u0131labilir bir par\u00e7as\u0131d\u0131r. \u00d6rne\u011fin, bir <code>Button<\/code>, <code>Input<\/code>, <code>Card<\/code> veya <code>Modal<\/code> birer bile\u015fen olabilir. Bile\u015fen testleri, bu ba\u011f\u0131ms\u0131z bile\u015fenlerin tek ba\u015flar\u0131na do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak amac\u0131yla yap\u0131lan testlerdir.<\/p>\n<p>Bile\u015fen testleri, di\u011fer test t\u00fcrleri aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr:<\/p>\n<p>*   <strong>Birim Testleri:<\/strong> Genellikle tek bir fonksiyonu veya s\u0131n\u0131f\u0131 test eder, UI etkile\u015fimlerini i\u00e7ermez.<br \/>\n*   <strong>Entegrasyon Testleri:<\/strong> Birden fazla birimin veya sistemin birbiriyle nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 test eder.<br \/>\n*   <strong>U\u00e7tan Uca (E2E) Testler:<\/strong> Uygulaman\u0131n tamam\u0131n\u0131, bir kullan\u0131c\u0131n\u0131n ger\u00e7ek senaryolar\u0131n\u0131 taklit ederek test eder. Genellikle taray\u0131c\u0131da \u00e7al\u0131\u015f\u0131r ve t\u00fcm sistemin entegrasyonunu kontrol eder.<\/p>\n<p>Bile\u015fen testleri, bu spektrumda bir bile\u015fenin UI ve etkile\u015fim mant\u0131\u011f\u0131n\u0131, ancak uygulaman\u0131n tamam\u0131na ba\u011f\u0131ml\u0131 olmadan test etmeyi hedefler.<\/p>\n<p><strong>Bile\u015fen Testlerinin Sa\u011flad\u0131\u011f\u0131 Avantajlar:<\/strong><\/p>\n<p>1.  <strong>\u0130zolasyon:<\/strong> Her bile\u015fen kendi ba\u015f\u0131na test edildi\u011fi i\u00e7in, testler daha az ba\u011f\u0131ml\u0131l\u0131\u011fa sahiptir. Bu, hatalar\u0131n yerini tespit etmeyi kolayla\u015ft\u0131r\u0131r ve testlerin daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n2.  <strong>H\u0131z:<\/strong> Bile\u015fen testleri, E2E testlerine g\u00f6re \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131r \u00e7\u00fcnk\u00fc t\u00fcm uygulaman\u0131n veya bir arka u\u00e7 (backend) sunucusunun aya\u011fa kalkmas\u0131n\u0131 gerektirmez. Bu, geli\u015ftiricilere daha h\u0131zl\u0131 geri bildirim d\u00f6ng\u00fcs\u00fc sunar.<br \/>\n3.  <strong>Geli\u015ftirici Geri Bildirimi:<\/strong> H\u0131zl\u0131 geri bildirim sayesinde geli\u015ftiriciler, kodlar\u0131nda yapt\u0131klar\u0131 de\u011fi\u015fikliklerin bile\u015fen \u00fczerindeki etkilerini an\u0131nda g\u00f6rebilir ve sorunlar\u0131 erken a\u015famada \u00e7\u00f6zebilirler.<br \/>\n4.  <strong>G\u00fcvenilirlik:<\/strong> Bile\u015fenler izole bir \u015fekilde test edildi\u011fi i\u00e7in, testler daha az &#8220;k\u0131r\u0131lgan&#8221; olur. Uygulaman\u0131n ba\u015fka bir yerindeki de\u011fi\u015fiklikler genellikle bile\u015fen testlerini etkilemez.<br \/>\n5.  <strong>Yeniden Kullan\u0131labilirlik ve Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> \u0130yi test edilmi\u015f bile\u015fenler, uygulaman\u0131n farkl\u0131 yerlerinde veya gelecekteki projelerde daha g\u00fcvenle kullan\u0131labilir. Testler, bile\u015fenin beklenen davran\u0131\u015f\u0131n\u0131 belgeleyerek bak\u0131m s\u00fcrecini de kolayla\u015ft\u0131r\u0131r.<br \/>\n6.  <strong>Kullan\u0131c\u0131 Aray\u00fcz\u00fc Mant\u0131\u011f\u0131n\u0131n Testi:<\/strong> Bir bile\u015fenin prop&#8217;lara nas\u0131l tepki verdi\u011fi, state&#8217;ini nas\u0131l y\u00f6netti\u011fi ve kullan\u0131c\u0131 etkile\u015fimlerine nas\u0131l yan\u0131t verdi\u011fi gibi UI&#8217;a \u00f6zg\u00fc mant\u0131klar\u0131 do\u011frudan test etme imkan\u0131 sunar.<\/p>\n<h3>Playwright Nedir ve Neden Bile\u015fen Testleri \u0130\u00e7in Tercih Edilmelidir?<\/h3>\n<p>Playwright, Microsoft taraf\u0131ndan geli\u015ftirilen modern bir taray\u0131c\u0131 otomasyon k\u00fct\u00fcphanesidir. Chromium, Firefox ve WebKit gibi t\u00fcm modern taray\u0131c\u0131larda \u00e7al\u0131\u015fabilme yetene\u011fiyle \u00f6ne \u00e7\u0131kar. Playwright ba\u015flang\u0131\u00e7ta u\u00e7tan uca (E2E) testler i\u00e7in tasarlanm\u0131\u015f olsa da, sundu\u011fu g\u00fc\u00e7l\u00fc API&#8217;ler ve ger\u00e7ek taray\u0131c\u0131 ortam\u0131nda \u00e7al\u0131\u015fma yetene\u011fi sayesinde bile\u015fen testleri i\u00e7in de ideal bir ara\u00e7 haline gelmi\u015ftir. Playwright, \u00f6zellikle React gibi bile\u015fen tabanl\u0131 k\u00fct\u00fcphanelerle \u00e7al\u0131\u015f\u0131rken, bile\u015fenlerinizi ger\u00e7ek bir taray\u0131c\u0131 ortam\u0131nda, izole bir \u015fekilde render edip etkile\u015fime ge\u00e7erek test etme imkan\u0131 sunar.<\/p>\n<p><strong>Playwright&#8217;\u0131n Bile\u015fen Testi Yakla\u015f\u0131m\u0131:<\/strong><\/p>\n<p>Playwright&#8217;\u0131n bile\u015fen testleri i\u00e7in \u00f6zel olarak geli\u015ftirilmi\u015f <code>@playwright\/experimental-ct-react<\/code> (veya gelecekteki stabil versiyonu) paketi, React bile\u015fenlerini do\u011frudan bir taray\u0131c\u0131 ba\u011flam\u0131nda &#8220;mount&#8221; etme (DOM&#8217;a ba\u011flama) yetene\u011fi sa\u011flar. Bu, geleneksel birim test k\u00fct\u00fcphanelerinin (Jest, Vitest) sundu\u011fu sanal DOM (JSDOM) ortam\u0131ndan farkl\u0131 olarak, bile\u015fenlerinizin ger\u00e7ek taray\u0131c\u0131 ortam\u0131nda (CSS, JavaScript, taray\u0131c\u0131 API&#8217;leri dahil) nas\u0131l davrand\u0131\u011f\u0131n\u0131 test etmenizi sa\u011flar.<\/p>\n<p>*   <strong>Ger\u00e7ek Taray\u0131c\u0131 Ortam\u0131:<\/strong> Bile\u015fenleriniz, stil dosyalar\u0131, resimler ve taray\u0131c\u0131ya \u00f6zg\u00fc API&#8217;ler dahil olmak \u00fczere tam bir taray\u0131c\u0131 ortam\u0131nda test edilir. Bu, JSDOM gibi sanal ortamlar\u0131n ka\u00e7\u0131rabilece\u011fi render veya etkile\u015fim sorunlar\u0131n\u0131 yakalamay\u0131 sa\u011flar.<br \/>\n*   <strong>H\u0131z ve G\u00fcvenilirlik:<\/strong> Playwright&#8217;\u0131n test runner&#8217;\u0131, testleri paralel olarak ve izole bir \u015fekilde \u00e7al\u0131\u015ft\u0131rarak y\u00fcksek h\u0131z ve g\u00fcvenilirlik sunar.<br \/>\n*   <strong>Kapsaml\u0131 API:<\/strong> Playwright&#8217;\u0131n g\u00fc\u00e7l\u00fc se\u00e7ici (locator) API&#8217;leri, kullan\u0131c\u0131 etkile\u015fimlerini (t\u0131klama, yazma, s\u00fcr\u00fckleme vb.) sim\u00fcle etme yetenekleri ve do\u011frulama (assertion) mekanizmalar\u0131, karma\u015f\u0131k bile\u015fen davran\u0131\u015flar\u0131n\u0131 test etmeyi kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>G\u00f6rsel Regresyon Testleri:<\/strong> Bile\u015fenlerin g\u00f6rsel \u00e7\u0131kt\u0131lar\u0131n\u0131n ekran g\u00f6r\u00fcnt\u00fclerini alarak, stil veya d\u00fczen de\u011fi\u015fikliklerinin istenmeyen g\u00f6rsel regresyonlara yol a\u00e7\u0131p a\u00e7mad\u0131\u011f\u0131n\u0131 otomatik olarak kontrol edebilirsiniz.<br \/>\n*   <strong>Geli\u015ftirme Sunucusu Entegrasyonu:<\/strong> Playwright&#8217;\u0131n bile\u015fen testi \u00f6zelli\u011fi, Vite veya Webpack gibi geli\u015ftirme sunucular\u0131yla sorunsuz bir \u015fekilde entegre olarak, bile\u015fenlerinizi h\u0131zl\u0131ca derleyip test ortam\u0131na sunar.<\/p>\n<h3>Playwright Bile\u015fen Test Ortam\u0131n\u0131n Kurulumu<\/h3>\n<p>React uygulamalar\u0131n\u0131zda Playwright ile bile\u015fen testlerini uygulamak i\u00e7in \u00f6ncelikle gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemeniz ve Playwright&#8217;\u0131 yap\u0131land\u0131rman\u0131z gerekir.<\/p>\n<p><strong>1. Proje Olu\u015fturma veya Mevcut Projeye Ekleme:<\/strong><\/p>\n<p>Yeni bir React projesi olu\u015fturuyorsan\u0131z veya mevcut bir projeye Playwright&#8217;\u0131 ekliyorsan\u0131z, a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyebilirsiniz. Playwright, React Component Testing i\u00e7in Vite gibi modern bir bundler ile en iyi \u015fekilde \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>E\u011fer s\u0131f\u0131rdan bir proje olu\u015fturup Playwright&#8217;\u0131 eklemek isterseniz, Playwright&#8217;\u0131n kendi CLI&#8217;\u0131 bunu kolayla\u015ft\u0131r\u0131r:<\/p>\n<pre><code class=\"language-bash\"># Yeni bir React projesi olu\u015fturun (\u00f6rne\u011fin Vite ile)\nnpm create vite@latest my-react-app -- --template react-ts\ncd my-react-app\n\n<h2>Playwright'\u0131 bile\u015fen testi deste\u011fiyle y\u00fckleyin<\/h2>\nnpm init playwright@latest -- --ct<\/code><\/pre>\n<p>Bu komut, Playwright&#8217;\u0131 y\u00fckleyecek, <code>playwright.config.ts<\/code> dosyas\u0131n\u0131 olu\u015fturacak ve React Component Testing i\u00e7in gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 (\u00f6rn. <code>@playwright\/experimental-ct-react<\/code>) kuracakt\u0131r.<\/p>\n<p>Mevcut bir projeye ekliyorsan\u0131z:<\/p>\n<pre><code class=\"language-bash\">npm install -D @playwright\/test @playwright\/experimental-ct-react react react-dom vite\n<h2>E\u011fer TypeScript kullan\u0131yorsan\u0131z:<\/h2>\nnpm install -D @types\/react @types\/react-dom<\/code><\/pre>\n<p>Ard\u0131ndan, Playwright yap\u0131land\u0131rma dosyas\u0131n\u0131 manuel olarak olu\u015fturman\u0131z gerekebilir.<\/p>\n<p><strong>2. <code>playwright.config.ts<\/code> Yap\u0131land\u0131rmas\u0131:<\/strong><\/p>\n<p>Playwright, <code>playwright.config.ts<\/code> (veya <code>.js<\/code>) dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131land\u0131r\u0131l\u0131r. Bile\u015fen testleri i\u00e7in bu dosyan\u0131n \u00f6zel ayarlara sahip olmas\u0131 gerekir. <code>npm init playwright@latest -- --ct<\/code> komutu genellikle bu dosyay\u0131 otomatik olarak olu\u015fturur. \u00d6rnek bir <code>playwright.config.ts<\/code> dosyas\u0131 a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-typescript\">import { defineConfig, devices } from '@playwright\/experimental-ct-react';\nimport { resolve } from 'path';\n\n\/<em><\/em>\n * Playwright bile\u015fen testi yap\u0131land\u0131rmas\u0131.\n * Daha fazla bilgi i\u00e7in: https:\/\/playwright.dev\/docs\/test-components\n *\/\nexport default defineConfig({\n  testDir: '.\/', \/\/ Test dosyalar\u0131n\u0131n aranaca\u011f\u0131 dizin\n  testMatch: '<em><\/em>\/*.spec.{ts,tsx,js,jsx}', \/\/ Test dosyas\u0131 kal\u0131b\u0131\n\n  \/<em> Testlerin paralel \u00e7al\u0131\u015ft\u0131r\u0131l\u0131p \u00e7al\u0131\u015ft\u0131r\u0131lmayaca\u011f\u0131n\u0131 yap\u0131land\u0131r\u0131n. <\/em>\/\n  fullyParallel: true,\n  \/<em> Test hatalar\u0131nda tekrardan deneme say\u0131s\u0131n\u0131 yap\u0131land\u0131r\u0131n. <\/em>\/\n  retries: process.env.CI ? 2 : 0,\n  \/<em> Test raporlar\u0131n\u0131 yap\u0131land\u0131r\u0131n. <\/em>\/\n  reporter: 'html',\n\n  \/<em> Taray\u0131c\u0131 ba\u011flam\u0131 ayarlar\u0131. <\/em>\/\n  use: {\n    \/<em> Test s\u0131ras\u0131nda kullan\u0131lacak temel URL. <\/em>\/\n    \/\/ baseURL: 'http:\/\/127.0.0.1:3000',\n\n    \/<em> Test s\u0131ras\u0131nda kullan\u0131lacak viewport boyutu. <\/em>\/\n    viewport: { width: 1280, height: 720 },\n\n    \/<em> Test s\u0131ras\u0131nda taray\u0131c\u0131 konsol \u00e7\u0131kt\u0131lar\u0131n\u0131 yakala. <\/em>\/\n    trace: 'on-first-retry',\n\n    \/<em> Component Testing i\u00e7in gerekli ayarlar. <\/em>\/\n    ctPort: 3100, \/\/ Bile\u015fenlerin sunulaca\u011f\u0131 port\n    ctViteConfig: { \/\/ Vite \u00f6zelinde yap\u0131land\u0131rma\n      resolve: {\n        alias: {\n          '@\/components': resolve(__dirname, '.\/src\/components'),\n          \/\/ Di\u011fer alias'lar buraya eklenebilir\n        },\n      },\n    },\n    \/\/ E\u011fer Webpack kullan\u0131yorsan\u0131z ctWebpackConfig ayar\u0131n\u0131 kullan\u0131n.\n  },\n\n  \/<em> Projeleri yap\u0131land\u0131r\u0131n. <\/em>\/\n  projects: [\n    {\n      name: 'chromium',\n      use: { ...devices['Desktop Chrome'] },\n    },\n    {\n      name: 'firefox',\n      use: { ...devices['Desktop Firefox'] },\n    },\n    {\n      name: 'webkit',\n      use: { ...devices['Desktop Safari'] },\n    },\n  ],\n});<\/code><\/pre>\n<p><strong>Yap\u0131land\u0131rmadaki \u00d6nemli Noktalar:<\/strong><\/p>\n<p>*   <code>testDir<\/code> ve <code>testMatch<\/code>: Playwright&#8217;\u0131n test dosyalar\u0131n\u0131z\u0131 nerede bulaca\u011f\u0131n\u0131 belirler. Genellikle bile\u015fenlerin yan\u0131nda (<code>.spec.tsx<\/code> gibi) tutulur.<br \/>\n*   <code>use.ctPort<\/code>: Bile\u015fenlerinizin geli\u015ftirme sunucusu taraf\u0131ndan sunulaca\u011f\u0131 portu belirtir.<br \/>\n*   <code>use.ctViteConfig<\/code> (veya <code>ctWebpackConfig<\/code>): Bile\u015fenlerinizi derlemek i\u00e7in kullan\u0131lacak Vite (veya Webpack) yap\u0131land\u0131rmas\u0131n\u0131 tan\u0131mlar. Bu, \u00f6zellikle <code>path alias<\/code> (yol takma adlar\u0131) gibi \u00f6zel bundler ayarlar\u0131n\u0131z varsa \u00f6nemlidir.<br \/>\n*   <code>projects<\/code>: Testlerin farkl\u0131 taray\u0131c\u0131larda \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Basit Bir React Bile\u015feni Olu\u015fturma<\/h3>\n<p>\u015eimdi, test edece\u011fimiz basit bir React bile\u015feni olu\u015ftural\u0131m. Bir <code>Counter<\/code> bile\u015feni, hem prop alacak hem de state y\u00f6netecek basit bir \u00f6rnek olacakt\u0131r.<\/p>\n<p><code>src\/components\/Counter.tsx<\/code>:<\/p>\n<pre><code class=\"language-tsx\">import React, { useState } from 'react';\n\ninterface CounterProps {\n  initialValue?: number;\n  step?: number;\n}\n\nconst Counter: React.FC<CounterProps> = ({ initialValue = 0, step = 1 }) => {\n  const [count, setCount] = useState(initialValue);\n\n  const increment = () => {\n    setCount(prevCount => prevCount + step);\n  };\n\n  const decrement = () => {\n    setCount(prevCount => prevCount - step);\n  };\n\n  return (\n    <div className=\"counter-container\">\n      <h2 data-testid=\"counter-value\">Count: {count}<\/h2>\n      <button onClick={increment} data-testid=\"increment-button\">\n        Increment\n      <\/button>\n      <button onClick={decrement} data-testid=\"decrement-button\">\n        Decrement\n      <\/button>\n    <\/div>\n  );\n};\n\nexport default Counter;<\/code><\/pre>\n<p>Bu bile\u015fen, ba\u015flang\u0131\u00e7 de\u011feri ve ad\u0131m boyutu alabilen, art\u0131rma ve azaltma d\u00fc\u011fmeleri olan basit bir sayac\u0131 temsil eder. <code>data-testid<\/code> \u00f6znitelikleri, Playwright se\u00e7icileri i\u00e7in hedef belirlemeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>\u0130lk Bile\u015fen Testini Yazma<\/h3>\n<p>\u015eimdi <code>Counter<\/code> bile\u015fenimiz i\u00e7in bir test dosyas\u0131 olu\u015ftural\u0131m. Bu dosya genellikle bile\u015fenin yan\u0131nda veya <code>__tests__<\/code> gibi \u00f6zel bir klas\u00f6rde bulunur.<\/p>\n<p><code>src\/components\/Counter.spec.tsx<\/code>:<\/p>\n<pre><code class=\"language-tsx\">import { test, expect } from '@playwright\/experimental-ct-react';\nimport Counter from '.\/Counter';\n\ntest.use({ viewport: { width: 500, height: 500 } }); \/\/ Test i\u00e7in \u00f6zel viewport ayar\u0131\n\ntest('should display the initial count', async ({ mount }) => {\n  const component = await mount(<Counter initialValue={10} \/>);\n  await expect(component.getByTestId('counter-value')).toHaveText('Count: 10');\n});\n\ntest('should increment the count when the increment button is clicked', async ({ mount }) => {\n  const component = await mount(<Counter \/>);\n  const incrementButton = component.getByTestId('increment-button');\n  const counterValue = component.getByTestId('counter-value');\n\n  await expect(counterValue).toHaveText('Count: 0'); \/\/ Ba\u015flang\u0131\u00e7 de\u011feri 0\n\n  await incrementButton.click();\n  await expect(counterValue).toHaveText('Count: 1');\n\n  await incrementButton.click();\n  await expect(counterValue).toHaveText('Count: 2');\n});\n\ntest('should decrement the count when the decrement button is clicked', async ({ mount }) => {\n  const component = await mount(<Counter initialValue={5} \/>);\n  const decrementButton = component.getByTestId('decrement-button');\n  const counterValue = component.getByTestId('counter-value');\n\n  await expect(counterValue).toHaveText('Count: 5');\n\n  await decrementButton.click();\n  await expect(counterValue).toHaveText('Count: 4');\n});\n\ntest('should increment\/decrement by the specified step', async ({ mount }) => {\n  const component = await mount(<Counter initialValue={0} step={5} \/>);\n  const incrementButton = component.getByTestId('increment-button');\n  const decrementButton = component.getByTestId('decrement-button');\n  const counterValue = component.getByTestId('counter-value');\n\n  await expect(counterValue).toHaveText('Count: 0');\n\n  await incrementButton.click();\n  await expect(counterValue).toHaveText('Count: 5');\n\n  await decrementButton.click();\n  await expect(counterValue).toHaveText('Count: 0');\n});\n\ntest('should render correctly on different viewports', async ({ mount, page }) => {\n  const component = await mount(<Counter \/>);\n  await expect(component).toBeVisible();\n\n  \/\/ Testin kendisi i\u00e7in viewport ayar\u0131n\u0131 override edebiliriz\n  await page.setViewportSize({ width: 320, height: 480 });\n  await expect(component).toBeVisible(); \/\/ Yine de g\u00f6r\u00fcn\u00fcr olmal\u0131\n  \/\/ G\u00f6rsel regresyon testi burada yap\u0131labilir\n  \/\/ expect(await component.screenshot()).toMatchSnapshot('counter-mobile.png');\n});<\/code><\/pre>\n<p><strong>Test Kodunun A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>*   <code>import { test, expect } from '@playwright\/experimental-ct-react';<\/code>: Playwright&#8217;\u0131n bile\u015fen testi i\u00e7in \u00f6zel olarak sa\u011flad\u0131\u011f\u0131 <code>test<\/code> ve <code>expect<\/code> fonksiyonlar\u0131n\u0131 import ederiz.<br \/>\n*   <code>test.use({ viewport: { width: 500, height: 500 } });<\/code>: Bu, t\u00fcm test blo\u011fu i\u00e7in varsay\u0131lan bir viewport boyutu ayarlar. Her test kendi i\u00e7inde bu ayar\u0131 ge\u00e7ersiz k\u0131labilir.<br \/>\n*   <code>test('...', async ({ mount }) => { ... });<\/code>: Her test blo\u011fu <code>test<\/code> fonksiyonu ile tan\u0131mlan\u0131r. <code>mount<\/code> fonksiyonu, Playwright&#8217;\u0131n bile\u015feni bir taray\u0131c\u0131 ortam\u0131nda render etmesini sa\u011flayan ana ara\u00e7t\u0131r.<br \/>\n*   <code>const component = await mount(<Counter initialValue={10} \/>);<\/code>: <code>Counter<\/code> bile\u015fenini belirli prop&#8217;larla <code>mount<\/code> ederiz. <code>mount<\/code> fonksiyonu, render edilen bile\u015feni temsil eden bir <code>Locator<\/code> d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>component.getByTestId('counter-value')<\/code>: Bile\u015fen i\u00e7indeki belirli bir elementi <code>data-testid<\/code> \u00f6zniteli\u011fi ile buluruz. Playwright, metin, rol, etiket ad\u0131 gibi bir\u00e7ok farkl\u0131 se\u00e7ici t\u00fcr\u00fcn\u00fc destekler.<br \/>\n*   <code>await expect(locator).toHaveText('...');<\/code>: Bulunan elementin beklenen metin i\u00e7eri\u011fine sahip olup olmad\u0131\u011f\u0131n\u0131 do\u011frular\u0131z.<br \/>\n*   <code>await incrementButton.click();<\/code>: D\u00fc\u011fmeye t\u0131klama gibi kullan\u0131c\u0131 etkile\u015fimlerini sim\u00fcle ederiz. Playwright, <code>fill<\/code>, <code>press<\/code>, <code>hover<\/code> gibi bir\u00e7ok etkile\u015fim metoduna sahiptir.<\/p>\n<h3>Geli\u015fmi\u015f Bile\u015fen Testi Teknikleri<\/h3>\n<p>Basit bir bile\u015fenin \u00f6tesine ge\u00e7erek, Playwright ile daha karma\u015f\u0131k senaryolar\u0131 nas\u0131l test edebilece\u011fimize bakal\u0131m.<\/p>\n<h4>Prop ve State Y\u00f6netimi<\/h4>\n<p>Bile\u015fenler genellikle karma\u015f\u0131k prop yap\u0131lar\u0131na ve dahili state&#8217;lere sahiptir. Playwright&#8217;\u0131n <code>mount<\/code> fonksiyonu, farkl\u0131 prop kombinasyonlar\u0131yla bile\u015fenleri kolayca test etmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-tsx\">\/\/ Karma\u015f\u0131k prop'lara sahip bir UserProfile bile\u015feni\ninterface User {\n  id: string;\n  name: string;\n  email: string;\n  isAdmin: boolean;\n}\n\ninterface UserProfileProps {\n  user: User;\n  onEdit: (user: User) => void;\n  onDelete: (userId: string) => void;\n}\n\n\/\/ UserProfile.tsx (\u00f6rnek)\n\/\/ ...\n\n\/\/ UserProfile.spec.tsx\ntest('should display user details correctly for an admin user', async ({ mount }) => {\n  const adminUser: User = {\n    id: '1',\n    name: 'Alice Admin',\n    email: 'alice@example.com',\n    isAdmin: true,\n  };\n  const onEdit = test.fn(); \/\/ Playwright'\u0131n mock fonksiyonu\n  const onDelete = test.fn();\n\n  const component = await mount(<UserProfile user={adminUser} onEdit={onEdit} onDelete={onDelete} \/>);\n\n  await expect(component.getByText('Alice Admin')).toBeVisible();\n  await expect(component.getByText('alice@example.com')).toBeVisible();\n  await expect(component.getByRole('button', { name: 'Edit Profile' })).toBeVisible();\n  await expect(component.getByRole('button', { name: 'Delete User' })).toBeVisible();\n});\n\ntest('should not show delete button for non-admin users', async ({ mount }) => {\n  const normalUser: User = {\n    id: '2',\n    name: 'Bob User',\n    email: 'bob@example.com',\n    isAdmin: false,\n  };\n  const onEdit = test.fn();\n  const onDelete = test.fn();\n\n  const component = await mount(<UserProfile user={normalUser} onEdit={onEdit} onDelete={onDelete} \/>);\n\n  await expect(component.getByRole('button', { name: 'Delete User' })).not.toBeVisible();\n});\n\ntest('should call onEdit when edit button is clicked', async ({ mount }) => {\n  const user: User = { id: '1', name: 'Alice', email: 'a@e.com', isAdmin: false };\n  const onEdit = test.fn();\n  const onDelete = test.fn();\n\n  const component = await mount(<UserProfile user={user} onEdit={onEdit} onDelete={onDelete} \/>);\n  await component.getByRole('button', { name: 'Edit Profile' }).click();\n\n  expect(onEdit).toHaveBeenCalledWith(user); \/\/ onEdit fonksiyonunun do\u011fru arg\u00fcmanla \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 do\u011frula\n});<\/code><\/pre>\n<h4>Olay Tetikleme ve Asenkron Etkile\u015fimler<\/h4>\n<p>Kullan\u0131c\u0131 etkile\u015fimleri ve asenkron i\u015flemler (\u00f6rne\u011fin, API \u00e7a\u011fr\u0131lar\u0131 sonras\u0131 state g\u00fcncellemeleri) Playwright ile kolayca test edilebilir.<\/p>\n<pre><code class=\"language-tsx\">\/\/ LoginForm.tsx (\u00f6rnek)\n\/\/ Bir onSubmit prop'u alan ve kullan\u0131c\u0131 giri\u015fi yapan bir form.\n\/\/ ...\n\n\/\/ LoginForm.spec.tsx\ntest('should submit form with correct credentials', async ({ mount }) => {\n  const onSubmit = test.fn();\n  const component = await mount(<LoginForm onSubmit={onSubmit} \/>);\n\n  await component.getByLabel('Username').fill('testuser');\n  await component.getByLabel('Password').fill('password123');\n  await component.getByRole('button', { name: 'Login' }).click();\n\n  expect(onSubmit).toHaveBeenCalledWith({ username: 'testuser', password: 'password123' });\n});\n\n\/\/ Asenkron bir i\u015flem sonras\u0131 y\u00fckleme durumunu test etme\ntest('should show loading spinner during async submission', async ({ mount }) => {\n  const onSubmit = test.fn(async () => {\n    await new Promise(resolve => setTimeout(resolve, 100)); \/\/ 100ms gecikme\n  });\n  const component = await mount(<LoginForm onSubmit={onSubmit} \/>);\n\n  await component.getByLabel('Username').fill('testuser');\n  await component.getByLabel('Password').fill('password123');\n  await component.getByRole('button', { name: 'Login' }).click();\n\n  await expect(component.getByTestId('loading-spinner')).toBeVisible();\n  await expect(component.getByRole('button', { name: 'Login' })).toBeDisabled();\n\n  await onSubmit; \/\/ Promise'\u0131n tamamlanmas\u0131n\u0131 bekle\n  await expect(component.getByTestId('loading-spinner')).not.toBeVisible();\n  await expect(component.getByRole('button', { name: 'Login' })).toBeEnabled();\n});<\/code><\/pre>\n<h4>Mocking ve Stubbing<\/h4>\n<p>Bile\u015fenler genellikle harici API&#8217;lere, context&#8217;lere veya custom hook&#8217;lara ba\u011f\u0131ml\u0131d\u0131r. Bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 Playwright testleri i\u00e7inde mock&#8217;lamak, bile\u015fenleri izole bir \u015fekilde test etmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><strong>API \u00c7a\u011fr\u0131lar\u0131n\u0131 Mocklama (<code>page.route()<\/code>):<\/strong><\/p>\n<pre><code class=\"language-tsx\">\/\/ UserList.tsx (\u00f6rnek)\n\/\/ API'den kullan\u0131c\u0131 listesi \u00e7eken bir bile\u015fen\n\/\/ ...\n\n\/\/ UserList.spec.tsx\ntest('should display a list of users fetched from API', async ({ mount, page }) => {\n  \/\/ API \u00e7a\u011fr\u0131s\u0131n\u0131 mock'la\n  await page.route('<em><\/em>\/api\/users', route => {\n    route.fulfill({\n      status: 200,\n      contentType: 'application\/json',\n      body: JSON.stringify([\n        { id: '1', name: 'Alice' },\n        { id: '2', name: 'Bob' },\n      ]),\n    });\n  });\n\n  const component = await mount(<UserList \/>);\n\n  await expect(component.getByText('Alice')).toBeVisible();\n  await expect(component.getByText('Bob')).toBeVisible();\n});<\/code><\/pre>\n<p><strong>Context API veya Custom Hook&#8217;lar\u0131 Mocklama:<\/strong><\/p>\n<p>Playwright&#8217;\u0131n <code>mount<\/code> fonksiyonu, bir bile\u015feni render ederken kendi <code>Provider<\/code>&#8216;lar\u0131n\u0131z\u0131 veya mock&#8217;lanm\u0131\u015f hook&#8217;lar\u0131n\u0131z\u0131 sarmalaman\u0131za izin verir.<\/p>\n<pre><code class=\"language-tsx\">\/\/ ThemeContext.tsx (\u00f6rnek)\n\/\/ Bir tema sa\u011flayan Context\n\/\/ ...\n\n\/\/ ThemedButton.tsx (\u00f6rnek)\n\/\/ ThemeContext'ten tema kullanan bir d\u00fc\u011fme\n\/\/ ...\n\n\/\/ ThemedButton.spec.tsx\nimport { test, expect } from '@playwright\/experimental-ct-react';\nimport { ThemeProvider } from '..\/contexts\/ThemeContext'; \/\/ Ger\u00e7ek Context Provider\nimport ThemedButton from '.\/ThemedButton';\n\ntest('should render button with light theme', async ({ mount }) => {\n  const component = await mount(\n    <ThemeProvider value={{ theme: 'light', toggleTheme: () => {} }}>\n      <ThemedButton \/>\n    <\/ThemeProvider>\n  );\n\n  await expect(component.locator('button')).toHaveCSS('background-color', 'rgb(255, 255, 255)'); \/\/ Beyaz arkaplan\n});\n\ntest('should render button with dark theme', async ({ mount }) => {\n  const component = await mount(\n    <ThemeProvider value={{ theme: 'dark', toggleTheme: () => {} }}>\n      <ThemedButton \/>\n    <\/ThemeProvider>\n  );\n\n  await expect(component.locator('button')).toHaveCSS('background-color', 'rgb(0, 0, 0)'); \/\/ Siyah arkaplan\n});<\/code><\/pre>\n<h4>G\u00f6rsel Regresyon Testleri<\/h4>\n<p>Playwright, bile\u015fenlerin g\u00f6rsel \u00e7\u0131kt\u0131lar\u0131n\u0131n ekran g\u00f6r\u00fcnt\u00fclerini alarak, UI de\u011fi\u015fikliklerinin beklenmeyen g\u00f6rsel bozulmalara yol a\u00e7\u0131p a\u00e7mad\u0131\u011f\u0131n\u0131 kontrol etmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-tsx\">test('should match snapshot of the counter component', async ({ mount }) => {\n  const component = await mount(<Counter initialValue={10} \/>);\n  await expect(component).toHaveScreenshot('counter-initial.png');\n});\n\ntest('should match snapshot after incrementing', async ({ mount }) => {\n  const component = await mount(<Counter initialValue={0} \/>);\n  await component.getByTestId('increment-button').click();\n  await expect(component).toHaveScreenshot('counter-incremented.png');\n});<\/code><\/pre>\n<p><code>toHaveScreenshot<\/code> ilk \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda bir referans ekran g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturur. Sonraki \u00e7al\u0131\u015ft\u0131rmalarda, mevcut ekran g\u00f6r\u00fcnt\u00fcs\u00fc referansla kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r. Herhangi bir fark bulunursa test ba\u015far\u0131s\u0131z olur ve farklar\u0131 g\u00f6steren bir rapor olu\u015fturulur.<\/p>\n<h4>Eri\u015filebilirlik (Accessibility) Testleri<\/h4>\n<p>Playwright, <code>axe-playwright<\/code> gibi k\u00fct\u00fcphanelerle entegre olarak bile\u015fenlerinizin eri\u015filebilirlik standartlar\u0131na uygunlu\u011funu otomatik olarak kontrol etmenize olanak tan\u0131r.<\/p>\n<pre><code class=\"language-bash\">npm install -D axe-playwright<\/code><\/pre>\n<pre><code class=\"language-tsx\">import { test, expect } from '@playwright\/experimental-ct-react';\nimport { injectAxe, checkA11y } from 'axe-playwright';\nimport Counter from '.\/Counter';\n\ntest('Counter component should be accessible', async ({ mount, page }) => {\n  await mount(<Counter \/>);\n  await injectAxe(page); \/\/ Axe k\u00fct\u00fcphanesini sayfaya enjekte et\n  await checkA11y(page, null, {\n    \/\/ Kurallar\u0131 \u00f6zelle\u015ftirebilirsiniz\n    detailedReport: true,\n    detailedReportOptions: { html: true },\n  });\n});<\/code><\/pre>\n<p>Bu test, <code>Counter<\/code> bile\u015feninin WCAG (Web Content Accessibility Guidelines) standartlar\u0131na uygun olup olmad\u0131\u011f\u0131n\u0131 kontrol eder ve herhangi bir ihlal durumunda test ba\u015far\u0131s\u0131z olur.<\/p>\n<h3>Testleri \u00c7al\u0131\u015ft\u0131rma ve Raporlama<\/h3>\n<p>Playwright testlerinizi \u00e7al\u0131\u015ft\u0131rmak ve sonu\u00e7lar\u0131 raporlamak olduk\u00e7a basittir.<\/p>\n<p><strong>1. Testleri \u00c7al\u0131\u015ft\u0131rma:<\/strong><\/p>\n<p>T\u00fcm bile\u015fen testlerini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">npx playwright test --project=component<\/code><\/pre>\n<p><code>--project=component<\/code> parametresi, <code>playwright.config.ts<\/code> dosyas\u0131nda tan\u0131mlanan bile\u015fen test projesini hedef al\u0131r. E\u011fer varsay\u0131lan olarak t\u00fcm projeleri \u00e7al\u0131\u015ft\u0131rmak isterseniz sadece <code>npx playwright test<\/code> de kullanabilirsiniz.<\/p>\n<p>Belirli bir test dosyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">npx playwright test src\/components\/Counter.spec.tsx<\/code><\/pre>\n<p>Belirli bir test blo\u011funu veya testi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>--grep<\/code> veya <code>--grep-invert<\/code> kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npx playwright test --grep \"initial count\"<\/code><\/pre>\n<p><strong>2. UI Modu:<\/strong><\/p>\n<p>Playwright&#8217;\u0131n UI modu, testlerinizi g\u00f6rsel olarak \u00e7al\u0131\u015ft\u0131rman\u0131za, hata ay\u0131klaman\u0131za ve ad\u0131m ad\u0131m ilerlemenize olanak tan\u0131r.<\/p>\n<pre><code class=\"language-bash\">npx playwright test --ui<\/code><\/pre>\n<p>Bu, taray\u0131c\u0131da Playwright Test Runner UI&#8217;\u0131n\u0131 a\u00e7ar. Burada testleri tek tek veya toplu olarak \u00e7al\u0131\u015ft\u0131rabilir, ad\u0131mlar\u0131 g\u00f6rebilir, DOM&#8217;u inceleyebilir ve ekran g\u00f6r\u00fcnt\u00fclerini kar\u015f\u0131la\u015ft\u0131rabilirsiniz.<\/p>\n<p><strong>3. HTML Raporu:<\/strong><\/p>\n<p>Testler tamamland\u0131ktan sonra, Playwright otomatik olarak kapsaml\u0131 bir HTML raporu olu\u015fturur.<\/p>\n<pre><code class=\"language-bash\">npx playwright show-report<\/code><\/pre>\n<p>Bu komut, taray\u0131c\u0131n\u0131zda <code>playwright-report<\/code> klas\u00f6r\u00fcndeki HTML raporunu a\u00e7ar. Rapor, ge\u00e7en, ba\u015far\u0131s\u0131z olan veya atlanan testleri, test s\u00fcrelerini, hata mesajlar\u0131n\u0131, ekran g\u00f6r\u00fcnt\u00fclerini ve videolar\u0131 (yap\u0131land\u0131r\u0131lm\u0131\u015fsa) g\u00f6sterir.<\/p>\n<p><strong>4. CI\/CD Entegrasyonu:<\/strong><\/p>\n<p>Playwright testleri, GitHub Actions, GitLab CI, Jenkins gibi s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) pipeline&#8217;lar\u0131na kolayca entegre edilebilir. Genellikle, <code>npx playwright test<\/code> komutu CI ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r ve <code>--reporter=github<\/code> veya <code>--reporter=json<\/code> gibi farkl\u0131 raporlama se\u00e7enekleri kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># \u00d6rnek GitHub Actions i\u015f ak\u0131\u015f\u0131\nname: Playwright Component Tests\n\non:\n  push:\n    branches: [ \"main\" ]\n  pull_request:\n    branches: [ \"main\" ]\n\njobs:\n  test:\n    timeout-minutes: 60\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v3\n    - uses: actions\/setup-node@v3\n      with:\n        node-version: 18\n    - name: Install dependencies\n      run: npm ci\n    - name: Install Playwright browsers\n      run: npx playwright install --with-deps\n    - name: Run Playwright tests\n      run: npx playwright test --project=component\n    - uses: actions\/upload-artifact@v3\n      if: always()\n      with:\n        name: playwright-report\n        path: playwright-report\/\n        retention-days: 30<\/code><\/pre>\n<h3>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Playwright ile bile\u015fen testlerini yazarken verimlili\u011fi ve test kalitesini art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar \u015funlard\u0131r:<\/p>\n<p>1.  <strong>\u0130zolasyonu Koruyun:<\/strong> Her test, test etti\u011fi bile\u015fenin tek bir y\u00f6n\u00fcne odaklanmal\u0131 ve di\u011fer bile\u015fenlerden veya d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klardan izole olmal\u0131d\u0131r. Mocklama tekniklerini kullanarak bu izolasyonu sa\u011flay\u0131n.<br \/>\n2.  <strong>Anlaml\u0131 Se\u00e7iciler Kullan\u0131n:<\/strong> <code>data-testid<\/code> \u00f6znitelikleri, testlerinizin UI de\u011fi\u015fikliklerinden daha az etkilenmesini sa\u011flar. <code>getByRole<\/code>, <code>getByText<\/code>, <code>getByLabel<\/code> gibi Playwright&#8217;\u0131n kullan\u0131c\u0131ya y\u00f6nelik se\u00e7icilerini tercih edin. CSS se\u00e7icileri (<code>.my-class<\/code>) veya XPath, genellikle daha k\u0131r\u0131lgan olabilir.<br \/>\n3.  <strong>A\u00e7\u0131klay\u0131c\u0131 Test \u0130simleri:<\/strong> Test fonksiyonlar\u0131n\u0131za neyi test ettiklerini a\u00e7\u0131k\u00e7a belirten isimler verin. &#8220;should display initial count&#8221; gibi.<br \/>\n4.  <strong>Arrange-Act-Assert (AAA) Prensibi:<\/strong> Her testinizi \u00fc\u00e7 a\u015famaya ay\u0131r\u0131n:<br \/>\n    *   <strong>Arrange (Haz\u0131rl\u0131k):<\/strong> Test ortam\u0131n\u0131 ve bile\u015feni kurun (mount edin, prop&#8217;lar\u0131 ayarlay\u0131n).<br \/>\n    *   <strong>Act (Eylem):<\/strong> Bile\u015fenle etkile\u015fime ge\u00e7in (t\u0131klay\u0131n, yaz\u0131n).<br \/>\n    *   <strong>Assert (Do\u011frulama):<\/strong> Bile\u015fenin beklenen \u015fekilde davrand\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n.<br \/>\n5.  <strong>Duyarl\u0131 Testler:<\/strong> Bile\u015fenlerinizin farkl\u0131 ekran boyutlar\u0131nda nas\u0131l davrand\u0131\u011f\u0131n\u0131 test etmek i\u00e7in <code>test.use({ viewport: { width, height } })<\/code> ile farkl\u0131 viewport boyutlar\u0131 kullan\u0131n.<br \/>\n6.  <strong>Performans \u0130pu\u00e7lar\u0131:<\/strong><br \/>\n    *   Testleri paralel \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>fullyParallel: true<\/code> ayar\u0131n\u0131 kullan\u0131n.<br \/>\n    *   Gereksiz yere <code>page.pause()<\/code> veya <code>page.waitForTimeout()<\/code> kullanmaktan ka\u00e7\u0131n\u0131n. Playwright&#8217;\u0131n otomatik bekleme mekanizmalar\u0131 genellikle yeterlidir.<br \/>\n    *   Headless modda \u00e7al\u0131\u015ft\u0131r\u0131n (<code>playwright.config.ts<\/code> i\u00e7inde <code>headless: true<\/code> varsay\u0131lan olarak gelir).<br \/>\n7.  <strong>Test Verilerini Y\u00f6netme (Fixtures):<\/strong> Karma\u015f\u0131k veya tekrarlayan test verileri i\u00e7in Playwright&#8217;\u0131n <code>fixtures<\/code> \u00f6zelli\u011fini kullanabilirsiniz. Bu, test kodunuzu daha temiz ve yeniden kullan\u0131labilir hale getirir.<\/p>\n<h3>S\u0131k Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>*   <strong>Asenkron \u0130\u015flemlerin Beklenmesi:<\/strong> Playwright, DOM de\u011fi\u015fikliklerini otomatik olarak beklese de, bazen API \u00e7a\u011fr\u0131lar\u0131 gibi uzun s\u00fcreli asenkron i\u015flemlerin tamamlanmas\u0131n\u0131 manuel olarak beklemeniz gerekebilir. <code>await page.waitForSelector()<\/code>, <code>await expect(locator).toBeVisible()<\/code> veya <code>await expect(locator).toBeEnabled()<\/code> gibi y\u00f6ntemler, elementlerin g\u00f6r\u00fcn\u00fcr veya etkile\u015fimli olmas\u0131n\u0131 beklemek i\u00e7in etkilidir.<br \/>\n*   <strong>Se\u00e7ici Sorunlar\u0131:<\/strong> Yanl\u0131\u015f se\u00e7ici kullan\u0131m\u0131 veya elementlerin DOM&#8217;a ge\u00e7 y\u00fcklenmesi se\u00e7ici hatalar\u0131na yol a\u00e7abilir. <code>data-testid<\/code> kullanmak ve Playwright&#8217;\u0131n otomatik bekleme \u00f6zelliklerine g\u00fcvenmek bu sorunlar\u0131 azalt\u0131r. Gerekirse <code>page.locator('selector', { hasText: '...' })<\/code> gibi daha spesifik se\u00e7iciler kullan\u0131n.<br \/>\n*   <strong>Yap\u0131land\u0131rma Hatalar\u0131:<\/strong> <code>playwright.config.ts<\/code> dosyas\u0131ndaki yanl\u0131\u015f <code>testMatch<\/code>, <code>ctViteConfig<\/code> veya <code>ctPort<\/code> ayarlar\u0131 testlerin \u00e7al\u0131\u015fmamas\u0131na neden olabilir. Konsol \u00e7\u0131kt\u0131lar\u0131n\u0131 dikkatlice inceleyin. \u00d6zellikle <code>ctViteConfig<\/code> i\u00e7indeki <code>alias<\/code> ayarlar\u0131n\u0131n projenizin <code>vite.config.ts<\/code> dosyas\u0131yla e\u015fle\u015fti\u011finden emin olun.<br \/>\n*   <strong>CSS\/Stil Y\u00fckleme Sorunlar\u0131:<\/strong> Bazen bile\u015fen testleri s\u0131ras\u0131nda CSS dosyalar\u0131 do\u011fru \u015fekilde y\u00fcklenmeyebilir ve bu da g\u00f6rsel testlerde veya stil tabanl\u0131 kontrollerde sorunlara yol a\u00e7abilir. <code>playwright.config.ts<\/code> i\u00e7indeki <code>ctViteConfig<\/code> veya <code>ctWebpackConfig<\/code> ayarlar\u0131n\u0131z\u0131n, projenizin stil y\u00fckleme kurallar\u0131n\u0131 (CSS mod\u00fclleri, PostCSS, Sass vb.) do\u011fru \u015fekilde yans\u0131tt\u0131\u011f\u0131ndan emin olun.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>React uygulamalar\u0131 i\u00e7in Playwright ile bile\u015fen testi, modern \u00f6n y\u00fcz geli\u015ftirme s\u00fcre\u00e7lerinin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Playwright&#8217;\u0131n ger\u00e7ek taray\u0131c\u0131 ortam\u0131nda bile\u015fenleri izole bir \u015fekilde test etme yetene\u011fi, geli\u015ftiricilere h\u0131zl\u0131 geri bildirim, y\u00fcksek g\u00fcvenilirlik ve kapsaml\u0131 test kapsam\u0131 sa\u011flar. Bu yakla\u015f\u0131m, birim testlerinin s\u0131n\u0131rlamalar\u0131n\u0131 a\u015farken, E2E testlerinin yava\u015fl\u0131\u011f\u0131n\u0131 ve k\u0131r\u0131lganl\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/p>\n<p>Playwright&#8217;\u0131n <code>@playwright\/experimental-ct-react<\/code> paketi ve g\u00fc\u00e7l\u00fc API&#8217;leri sayesinde, React bile\u015fenlerinizin prop&#8217;lara nas\u0131l tepki verdi\u011fini, state&#8217;i nas\u0131l y\u00f6netti\u011fini, kullan\u0131c\u0131 etkile\u015fimlerine nas\u0131l yan\u0131t verdi\u011fini ve hatta g\u00f6rsel olarak nas\u0131l g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc detayl\u0131 bir \u015fekilde test edebilirsiniz. Mocklama, eri\u015filebilirlik kontrolleri ve g\u00f6rsel regresyon testleri gibi geli\u015fmi\u015f tekniklerle birle\u015fti\u011finde, Playwright ile bile\u015fen testleri, React uygulamalar\u0131n\u0131z\u0131n kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<p>Geli\u015ftirme s\u00fcrecinize Playwright ile bile\u015fen testlerini entegre etmek, daha az hata i\u00e7eren, daha stabil ve kullan\u0131c\u0131 beklentilerini kar\u015f\u0131layan React uygulamalar\u0131 olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Bu yat\u0131r\u0131m, uzun vadede hem geli\u015ftirici verimlili\u011fini art\u0131racak hem de son kullan\u0131c\u0131n\u0131n memnuniyetini sa\u011flayacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131\nYaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin sa\u011flanmas\u0131, uygulaman\u0131n ba\u015far\u0131s","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":[128],"tags":[],"class_list":{"0":"post-38458","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","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>React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131\" \/>\n<meta property=\"og:description\" content=\"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131 Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin sa\u011flanmas\u0131, uygulaman\u0131n ba\u015far\u0131s\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-31T12:41:00+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131\",\"datePublished\":\"2026-01-31T12:41:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/\"},\"wordCount\":2802,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/\",\"name\":\"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-31T12:41:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131\"}]},{\"@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":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/","og_locale":"tr_TR","og_type":"article","og_title":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131","og_description":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131 Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde kalitenin sa\u011flanmas\u0131, uygulaman\u0131n ba\u015far\u0131s","og_url":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-31T12:41:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131","datePublished":"2026-01-31T12:41:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/"},"wordCount":2802,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/","url":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/","name":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-31T12:41:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalari-icin-playwright-ile-bilesen-testi-uygulamalari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React Uygulamalar\u0131 i\u00e7in Playwright ile Bile\u015fen Testi Uygulamalar\u0131"}]},{"@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\/38458","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=38458"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38458\/revisions"}],"predecessor-version":[{"id":38459,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38458\/revisions\/38459"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}