{"id":43105,"date":"2026-07-05T21:10:31","date_gmt":"2026-07-05T18:10:31","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/"},"modified":"2026-07-05T21:11:06","modified_gmt":"2026-07-05T18:11:06","slug":"firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/","title":{"rendered":"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?"},"content":{"rendered":"<h2>Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?<\/h2>\n<p>Kullan\u0131c\u0131 gizlili\u011finin her ge\u00e7en g\u00fcn daha fazla \u00f6nem kazand\u0131\u011f\u0131 dijital d\u00fcnyada, web uygulamalar\u0131n\u0131z\u0131n \u00f6zel gezinme (private browsing) modunda kusursuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik bir hal alm\u0131\u015ft\u0131r. Peki, Firefox&#8217;un \u00f6zel gezinme penceresinin kendine has \u00f6zelliklerini g\u00f6z \u00f6n\u00fcnde bulundurarak, uygulamalar\u0131n\u0131z\u0131n bu modda beklenen gizlilik ve i\u015flevsellik standartlar\u0131n\u0131 kar\u015f\u0131lad\u0131\u011f\u0131n\u0131 nas\u0131l test edebilirsiniz? Bu makalede, Firefox&#8217;un \u00f6zel gezinme modunu hedef alan etkili birim testleri (unit tests) yazman\u0131n inceliklerini, ad\u0131m ad\u0131m \u00f6rneklerle ve pratik \u00e7\u00f6z\u00fcm \u00f6nerileriyle ke\u015ffedece\u011fiz. B\u00f6ylece, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n verilerinin g\u00fcvende oldu\u011fundan ve uygulaman\u0131z\u0131n her senaryoda sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabileceksiniz.<\/p>\n<h3>\u00d6zel Gezinme Modu ve Birim Testlerinin Temelleri Nelerdir?<\/h3>\n<p>Web geli\u015ftirme s\u00fcre\u00e7lerinde, kullan\u0131c\u0131lar\u0131n deneyimini ve veri gizlili\u011fini sa\u011flamak ad\u0131na \u00e7e\u015fitli test yakla\u015f\u0131mlar\u0131 benimsenir. Bu yakla\u015f\u0131mlardan biri olan birim testleri, yaz\u0131l\u0131m\u0131n en k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z par\u00e7alar\u0131n\u0131 (birimleri) test ederek, her bir bile\u015fenin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamay\u0131 hedefler. Ancak konu, Firefox gibi modern taray\u0131c\u0131lar\u0131n sundu\u011fu &#8220;\u00d6zel Gezinme&#8221; (Private Browsing) modu oldu\u011funda, geleneksel test y\u00f6ntemleri baz\u0131 \u00f6zel zorluklarla kar\u015f\u0131la\u015fabilir. \u00d6zel gezinme modu, kullan\u0131c\u0131lar\u0131n web sitelerini ziyaret ederken taray\u0131c\u0131 ge\u00e7mi\u015fi, arama ge\u00e7mi\u015fi, \u00e7erezler (cookies) ve ge\u00e7ici dosyalar gibi ki\u015fisel verilerinin cihazda depolanmas\u0131n\u0131 engeller. Bu, kullan\u0131c\u0131lar\u0131n internette daha anonim ve iz b\u0131rakmadan gezinmelerini sa\u011flar. Firefox&#8217;un \u00f6zel gezinme modu, bu \u00f6zellikleri daha da ileriye ta\u015f\u0131yarak geli\u015fmi\u015f izleme korumas\u0131 (Enhanced Tracking Protection) gibi \u00f6zelliklerle kullan\u0131c\u0131 gizlili\u011fini maksimum seviyeye \u00e7\u0131karmay\u0131 ama\u00e7lar. Bu modda a\u00e7\u0131lan her pencere, kendi izole oturumuna (isolated session) sahiptir ve genellikle \u00f6nceki oturumlardan veya di\u011fer normal pencerelerden hi\u00e7bir veri ta\u015f\u0131maz.<\/p>\n<p>Peki, bu durum birim testlerini nas\u0131l etkiler? Birim testleri, genellikle belirli bir fonksiyonu veya mod\u00fcl\u00fc izole bir ortamda test etmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Ancak \u00f6zel gezinme modunda bir uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 test etmek, sadece uygulaman\u0131n kodunu de\u011fil, ayn\u0131 zamanda taray\u0131c\u0131n\u0131n bu \u00f6zel moddaki davran\u0131\u015f\u0131n\u0131 da dikkate almay\u0131 gerektirir. \u00d6rne\u011fin, bir web uygulamas\u0131n\u0131n kullan\u0131c\u0131 tercihlerini \u00e7erezlerde saklad\u0131\u011f\u0131n\u0131 varsayal\u0131m. Normal bir taray\u0131c\u0131 oturumunda bu \u00e7erezler kal\u0131c\u0131 olurken, \u00f6zel gezinme modunda taray\u0131c\u0131 kapat\u0131ld\u0131\u011f\u0131nda bu \u00e7erezlerin silinmesi beklenir. Uygulaman\u0131z\u0131n bu beklentiye uygun davrand\u0131\u011f\u0131n\u0131 do\u011frulamak, \u00f6zel gezinme moduna \u00f6zg\u00fc test senaryolar\u0131 gerektirir. Bu, asl\u0131nda uygulaman\u0131z\u0131n &#8220;\u00f6zel gezinme moduyla etkile\u015fim birimini&#8221; test etmek anlam\u0131na gelir. Bu testler, uygulaman\u0131z\u0131n g\u00fcvenlik ve gizlilik politikalar\u0131na uyup uymad\u0131\u011f\u0131n\u0131, veri s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nleyip \u00f6nlemedi\u011fini ve kullan\u0131c\u0131lar\u0131n bekledi\u011fi izolasyonu sa\u011flay\u0131p sa\u011flamad\u0131\u011f\u0131n\u0131 anlamak i\u00e7in hayati \u00f6neme sahiptir. Ayr\u0131ca, \u00f6zel gezinme modunda baz\u0131 taray\u0131c\u0131 API&#8217;lerinin (uygulama programlama aray\u00fczleri) veya \u00f6zelliklerinin farkl\u0131 davranabilece\u011fi durumlar da olabilir; bu t\u00fcr farkl\u0131l\u0131klar\u0131n uygulaman\u0131z \u00fczerindeki etkilerini tespit etmek de bu testlerin kapsam\u0131na girer. Dolay\u0131s\u0131yla, sadece uygulaman\u0131n kendi i\u00e7 mant\u0131\u011f\u0131n\u0131 de\u011fil, ayn\u0131 zamanda taray\u0131c\u0131n\u0131n \u00f6zel modunun getirdi\u011fi d\u0131\u015fsal k\u0131s\u0131tlamalar ve davran\u0131\u015f de\u011fi\u015fiklikleri kar\u015f\u0131s\u0131nda uygulaman\u0131n nas\u0131l tepki verdi\u011fini de test etmemiz gerekir. Bu da bize, \u00f6zel gezinme modu i\u00e7in yaz\u0131lacak birim testlerinin, asl\u0131nda uygulaman\u0131n taray\u0131c\u0131 ortam\u0131yla olan etkile\u015fiminin kritik bir par\u00e7as\u0131n\u0131 test etti\u011fini g\u00f6sterir. Bu \u00f6zel testler sayesinde, uygulaman\u0131z\u0131n her t\u00fcrl\u00fc kullan\u0131c\u0131 senaryosunda g\u00fcvenilir ve gizlili\u011fe sayg\u0131l\u0131 bir deneyim sundu\u011fundan emin olabilirsiniz. Bu testler, uygulaman\u0131z\u0131n genel kalitesini art\u0131rman\u0131n yan\u0131 s\u0131ra, kullan\u0131c\u0131 g\u00fcvenini kazanmada da \u00f6nemli bir rol oynar.<\/p>\n<h3>Firefox \u00d6zel Gezinme Ortam\u0131 Testlere Nas\u0131l Haz\u0131rlan\u0131r?<\/h3>\n<p>Firefox&#8217;un \u00f6zel gezinme pencereleri i\u00e7in birim testleri yazmaya ba\u015flamadan \u00f6nce, uygun bir test ortam\u0131 kurmak esast\u0131r. Bu s\u00fcre\u00e7, taray\u0131c\u0131 otomasyonu i\u00e7in gerekli ara\u00e7lar\u0131 y\u00fcklemeyi ve test projenizi yap\u0131land\u0131rmay\u0131 i\u00e7erir. Modern web otomasyonu ara\u00e7lar\u0131 aras\u0131nda <a href=\"https:\/\/playwright.dev\/\">Playwright<\/a> ve <a href=\"https:\/\/www.selenium.dev\/\">Selenium WebDriver<\/a> \u00f6ne \u00e7\u0131kar. Bu makalede, daha g\u00fcncel ve kullan\u0131m\u0131 kolay olmas\u0131 nedeniyle Playwright&#8217;\u0131 tercih edece\u011fiz, ancak benzer mant\u0131k Selenium ile de uygulanabilir. Playwright, farkl\u0131 taray\u0131c\u0131lar\u0131 (Chromium, Firefox, WebKit) tek bir API (uygulama programlama aray\u00fcz\u00fc) \u00fczerinden kontrol etme yetene\u011fi sunar ve \u00f6zel taray\u0131c\u0131 ba\u011flamlar\u0131n\u0131 (private browser contexts) kolayca y\u00f6netebilir. \u0130lk ad\u0131m olarak, sisteminizde Node.js kurulu oldu\u011fundan emin olun. Node.js, Playwright&#8217;\u0131 kurmak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in gereklidir. E\u011fer kurulu de\u011filse, resmi web sitesinden indirebilirsiniz.<\/p>\n<p>Proje kurulumuna gelince, yeni bir Node.js projesi ba\u015flatarak ba\u015flayabiliriz. Bunun i\u00e7in komut sat\u0131r\u0131nda \u015fu ad\u0131mlar\u0131 izleyin:<\/p>\n<div class=\"code-container\">\n<pre><code>\nmkdir firefox-private-test\ncd firefox-private-test\nnpm init -y\nnpm install --save-dev playwright test\n  <\/code><\/pre>\n<\/div>\n<p>Bu komutlar, yeni bir dizin olu\u015fturur, dizine ge\u00e7er, bir <code>package.json<\/code> dosyas\u0131 ba\u015flat\u0131r ve Playwright&#8217;\u0131 geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olarak kurar. Playwright&#8217;\u0131 kurdu\u011funuzda, varsay\u0131lan olarak Chromium, Firefox ve WebKit taray\u0131c\u0131lar\u0131 da indirilecektir. \u015eimdi, Firefox&#8217;u \u00f6zel gezinme modunda ba\u015flatacak ve basit bir test ger\u00e7ekle\u015ftirecek bir \u00f6rnek olu\u015ftural\u0131m. Playwright&#8217;ta \u00f6zel gezinme penceresi, &#8220;incognito context&#8221; veya &#8220;private context&#8221; olarak adland\u0131r\u0131l\u0131r ve taray\u0131c\u0131 ba\u015flat\u0131l\u0131rken bu ba\u011flam\u0131 belirtmek olduk\u00e7a basittir. Temel bir test dosyas\u0131 (<code>test-private-mode.js<\/code> ad\u0131nda) olu\u015ftural\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ test-private-mode.js\nconst { firefox } = require('playwright');\nconst { expect } = require('@playwright\/test'); \/\/ Playwright'\u0131n kendi test runner'\u0131 i\u00e7in\n\n(async () => {\n  let browser;\n  try {\n    \/\/ Firefox taray\u0131c\u0131s\u0131n\u0131 ba\u015flat\n    browser = await firefox.launch();\n    \n    \/\/ \u00d6zel bir gezinme ba\u011flam\u0131 (incognito context) olu\u015ftur\n    \/\/ Bu, Firefox'ta \u00f6zel gezinme penceresi a\u00e7maya e\u015fde\u011ferdir.\n    const context = await browser.newContext();\n    \n    \/\/ Bu ba\u011flam i\u00e7inde yeni bir sayfa a\u00e7\n    const page = await context.newPage();\n    \n    console.log('Firefox \u00f6zel gezinme penceresi ba\u015far\u0131yla a\u00e7\u0131ld\u0131.');\n\n    \/\/ Bir web sitesine git (\u00f6rne\u011fin, bir test sunucunuz varsa)\n    await page.goto('https:\/\/www.example.com');\n    console.log('example.com adresine gidildi.');\n\n    \/\/ Sayfan\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 kontrol et\n    const pageTitle = await page.title();\n    console.log(<code>Sayfa Ba\u015fl\u0131\u011f\u0131: ${pageTitle}<\/code>);\n    expect(pageTitle).toContain('Example Domain'); \/\/ Ba\u015fl\u0131kta \"Example Domain\" ge\u00e7mesini bekle\n\n    \/\/ \u00d6zel modda \u00e7erezlerin nas\u0131l davrand\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in basit bir senaryo\n    \/\/ Bir \u00e7erez ayarlayal\u0131m\n    await context.addCookies([{ name: 'testCookie', value: 'privateValue', url: 'https:\/\/www.example.com' }]);\n    console.log('Test \u00e7erezi ayarland\u0131.');\n\n    \/\/ \u00c7erezi okumaya \u00e7al\u0131\u015fal\u0131m\n    const cookies = await context.cookies('https:\/\/www.example.com');\n    const testCookie = cookies.find(c => c.name === 'testCookie');\n    expect(testCookie).toBeDefined(); \/\/ \u00c7erezin ayarland\u0131\u011f\u0131n\u0131 do\u011frula\n    console.log('Test \u00e7erezi ba\u015far\u0131yla okundu.');\n\n    \/\/ Ba\u011flam\u0131 kapatarak \u00f6zel oturumu sonland\u0131r\n    await context.close();\n    console.log('\u00d6zel gezinme ba\u011flam\u0131 kapat\u0131ld\u0131.');\n\n    \/\/ Yeni bir \u00f6zel gezinme ba\u011flam\u0131 a\u00e7\u0131p \u00e7erezin kal\u0131c\u0131 olmad\u0131\u011f\u0131n\u0131 kontrol edelim\n    const newContext = await browser.newContext();\n    const newPage = await newContext.newPage();\n    await newPage.goto('https:\/\/www.example.com');\n    const newCookies = await newContext.cookies('https:\/\/www.example.com');\n    const newTestCookie = newCookies.find(c => c.name === 'testCookie');\n    expect(newTestCookie).toBeUndefined(); \/\/ \u00d6nceki \u00e7erezin kal\u0131c\u0131 olmad\u0131\u011f\u0131n\u0131 do\u011frula\n    console.log('\u00d6nceki \u00e7erezin yeni \u00f6zel ba\u011flamda bulunmad\u0131\u011f\u0131 do\u011fruland\u0131.');\n\n    console.log('T\u00fcm testler ba\u015far\u0131yla tamamland\u0131!');\n\n  } catch (error) {\n    console.error('Test s\u0131ras\u0131nda bir hata olu\u015ftu:', error);\n    process.exit(1); \/\/ Hata durumunda \u00e7\u0131k\u0131\u015f yap\n  } finally {\n    if (browser) {\n      await browser.close(); \/\/ Taray\u0131c\u0131y\u0131 kapat\n    }\n  }\n})();\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnek kod, Playwright&#8217;\u0131 kullanarak Firefox&#8217;u ba\u015flat\u0131r, \u00f6zel bir gezinme ba\u011flam\u0131 olu\u015fturur ve bu ba\u011flamda bir web sitesini ziyaret eder. En \u00f6nemlisi, \u00f6zel modun temel \u00f6zelliklerinden biri olan \u00e7erezlerin oturum bazl\u0131 oldu\u011funu ve ba\u011flam kapat\u0131ld\u0131\u011f\u0131nda silindi\u011fini do\u011frular. <code>await browser.newContext()<\/code> metodunun kullan\u0131lmas\u0131, Playwright&#8217;\u0131n Firefox&#8217;u otomatik olarak \u00f6zel modda ba\u015flatmas\u0131n\u0131 sa\u011flar, bu da manuel taray\u0131c\u0131 ayarlar\u0131yla u\u011fra\u015fma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu yap\u0131, \u00f6zel gezinme moduna \u00f6zg\u00fc test senaryolar\u0131n\u0131z\u0131 geli\u015ftirmek i\u00e7in sa\u011flam bir temel sunar. Bu temel kurulumla, uygulaman\u0131z\u0131n \u00f6zel moddaki davran\u0131\u015flar\u0131n\u0131 sistematik bir \u015fekilde test etmeye ba\u015flayabilirsiniz. Her bir test senaryosunda, \u00f6zel gezinme modunun getirdi\u011fi k\u0131s\u0131tlamalar\u0131 ve beklentileri g\u00f6z \u00f6n\u00fcnde bulundurarak, uygulaman\u0131z\u0131n bu ko\u015fullar alt\u0131nda da do\u011fru ve g\u00fcvenli bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabilirsiniz. Bu, kullan\u0131c\u0131lar\u0131n\u0131z i\u00e7in daha g\u00fcvenilir ve gizlili\u011fe sayg\u0131l\u0131 bir deneyim sunman\u0131z\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>\u00d6zel Gezinme Modunda Temel Test Senaryolar\u0131 Nas\u0131l Uygulan\u0131r?<\/h3>\n<p>Firefox&#8217;un \u00f6zel gezinme modunun temel amac\u0131, kullan\u0131c\u0131lar\u0131n dijital ayak izlerini en aza indirmektir. Bu nedenle, bir web uygulamas\u0131n\u0131n \u00f6zel modda do\u011fru davrand\u0131\u011f\u0131n\u0131 test ederken, \u00e7erezler, yerel depolama (local storage), oturum depolama (session storage) ve taray\u0131c\u0131 ge\u00e7mi\u015fi gibi veri depolama mekanizmalar\u0131n\u0131n beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamam\u0131z gerekir. Bu testler, uygulaman\u0131z\u0131n gizlilik taahh\u00fctlerine uygunlu\u011funu ve kullan\u0131c\u0131 verilerinin istenmeyen \u015fekilde kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 \u00f6nledi\u011fini garanti alt\u0131na al\u0131r. \u015eimdi, Playwright kullanarak bu temel senaryolar\u0131 nas\u0131l test edebilece\u011fimize dair ad\u0131m ad\u0131m \u00f6rnekler inceleyelim.<\/p>\n<p>\u0130lk ve en kritik senaryo, \u00e7erezlerin ge\u00e7icili\u011fini test etmektir. \u00d6zel gezinme modunda ayarlanan \u00e7erezlerin, taray\u0131c\u0131 oturumu kapat\u0131ld\u0131\u011f\u0131nda silinmesi beklenir. Bu, kullan\u0131c\u0131lar\u0131n bir web sitesinde oturum a\u00e7sa bile, \u00f6zel modu kapatt\u0131klar\u0131nda oturum bilgilerinin kaybolaca\u011f\u0131 anlam\u0131na gelir. A\u015fa\u011f\u0131daki \u00f6rnek, bu davran\u0131\u015f\u0131 nas\u0131l test edece\u011fimizi g\u00f6sterir:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ test-cookie-persistence.js\nconst { firefox } = require('playwright');\nconst { expect } = require('@playwright\/test');\n\ntest('\u00d6zel modda ayarlanan \u00e7erezlerin oturum sonunda silindi\u011fini do\u011frula', async ({ browser }) => {\n  \/\/ \u00d6zel bir ba\u011flam olu\u015ftur\n  const context = await browser.newContext();\n  const page = await context.newPage();\n\n  \/\/ Bir web sitesine git\n  await page.goto('https:\/\/www.example.com');\n\n  \/\/ Bir \u00e7erez ayarla\n  await page.evaluate(() => {\n    document.cookie = 'testCookie=privateValue; path=\/';\n  });\n  console.log('\u00d6zel modda test \u00e7erezi ayarland\u0131.');\n\n  \/\/ \u00c7erezin ayarland\u0131\u011f\u0131n\u0131 do\u011frula\n  let cookies = await context.cookies();\n  let testCookie = cookies.find(c => c.name === 'testCookie');\n  expect(testCookie).toBeDefined();\n  expect(testCookie.value).toBe('privateValue');\n  console.log('\u00c7erezin ayarland\u0131\u011f\u0131 do\u011fruland\u0131.');\n\n  \/\/ \u00d6zel ba\u011flam\u0131 kapat\n  await context.close();\n  console.log('\u00d6zel ba\u011flam kapat\u0131ld\u0131.');\n\n  \/\/ Yeni bir \u00f6zel ba\u011flam a\u00e7\n  const newContext = await browser.newContext();\n  const newPage = await newContext.newPage();\n  await newPage.goto('https:\/\/www.example.com'); \/\/ Ayn\u0131 siteye tekrar git\n\n  \/\/ \u00d6nceki \u00e7erezin olmad\u0131\u011f\u0131n\u0131 do\u011frula\n  cookies = await newContext.cookies();\n  testCookie = cookies.find(c => c.name === 'testCookie');\n  expect(testCookie).toBeUndefined();\n  console.log('\u00c7erezin yeni \u00f6zel ba\u011flamda bulunmad\u0131\u011f\u0131 do\u011fruland\u0131.');\n\n  await newContext.close();\n});\n  <\/code><\/pre>\n<\/div>\n<p>Bu test, Playwright&#8217;\u0131n test runner&#8217;\u0131 ile \u00e7al\u0131\u015facak \u015fekilde yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r (<code>test<\/code> fonksiyonu). \u0130lk olarak, \u00f6zel bir ba\u011flamda bir \u00e7erez ayarlar\u0131z ve varl\u0131\u011f\u0131n\u0131 do\u011frular\u0131z. Ard\u0131ndan, bu ba\u011flam\u0131 kapat\u0131r\u0131z (bu, \u00f6zel gezinme oturumunu sonland\u0131r\u0131r) ve yeni bir \u00f6zel ba\u011flam a\u00e7ar\u0131z. Yeni ba\u011flamda ayn\u0131 \u00e7erezin art\u0131k mevcut olmad\u0131\u011f\u0131n\u0131 do\u011frulayarak, \u00e7erezlerin ge\u00e7icilik \u00f6zelli\u011fini test etmi\u015f oluruz. Bu senaryo, kullan\u0131c\u0131 oturumlar\u0131n\u0131n \u00f6zel modda kal\u0131c\u0131 olmad\u0131\u011f\u0131n\u0131 garanti alt\u0131na al\u0131r.<\/p>\n<p>Bir di\u011fer \u00f6nemli test senaryosu, yerel depolama (<code>localStorage<\/code>) ve oturum depolaman\u0131n (<code>sessionStorage<\/code>) davran\u0131\u015f\u0131n\u0131 do\u011frulamakt\u0131r. \u00d6zel gezinme modunda, <code>localStorage<\/code> genellikle kal\u0131c\u0131 olmaz ve <code>sessionStorage<\/code> her zaman oldu\u011fu gibi yaln\u0131zca mevcut oturum i\u00e7in ge\u00e7erlidir. \u00d6zel modda her ikisinin de taray\u0131c\u0131 kapat\u0131ld\u0131\u011f\u0131nda temizlenmesi beklenir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ test-storage-persistence.js\nconst { firefox } = require('playwright');\nconst { expect } = require('@playwright\/test');\n\ntest('\u00d6zel modda localStorage ve sessionStorage verilerinin silindi\u011fini do\u011frula', async ({ browser }) => {\n  const context = await browser.newContext();\n  const page = await context.newPage();\n\n  await page.goto('https:\/\/www.example.com');\n\n  \/\/ localStorage ve sessionStorage'a veri ekle\n  await page.evaluate(() => {\n    localStorage.setItem('localData', 'privateLocalValue');\n    sessionStorage.setItem('sessionData', 'privateSessionValue');\n  });\n  console.log('localStorage ve sessionStorage verileri ayarland\u0131.');\n\n  \/\/ Verilerin ayarland\u0131\u011f\u0131n\u0131 do\u011frula\n  let localData = await page.evaluate(() => localStorage.getItem('localData'));\n  let sessionData = await page.evaluate(() => sessionStorage.getItem('sessionData'));\n  expect(localData).toBe('privateLocalValue');\n  expect(sessionData).toBe('privateSessionValue');\n  console.log('Verilerin mevcut oldu\u011fu do\u011fruland\u0131.');\n\n  await context.close();\n  console.log('\u00d6zel ba\u011flam kapat\u0131ld\u0131.');\n\n  \/\/ Yeni bir \u00f6zel ba\u011flam a\u00e7 ve verilerin olmad\u0131\u011f\u0131n\u0131 do\u011frula\n  const newContext = await browser.newContext();\n  const newPage = await newContext.newPage();\n  await newPage.goto('https:\/\/www.example.com');\n\n  localData = await newPage.evaluate(() => localStorage.getItem('localData'));\n  sessionData = await newPage.evaluate(() => sessionStorage.getItem('sessionData')); \/\/ sessionStorage her zaman yeni oturumda bo\u015f olur\n  expect(localData).toBeNull(); \/\/ localStorage'\u0131n da temizlendi\u011fini do\u011frula\n  expect(sessionData).toBeNull(); \/\/ sessionStorage'\u0131n temizlendi\u011fini do\u011frula\n  console.log('localStorage ve sessionStorage verilerinin yeni \u00f6zel ba\u011flamda bulunmad\u0131\u011f\u0131 do\u011fruland\u0131.');\n\n  await newContext.close();\n});\n  <\/code><\/pre>\n<\/div>\n<p>Bu test, hem <code>localStorage<\/code> hem de <code>sessionStorage<\/code>&#8216;\u0131n \u00f6zel gezinme modunda beklenen davran\u0131\u015f\u0131n\u0131 do\u011frular. \u00d6zellikle <code>localStorage<\/code>&#8216;\u0131n normalde kal\u0131c\u0131 olmas\u0131na ra\u011fmen, \u00f6zel modda oturum sonland\u0131\u011f\u0131nda temizlendi\u011fini g\u00f6stermesi \u00f6nemlidir. Bu temel test senaryolar\u0131, uygulaman\u0131z\u0131n \u00f6zel gezinme modunda kullan\u0131c\u0131 gizlili\u011fini korudu\u011fundan emin olmak i\u00e7in vazge\u00e7ilmezdir. Bu testleri d\u00fczenli olarak \u00e7al\u0131\u015ft\u0131rmak, uygulaman\u0131z\u0131n g\u00fcvenlik ve gizlilik standartlar\u0131n\u0131 s\u00fcrekli olarak kar\u015f\u0131lamas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Veri Gizlili\u011fi ve Oturum \u0130zolasyonu Testleri \u0130\u00e7in \u0130leri Teknikler Nelerdir?<\/h3>\n<p>\u00d6zel gezinme modunda temel veri ge\u00e7icili\u011fi testlerinin \u00f6tesine ge\u00e7erek, daha karma\u015f\u0131k veri gizlili\u011fi ve oturum izolasyonu senaryolar\u0131n\u0131 test etmek, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Bu ileri teknikler, \u00f6zellikle birden fazla \u00f6zel pencereyle etkile\u015fimi, \u00f6nbellekleme davran\u0131\u015flar\u0131n\u0131 ve \u00fc\u00e7\u00fcnc\u00fc taraf izleyicilerin engellenip engellenmedi\u011fini do\u011frulamay\u0131 kapsar. Bu senaryolar, ger\u00e7ek d\u00fcnya kullan\u0131m durumlar\u0131n\u0131 daha iyi yans\u0131tarak, uygulaman\u0131z\u0131n beklenmedik durumlarda bile kullan\u0131c\u0131 gizlili\u011fini nas\u0131l korudu\u011funu ortaya koyar.<\/p>\n<p>\u0130lk olarak, <strong>birden fazla \u00f6zel pencere\/sekme aras\u0131nda oturum izolasyonu<\/strong> testlerini ele alal\u0131m. Firefox&#8217;un \u00f6zel gezinme modunda a\u00e7\u0131lan her yeni pencere veya sekme, kendi i\u00e7inde izole bir ba\u011flam (context) olu\u015fturur. Bu, bir \u00f6zel pencerede yap\u0131lan i\u015flemlerin (\u00f6rne\u011fin, oturum a\u00e7ma veya \u00e7erez ayarlama) di\u011fer \u00f6zel pencereleri etkilememesi gerekti\u011fi anlam\u0131na gelir. Bu izolasyonun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak kritik \u00f6neme sahiptir. A\u015fa\u011f\u0131daki \u00f6rnek, iki farkl\u0131 \u00f6zel ba\u011flamda ayn\u0131 web sitesini ziyaret ederek \u00e7erez izolasyonunu test eder:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ test-multi-private-context-isolation.js\nconst { firefox } = require('playwright');\nconst { expect } = require('@playwright\/test');\n\ntest('Farkl\u0131 \u00f6zel ba\u011flamlar aras\u0131nda \u00e7erez izolasyonunu do\u011frula', async ({ browser }) => {\n  \/\/ Birinci \u00f6zel ba\u011flam\u0131 olu\u015ftur\n  const context1 = await browser.newContext();\n  const page1 = await context1.newPage();\n  await page1.goto('https:\/\/www.example.com');\n\n  \/\/ Birinci ba\u011flamda bir \u00e7erez ayarla\n  await page1.evaluate(() => {\n    document.cookie = 'userSession=context1_user; path=\/';\n  });\n  console.log('Birinci ba\u011flamda \u00e7erez ayarland\u0131.');\n\n  \/\/ \u00c7erezin ayarland\u0131\u011f\u0131n\u0131 do\u011frula\n  let cookies1 = await context1.cookies();\n  expect(cookies1.find(c => c.name === 'userSession')).toBeDefined();\n\n  \/\/ \u0130kinci \u00f6zel ba\u011flam\u0131 olu\u015ftur\n  const context2 = await browser.newContext();\n  const page2 = await context2.newPage();\n  await page2.goto('https:\/\/www.example.com');\n  console.log('\u0130kinci ba\u011flamda ayn\u0131 siteye gidildi.');\n\n  \/\/ \u0130kinci ba\u011flamda ayn\u0131 \u00e7erezin olmad\u0131\u011f\u0131n\u0131 do\u011frula\n  let cookies2 = await context2.cookies();\n  expect(cookies2.find(c => c.name === 'userSession')).toBeUndefined();\n  console.log('\u0130kinci ba\u011flamda \u00e7erezin bulunmad\u0131\u011f\u0131 do\u011fruland\u0131 (izolasyon ba\u015far\u0131l\u0131).');\n\n  \/\/ \u0130kinci ba\u011flamda farkl\u0131 bir \u00e7erez ayarla\n  await page2.evaluate(() => {\n    document.cookie = 'userSession=context2_user; path=\/';\n  });\n  console.log('\u0130kinci ba\u011flamda farkl\u0131 \u00e7erez ayarland\u0131.');\n\n  \/\/ Birinci ba\u011flamda hala kendi \u00e7erezinin oldu\u011funu do\u011frula\n  cookies1 = await context1.cookies();\n  expect(cookies1.find(c => c.name === 'userSession').value).toBe('context1_user');\n  console.log('Birinci ba\u011flam\u0131n \u00e7erezinin de\u011fi\u015fmedi\u011fi do\u011fruland\u0131.');\n\n  await context1.close();\n  await context2.close();\n});\n  <\/code><\/pre>\n<\/div>\n<p>Bu test, Playwright&#8217;\u0131n <code>browser.newContext()<\/code> metodunu birden fazla kez \u00e7a\u011f\u0131rarak farkl\u0131 izole \u00f6zel oturumlar olu\u015fturur. Her bir oturumun kendi \u00e7erez setine sahip oldu\u011funu ve birbirlerini etkilemedi\u011fini do\u011frular\u0131z. Bu, uygulaman\u0131z\u0131n \u00e7oklu \u00f6zel pencerelerde dahi kullan\u0131c\u0131 verilerini kar\u0131\u015ft\u0131rmad\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<p>\u0130kinci olarak, <strong>\u00f6nbellekleme (caching) davran\u0131\u015f\u0131n\u0131 test etme<\/strong> senaryosu \u00f6nemlidir. \u00d6zel gezinme modunda taray\u0131c\u0131 \u00f6nbelle\u011finin nas\u0131l y\u00f6netildi\u011fi, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve veri gizlili\u011fini etkileyebilir. Genellikle \u00f6zel modda \u00f6nbellek, oturum kapat\u0131ld\u0131\u011f\u0131nda temizlenir. Ancak, baz\u0131 kaynaklar\u0131n (\u00f6rne\u011fin, Service Worker taraf\u0131ndan \u00f6nbelle\u011fe al\u0131nanlar) davran\u0131\u015flar\u0131 farkl\u0131l\u0131k g\u00f6sterebilir. Bu senaryo, uygulaman\u0131z\u0131n \u00f6zel modda kaynaklar\u0131 nas\u0131l \u00f6nbelle\u011fe ald\u0131\u011f\u0131n\u0131 ve bu \u00f6nbelle\u011fin oturum sonunda temizlenip temizlenmedi\u011fini kontrol etmeyi ama\u00e7lar. Bu t\u00fcr bir test, genellikle bir web sunucusu kurmay\u0131 ve belirli \u00f6nbellekleme ba\u015fl\u0131klar\u0131yla (caching headers) yan\u0131t veren statik dosyalar sunmay\u0131 gerektirir. Ard\u0131ndan, \u00f6zel ba\u011flamda bu dosyalar\u0131 y\u00fckleyip, ba\u011flam\u0131 kapat\u0131p tekrar a\u00e7t\u0131ktan sonra \u00f6nbellekten y\u00fcklenip y\u00fcklenmedi\u011fini kontrol edebilirsiniz. Karma\u015f\u0131kl\u0131\u011f\u0131 nedeniyle do\u011frudan bir kod \u00f6rne\u011fi yerine, test stratejisini a\u00e7\u0131klayal\u0131m: bir kaynak i\u00e7in <code>Cache-Control: public, max-age=3600<\/code> gibi bir ba\u015fl\u0131k ayarlay\u0131n. \u00d6zel modda bu kayna\u011f\u0131 y\u00fckleyin. Ba\u011flam\u0131 kapat\u0131n. Yeni bir \u00f6zel ba\u011flamda tekrar y\u00fckleyin. E\u011fer kaynak \u00f6nbellekten gelmiyorsa, \u00f6zel modun \u00f6nbelle\u011fi temizledi\u011fini do\u011frulam\u0131\u015f olursunuz. Network trafi\u011fini incelemek i\u00e7in Playwright&#8217;\u0131n <code>page.route<\/code> veya <code>page.on(&#039;request&#039;)<\/code> gibi API&#8217;leri kullan\u0131labilir.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc olarak, <strong>\u00fc\u00e7\u00fcnc\u00fc taraf izleyicilerin engellenip engellenmedi\u011fini do\u011frulama<\/strong> senaryosu, Firefox&#8217;un geli\u015fmi\u015f izleme korumas\u0131 (Enhanced Tracking Protection) \u00f6zelli\u011fiyle do\u011frudan ilgilidir. Uygulaman\u0131z\u0131n, \u00f6zel modda \u00fc\u00e7\u00fcnc\u00fc taraf analiz ara\u00e7lar\u0131 veya reklam izleyicileri gibi unsurlar\u0131n beklendi\u011fi gibi engellendi\u011finden emin olman\u0131z gerekebilir. Bu testler, uygulaman\u0131z\u0131n y\u00fckledi\u011fi d\u0131\u015f kaynaklar\u0131 izleyerek ve belirli URL&#8217;lerin veya \u00e7erezlerin engellenip engellenmedi\u011fini kontrol ederek ger\u00e7ekle\u015ftirilir. Playwright&#8217;\u0131n <code>page.route<\/code> veya <code>page.on(&#039;request&#039;)<\/code> API&#8217;leri ile belirli a\u011f isteklerini yakalayabilir ve engellenen alan adlar\u0131na veya izleme komut dosyalar\u0131na yap\u0131lan \u00e7a\u011fr\u0131lar\u0131n ger\u00e7ekle\u015fmedi\u011fini do\u011frulayabilirsiniz. \u00d6rne\u011fin, Google Analytics komut dosyas\u0131n\u0131n \u00f6zel modda y\u00fcklenmedi\u011fini kontrol edebilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ test-tracking-protection.js\nconst { firefox } = require('playwright');\nconst { expect } = require('@playwright\/test');\n\ntest('\u00d6zel modda Google Analytics izleme komut dosyas\u0131n\u0131n engellendi\u011fini do\u011frula', async ({ browser }) => {\n  const context = await browser.newContext();\n  const page = await context.newPage();\n\n  let analyticsRequestBlocked = false;\n  page.on('request', request => {\n    if (request.url().includes('google-analytics.com') || request.url().includes('googletagmanager.com')) {\n      analyticsRequestBlocked = true;\n      console.log(<code>Engellenen izleyici iste\u011fi tespit edildi: ${request.url()}<\/code>);\n    }\n  });\n\n  \/\/ Kendi test sayfan\u0131za veya izleyici i\u00e7eren bir sayfaya gidin\n  \/\/ Not: Bu testin \u00e7al\u0131\u015fmas\u0131 i\u00e7in test sayfan\u0131zda ger\u00e7ek bir GA kodu olmal\u0131d\u0131r.\n  \/\/ Veya Playwright'\u0131n route \u00f6zelli\u011fini kullanarak bir GA iste\u011fini sim\u00fcle edebilirsiniz.\n  await page.goto('https:\/\/www.example.com'); \/\/ Buraya kendi test URL'inizi girin\n\n  \/\/ Sayfan\u0131n y\u00fcklenmesi i\u00e7in k\u0131sa bir s\u00fcre bekleyin\n  await page.waitForTimeout(2000); \n\n  \/\/ Analytics iste\u011finin engellenip engellenmedi\u011fini do\u011frula\n  \/\/ Playwright'\u0131n varsay\u0131lan taray\u0131c\u0131 ba\u011flamlar\u0131 izlemeyi engellemeyebilir.\n  \/\/ Firefox'un ger\u00e7ek \u00f6zel mod davran\u0131\u015f\u0131n\u0131 taklit etmek i\u00e7in 'browser.newContext({ ignoreHTTPSErrors: true, noCache: true })' gibi se\u00e7enekler gerekebilir.\n  \/\/ Ancak Firefox'un kendi ETP'si (Enhanced Tracking Protection) bu i\u015fi yapacakt\u0131r.\n  \/\/ Playwright, taray\u0131c\u0131n\u0131n do\u011fal davran\u0131\u015f\u0131n\u0131 yans\u0131tt\u0131\u011f\u0131 i\u00e7in, ETP'nin \u00f6zel modda aktif olmas\u0131 beklenir.\n  expect(analyticsRequestBlocked).toBe(false); \/\/ E\u011fer ETP aktifse, bu iste\u011fin ger\u00e7ekle\u015fmemesi beklenir.\n  console.log('Google Analytics iste\u011finin \u00f6zel modda engellenmedi\u011fi do\u011fruland\u0131 (Beklenen davran\u0131\u015f).');\n\n  await context.close();\n});\n  <\/code><\/pre>\n<\/div>\n<p>Bu test, <code>page.on(&#039;request&#039;)<\/code> kullanarak a\u011f isteklerini dinler ve belirli bir izleyici URL&#8217;sinin \u00e7a\u011fr\u0131l\u0131p \u00e7a\u011fr\u0131lmad\u0131\u011f\u0131n\u0131 kontrol eder. Firefox&#8217;un varsay\u0131lan izleme korumas\u0131 \u00f6zel modda daha agresif oldu\u011fundan, bu t\u00fcr isteklerin engellenmesi beklenir. Ancak, Playwright&#8217;\u0131n varsay\u0131lan ba\u011flamlar\u0131 taray\u0131c\u0131n\u0131n tam gizlilik ayarlar\u0131n\u0131 her zaman yans\u0131tmayabilir; bu nedenle, bu t\u00fcr testler i\u00e7in taray\u0131c\u0131y\u0131 ba\u015flat\u0131rken \u00f6zel Firefox profilleri veya ek Playwright se\u00e7enekleri (\u00f6rne\u011fin <code>extraPrefs<\/code>) kullanmak gerekebilir. Bu ileri teknikler, uygulaman\u0131z\u0131n yaln\u0131zca temel gizlilik beklentilerini kar\u015f\u0131lamakla kalmay\u0131p, ayn\u0131 zamanda daha karma\u015f\u0131k senaryolarda ve taray\u0131c\u0131n\u0131n geli\u015fmi\u015f gizlilik \u00f6zellikleriyle uyumlu \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olman\u0131z\u0131 sa\u011flar. Bu da kullan\u0131c\u0131lar\u0131n\u0131za daha g\u00fcvenli ve \u015feffaf bir deneyim sunman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>Kar\u015f\u0131la\u015f\u0131labilecek Zorluklar ve \u00c7\u00f6z\u00fcm \u00d6nerileri Nelerdir?<\/h3>\n<p>Firefox \u00f6zel gezinme pencereleri i\u00e7in birim testleri yazmak, bir\u00e7ok avantaj sunsa da, beraberinde baz\u0131 zorluklar\u0131 da getirebilir. Bu zorluklar\u0131n fark\u0131nda olmak ve proaktif \u00e7\u00f6z\u00fcmler geli\u015ftirmek, test s\u00fcre\u00e7lerinizin verimlili\u011fini ve g\u00fcvenilirli\u011fini art\u0131racakt\u0131r. En s\u0131k kar\u015f\u0131la\u015f\u0131lan sorunlardan biri, testlerin karars\u0131zl\u0131\u011f\u0131 (flakiness) veya tutars\u0131zl\u0131\u011f\u0131d\u0131r. Taray\u0131c\u0131 otomasyon testleri do\u011fas\u0131 gere\u011fi, a\u011f gecikmeleri, sayfa y\u00fckleme s\u00fcreleri veya zamanlama sorunlar\u0131 gibi fakt\u00f6rler nedeniyle zaman zaman ba\u015far\u0131s\u0131z olabilir. \u00d6zel gezinme modunun ek izolasyon katman\u0131, bazen bu sorunlar\u0131 daha da belirgin hale getirebilir, \u00e7\u00fcnk\u00fc her oturum tamamen yeni bir ba\u015flang\u0131\u00e7 gerektirir. Bu durum, testlerin beklenenden daha uzun s\u00fcrmesine veya rastgele ba\u015far\u0131s\u0131z olmas\u0131na neden olabilir. Bu t\u00fcr karars\u0131zl\u0131klar\u0131 azaltmak i\u00e7in, Playwright gibi ara\u00e7lar\u0131n sundu\u011fu ak\u0131ll\u0131 bekleme mekanizmalar\u0131n\u0131 (\u00f6rne\u011fin, <code>page.waitForSelector<\/code>, <code>page.waitForURL<\/code>, <code>page.waitForFunction<\/code>) yo\u011fun bir \u015fekilde kullanmak \u00f6nemlidir. Sabit <code>await page.waitForTimeout(XXXX)<\/code> kullanmaktan ka\u00e7\u0131narak, belirli bir ko\u015fulun ger\u00e7ekle\u015fmesini beklemek, testlerinizi daha sa\u011flam hale getirecektir. Ayr\u0131ca, testlerinizi daha k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f birimlere b\u00f6lmek ve her bir birimin yaln\u0131zca belirli bir \u00f6zelli\u011fi test etti\u011finden emin olmak da kararl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<p>Bir di\u011fer zorluk, <strong>performans sorunlar\u0131d\u0131r<\/strong>. Her \u00f6zel gezinme oturumu, yeni bir taray\u0131c\u0131 ba\u011flam\u0131 ba\u015flatt\u0131\u011f\u0131 ve \u00f6nceki oturumlardan hi\u00e7bir veriyi kullanmad\u0131\u011f\u0131 i\u00e7in, test s\u00fcresi normal mod testlerine g\u00f6re daha uzun olabilir. \u00d6zellikle geni\u015f bir test s\u00fcitiniz varsa, bu durum geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc yava\u015flatabilir. Performans\u0131 art\u0131rmak i\u00e7in, testlerinizi paralel olarak \u00e7al\u0131\u015ft\u0131rmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Playwright, varsay\u0131lan olarak paralel test y\u00fcr\u00fctmeyi destekler. Ayr\u0131ca, gereksiz sayfa gezintilerinden ka\u00e7\u0131nmak, DOM (Document Object Model) etkile\u015fimlerini optimize etmek ve test verilerini minimumda tutmak da test s\u00fcrelerini k\u0131saltmaya yard\u0131mc\u0131 olabilir. CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Teslimat) ortamlar\u0131nda, yeterli kaynaklara sahip sanal makineler (virtual machines) veya konteynerler (containers) kullanarak performans darbo\u011fazlar\u0131n\u0131 a\u015fabilirsiniz.<\/p>\n<p><strong>Hata ay\u0131klama (debugging)<\/strong> da \u00f6zel gezinme testlerinde zorlay\u0131c\u0131 olabilir. \u00d6zel modda taray\u0131c\u0131 ge\u00e7mi\u015fi ve \u00f6nbellek tutulmad\u0131\u011f\u0131 i\u00e7in, bir hata olu\u015ftu\u011funda sorunun k\u00f6k nedenini bulmak daha zor olabilir. Playwright, bu konuda baz\u0131 g\u00fc\u00e7l\u00fc \u00f6zellikler sunar. \u00d6rne\u011fin, <code>PWDEBUG=1<\/code> ortam de\u011fi\u015fkenini ayarlayarak Playwright Inspector&#8217;\u0131 kullanabilir, testlerinizi ad\u0131m ad\u0131m y\u00fcr\u00fctebilir ve taray\u0131c\u0131 etkile\u015fimlerini g\u00f6rsel olarak takip edebilirsiniz. Ayr\u0131ca, test ba\u015far\u0131s\u0131z oldu\u011funda otomatik olarak ekran g\u00f6r\u00fcnt\u00fcs\u00fc (screenshot) almak veya taray\u0131c\u0131 konsol g\u00fcnl\u00fcklerini (console logs) kaydetmek, hata ay\u0131klama s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Playwright&#8217;\u0131n <code>trace<\/code> \u00f6zelli\u011fi, testin t\u00fcm y\u00fcr\u00fctme s\u00fcrecini (video, ekran g\u00f6r\u00fcnt\u00fcleri, g\u00fcnl\u00fckler, a\u011f istekleri) kaydederek kapsaml\u0131 bir hata ay\u0131klama arac\u0131 sunar.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ Playwright Inspector ile hata ay\u0131klama\n\/\/ Komut sat\u0131r\u0131nda:\n\/\/ PWDEBUG=1 npx playwright test test-private-mode.js\n\n\/\/ Ba\u015far\u0131s\u0131z testlerde ekran g\u00f6r\u00fcnt\u00fcs\u00fc almak i\u00e7in playwright.config.js dosyas\u0131nda:\n\/\/ use: {\n\/\/   screenshot: 'only-on-failure',\n\/\/   trace: 'on-first-retry', \/\/ Hata durumunda izleme kayd\u0131 al\n\/\/ },\n  <\/code><\/pre>\n<\/div>\n<p><strong>CI\/CD entegrasyonu<\/strong> ise \u00f6zel mod testlerinin \u00fcretim ortam\u0131na girmeden \u00f6nce s\u00fcrekli olarak do\u011frulanmas\u0131n\u0131 sa\u011flar. Testleri bir CI\/CD hatt\u0131na entegre ederken, taray\u0131c\u0131lar\u0131n ba\u015fs\u0131z modda (headless mode) \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun. Bu, taray\u0131c\u0131n\u0131n grafik aray\u00fcz\u00fcn\u00fc g\u00f6stermeden arka planda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar, bu da sunucu ortamlar\u0131nda kaynak kullan\u0131m\u0131n\u0131 optimize eder. Playwright, taray\u0131c\u0131y\u0131 ba\u015fs\u0131z modda ba\u015flatmay\u0131 varsay\u0131lan olarak destekler. Ayr\u0131ca, CI\/CD ortam\u0131nda taray\u0131c\u0131 s\u00fcr\u00fcc\u00fclerinin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n do\u011fru \u015fekilde y\u00fcklendi\u011finden ve g\u00fcncel oldu\u011fundan emin olmak \u00f6nemlidir. Docker konteynerleri kullanmak, test ortam\u0131n\u0131 standardize etmek ve ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131n\u0131 minimize etmek i\u00e7in harika bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ playwright.config.js i\u00e7inde headless mod varsay\u0131lan olarak gelir\n\/\/ Ancak a\u00e7\u0131k\u00e7a belirtmek isterseniz:\n\/\/ use: {\n\/\/   headless: true, \/\/ Taray\u0131c\u0131y\u0131 ba\u015fs\u0131z modda \u00e7al\u0131\u015ft\u0131r\n\/\/ },\n  <\/code><\/pre>\n<\/div>\n<p>Son olarak, <strong>farkl\u0131 Firefox s\u00fcr\u00fcmleriyle uyumluluk<\/strong> \u00f6nemli bir konudur. Taray\u0131c\u0131lar s\u00fcrekli g\u00fcncellendi\u011fi i\u00e7in, \u00f6zel gezinme modunun davran\u0131\u015flar\u0131 veya taray\u0131c\u0131 API&#8217;leri zamanla de\u011fi\u015febilir. Testlerinizin en son Firefox s\u00fcr\u00fcm\u00fcyle uyumlu oldu\u011fundan emin olmak i\u00e7in test ortam\u0131n\u0131z\u0131 d\u00fczenli olarak g\u00fcncellemelisiniz. Playwright gibi ara\u00e7lar, genellikle en son taray\u0131c\u0131 s\u00fcr\u00fcmlerini destekler, ancak yine de kendi testlerinizi farkl\u0131 Firefox s\u00fcr\u00fcmlerinde (\u00f6rne\u011fin, kararl\u0131, beta, nightly) \u00e7al\u0131\u015ft\u0131rmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu, uygulaman\u0131z\u0131n geni\u015f bir kullan\u0131c\u0131 taban\u0131 i\u00e7in tutarl\u0131 bir deneyim sunmas\u0131n\u0131 sa\u011flar. Bu zorluklar\u0131 a\u015fmak i\u00e7in proaktif yakla\u015f\u0131mlar benimsemek ve do\u011fru ara\u00e7lar\u0131 kullanmak, Firefox \u00f6zel gezinme pencereleri i\u00e7in yazd\u0131\u011f\u0131n\u0131z birim testlerinin etkinli\u011fini ve g\u00fcvenilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n her zaman gizlili\u011fe sayg\u0131l\u0131 ve hatas\u0131z \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabilirsiniz.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p>Bu makale boyunca, Firefox&#8217;un \u00f6zel gezinme pencereleri i\u00e7in birim testleri yazman\u0131n neden bu kadar \u00f6nemli oldu\u011funu ve bu s\u00fcreci nas\u0131l etkin bir \u015fekilde y\u00f6netece\u011fimizi detayl\u0131 bir \u015fekilde inceledik. Kullan\u0131c\u0131 gizlili\u011finin giderek artan \u00f6nemi g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, web uygulamalar\u0131m\u0131z\u0131n \u00f6zel modda beklendi\u011fi gibi davrand\u0131\u011f\u0131ndan emin olmak, yaln\u0131zca teknik bir gereklilik de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131 g\u00fcvenini kazanman\u0131n da anahtar\u0131d\u0131r. Playwright gibi g\u00fc\u00e7l\u00fc otomasyon ara\u00e7lar\u0131 sayesinde, \u00f6zel gezinme modunun kendine has \u00f6zelliklerini (\u00e7erezlerin ge\u00e7icili\u011fi, oturum izolasyonu, depolama temizli\u011fi) hedef alan sa\u011flam ve g\u00fcvenilir testler olu\u015fturmak art\u0131k \u00e7ok daha eri\u015filebilir. Temel kurulumdan ileri d\u00fczey test senaryolar\u0131na, hatta kar\u015f\u0131la\u015f\u0131labilecek zorluklara ve \u00e7\u00f6z\u00fcm \u00f6nerilerine kadar geni\u015f bir yelpazeyi kapsayarak, bu alanda bilgi sahibi olmak isteyen herkese kapsaml\u0131 bir rehber sunmay\u0131 ama\u00e7lad\u0131k. Unutulmamal\u0131d\u0131r ki, bu testler sadece hatalar\u0131 bulmakla kalmaz, ayn\u0131 zamanda uygulaman\u0131z\u0131n tasar\u0131m\u0131n\u0131 ve mimarisini de gizlilik odakl\u0131 bir yakla\u015f\u0131mla geli\u015ftirmeye te\u015fvik eder.<\/p>\n<p>\u00d6zel gezinme testlerinin d\u00fczenli olarak CI\/CD s\u00fcre\u00e7lerine entegre edilmesi, uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca s\u00fcrekli olarak y\u00fcksek gizlilik ve i\u015flevsellik standartlar\u0131n\u0131 korumas\u0131n\u0131 sa\u011flar. Bu, geli\u015ftiricilere h\u0131zl\u0131 geri bildirim sa\u011flayarak potansiyel sorunlar\u0131n erken a\u015famada tespit edilmesine ve d\u00fczeltilmesine olanak tan\u0131r. Sonu\u00e7 olarak, Firefox \u00f6zel gezinme pencereleri i\u00e7in birim testleri yazmak, modern web geli\u015ftirme pratiklerinin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r ve uygulaman\u0131z\u0131n kullan\u0131c\u0131lar\u0131na g\u00fcvenli, gizli ve hatas\u0131z bir deneyim sunma taahh\u00fcd\u00fcn\u00fcn bir g\u00f6stergesidir. Bu alandaki yat\u0131r\u0131mlar\u0131n\u0131z, uzun vadede uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131na ve kullan\u0131c\u0131 memnuniyetine do\u011frudan katk\u0131da bulunacakt\u0131r. Gelecekte, taray\u0131c\u0131 teknolojileri ve gizlilik standartlar\u0131 geli\u015ftik\u00e7e, bu test yakla\u015f\u0131mlar\u0131n\u0131n da evrilece\u011fini ve daha sofistike hale gelece\u011fini \u00f6ng\u00f6rebiliriz. Bu nedenle, bu alandaki geli\u015fmeleri takip etmek ve test stratejilerinizi s\u00fcrekli olarak g\u00fcncellemek b\u00fcy\u00fck \u00f6nem ta\u015f\u0131maktad\u0131r.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular<\/h4>\n<ul>\n<li>\n    <strong>Neden \u00f6zel gezinme modunu ayr\u0131ca test etmeliyim?<\/strong><\/p>\n<p>\u00d6zel gezinme modu, taray\u0131c\u0131 ge\u00e7mi\u015fi, \u00e7erezler, yerel depolama ve \u00f6nbellek gibi verileri oturum sonunda otomatik olarak silerek kullan\u0131c\u0131lara daha y\u00fcksek bir gizlilik seviyesi sunar. Uygulaman\u0131z\u0131n bu modda beklendi\u011fi gibi davrand\u0131\u011f\u0131ndan, yani verileri kal\u0131c\u0131 olarak depolamad\u0131\u011f\u0131ndan ve oturumlar aras\u0131nda iz b\u0131rakmad\u0131\u011f\u0131ndan emin olmak i\u00e7in \u00f6zel testler gereklidir. Bu testler, uygulaman\u0131z\u0131n gizlilik politikalar\u0131na uydu\u011funu ve veri s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nledi\u011fini do\u011frular.<\/p>\n<\/li>\n<li>\n    <strong>Bu testler sadece Firefox i\u00e7in mi ge\u00e7erli?<\/strong><\/p>\n<p>Hay\u0131r, bu makalede Firefox \u00f6zel gezinme pencereleri odakl\u0131 \u00f6rnekler verilse de, temel prensipler ve kullan\u0131lan Playwright gibi ara\u00e7lar Chrome (Gizli Mod), Edge (InPrivate) ve Safari (\u00d6zel Dola\u015fma) gibi di\u011fer taray\u0131c\u0131lar\u0131n \u00f6zel gezinme modlar\u0131 i\u00e7in de ge\u00e7erlidir. Playwright, tek bir API ile t\u00fcm bu taray\u0131c\u0131lar\u0131 destekledi\u011fi i\u00e7in, yazd\u0131\u011f\u0131n\u0131z testleri k\u00fc\u00e7\u00fck ayarlamalarla di\u011fer taray\u0131c\u0131larda da \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<\/li>\n<li>\n    <strong>\u00d6zel mod testleri performans\u0131 nas\u0131l etkiler?<\/strong><\/p>\n<p>\u00d6zel gezinme testleri, her oturumda yeni bir taray\u0131c\u0131 ba\u011flam\u0131 ba\u015flatt\u0131\u011f\u0131 ve \u00f6nceki oturumlardan hi\u00e7bir veriyi kullanmad\u0131\u011f\u0131 i\u00e7in, normal mod testlerine g\u00f6re daha uzun s\u00fcrebilir. Bu durum, \u00f6zellikle geni\u015f test s\u00fcitlerinde toplam test s\u00fcresini art\u0131rabilir. Performans\u0131 optimize etmek i\u00e7in testleri paralel \u00e7al\u0131\u015ft\u0131rma, gereksiz sayfa gezintilerinden ka\u00e7\u0131nma ve Playwright&#8217;\u0131n ak\u0131ll\u0131 bekleme mekanizmalar\u0131n\u0131 kullanma gibi stratejiler uygulanabilir.<\/p>\n<\/li>\n<li>\n    <strong>Hangi test \u00e7er\u00e7evesini (framework) kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>Bu makalede Playwright kullan\u0131ld\u0131 \u00e7\u00fcnk\u00fc modern, h\u0131zl\u0131 ve \u00e7e\u015fitli taray\u0131c\u0131lar\u0131 destekleyen g\u00fc\u00e7l\u00fc bir otomasyon k\u00fct\u00fcphanesidir. Ancak Selenium WebDriver, Cypress veya Puppeteer gibi di\u011fer taray\u0131c\u0131 otomasyon ara\u00e7lar\u0131 da benzer testleri yazmak i\u00e7in kullan\u0131labilir. Se\u00e7iminiz, projenizin ihtiya\u00e7lar\u0131na, ekibinizin deneyimine ve belirli \u00f6zellik gereksinimlerine ba\u011fl\u0131 olmal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n    <strong>Bu testleri CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Teslimat) s\u00fcrecine nas\u0131l entegre edebilirim?<\/strong><\/p>\n<p>\u00d6zel mod testlerini CI\/CD hatt\u0131n\u0131za entegre etmek i\u00e7in, taray\u0131c\u0131lar\u0131 ba\u015fs\u0131z (headless) modda \u00e7al\u0131\u015ft\u0131rman\u0131z \u00f6nerilir. Bu, taray\u0131c\u0131n\u0131n grafik aray\u00fcz\u00fcn\u00fc g\u00f6stermeden arka planda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve sunucu ortamlar\u0131nda kaynak kullan\u0131m\u0131n\u0131 optimize eder. Playwright, ba\u015fs\u0131z modu varsay\u0131lan olarak destekler. Ayr\u0131ca, CI\/CD ortam\u0131nda taray\u0131c\u0131 s\u00fcr\u00fcc\u00fclerinin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n do\u011fru \u015fekilde y\u00fcklendi\u011finden ve g\u00fcncel oldu\u011fundan emin olmak i\u00e7in Docker konteynerleri kullanmak iyi bir uygulamad\u0131r. Test ba\u015far\u0131s\u0131z oldu\u011funda otomatik ekran g\u00f6r\u00fcnt\u00fcleri ve izleme kay\u0131tlar\u0131 almak da hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p>#Firefox #\u00d6zelGezinme #BirimTesti #Playwright #WebOtomasyonu #Gizlilik #TestGeli\u015ftirme<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/firefox-private-browsing-storage-tests\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/firefox-private-browsing-storage-tests<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Kullan\u0131c\u0131 gizlili\u011finin her ge\u00e7en g\u00fcn daha fazla \u00f6nem kazand\u0131\u011f\u0131 dijital d\u00fcnyada, web uygulamalar\u0131n\u0131z\u0131n \u00f6zel gezinme (private browsing) modunda kusursuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik bir hal alm\u0131\u015ft\u0131r.","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-43105","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>Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r? - 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\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Kullan\u0131c\u0131 gizlili\u011finin her ge\u00e7en g\u00fcn daha fazla \u00f6nem kazand\u0131\u011f\u0131 dijital d\u00fcnyada, web uygulamalar\u0131n\u0131z\u0131n \u00f6zel gezinme (private browsing) modunda kusursuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik bir hal alm\u0131\u015ft\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-05T18:10:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-05T18:11:06+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=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?\",\"datePublished\":\"2026-07-05T18:10:31+00:00\",\"dateModified\":\"2026-07-05T18:11:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/\"},\"wordCount\":3948,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/\",\"name\":\"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-05T18:10:31+00:00\",\"dateModified\":\"2026-07-05T18:11:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?\"}]},{\"@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":"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r? - 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\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?","og_description":"Kullan\u0131c\u0131 gizlili\u011finin her ge\u00e7en g\u00fcn daha fazla \u00f6nem kazand\u0131\u011f\u0131 dijital d\u00fcnyada, web uygulamalar\u0131n\u0131z\u0131n \u00f6zel gezinme (private browsing) modunda kusursuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik bir hal alm\u0131\u015ft\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-05T18:10:31+00:00","article_modified_time":"2026-07-05T18:11:06+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?","datePublished":"2026-07-05T18:10:31+00:00","dateModified":"2026-07-05T18:11:06+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/"},"wordCount":3948,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/","url":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/","name":"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-05T18:10:31+00:00","dateModified":"2026-07-05T18:11:06+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/firefox-ozel-gezinme-pencereleri-icin-birim-testleri-nasil-yazilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Firefox \u00d6zel Gezinme Pencereleri \u0130\u00e7in Birim Testleri Nas\u0131l Yaz\u0131l\u0131r?"}]},{"@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\/43105","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=43105"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43105\/revisions"}],"predecessor-version":[{"id":43106,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43105\/revisions\/43106"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}