{"id":35599,"date":"2025-12-01T15:40:55","date_gmt":"2025-12-01T12:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35599"},"modified":"2025-12-01T15:40:55","modified_gmt":"2025-12-01T12:40:55","slug":"puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/","title":{"rendered":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Dijital d\u00fcnyada otomasyonun \u00f6nemi her ge\u00e7en g\u00fcn artmaktad\u0131r. Web sayfalar\u0131ndan veri \u00e7ekme (web scraping), otomatik testler, PDF olu\u015fturma, ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma gibi bir\u00e7ok i\u015flem, manuel olarak yap\u0131ld\u0131\u011f\u0131nda hem zaman al\u0131c\u0131 hem de hataya a\u00e7\u0131k olabilir. \u0130\u015fte tam da bu noktada, taray\u0131c\u0131 otomasyon ara\u00e7lar\u0131 devreye girer. Bu ara\u00e7lar aras\u0131nda \u00f6zellikle \u00f6ne \u00e7\u0131kan ikili, Google&#8217;\u0131n Headless Chrome&#8217;u ve Node.js i\u00e7in geli\u015ftirilmi\u015f g\u00fc\u00e7l\u00fc k\u00fct\u00fcphanesi Puppeteer&#8217;d\u0131r. Bu makale, Puppeteer&#8217;\u0131n ne oldu\u011funu, Headless Chrome ile nas\u0131l entegre \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve bu ikilinin sundu\u011fu s\u0131n\u0131rs\u0131z olanaklar\u0131 detayl\u0131 bir \u015fekilde ele almay\u0131 ama\u00e7lamaktad\u0131r. Puppeteer&#8217;\u0131n kurulumundan ba\u015flayarak, temel kullan\u0131m senaryolar\u0131ndan ileri d\u00fczey tekniklere kadar geni\u015f bir yelpazede bilgi sunacak, kod \u00f6rnekleri ve en iyi uygulamalarla okuyuculara kapsaml\u0131 bir rehber olacakt\u0131r.<\/p>\n<h3>Puppeteer ve Headless Chrome&#8217;un Temelleri<\/h3>\n<p>Puppeteer ve Headless Chrome, modern web otomasyonu ve test s\u00fcre\u00e7lerinin temel ta\u015flar\u0131ndan ikisidir. Bu ikiliyi anlamak, web tabanl\u0131 projelerinizde verimlili\u011fi art\u0131rman\u0131n ve karma\u015f\u0131k g\u00f6revleri otomatikle\u015ftirmenin kap\u0131lar\u0131n\u0131 aralar.<\/p>\n<h4>Headless Chrome Nedir?<\/h4>\n<p>Geleneksel bir web taray\u0131c\u0131s\u0131, kullan\u0131c\u0131lar\u0131n bir web sitesini g\u00f6rsel olarak deneyimlemesini sa\u011flayan bir grafik kullan\u0131c\u0131 aray\u00fcz\u00fcne (GUI) sahiptir. Ancak baz\u0131 senaryolarda, taray\u0131c\u0131n\u0131n g\u00f6rsel aray\u00fcz\u00fcne ihtiyac\u0131m\u0131z olmaz; sadece arka planda web sayfalar\u0131n\u0131 i\u015fleme yetene\u011fine gereksinim duyar\u0131z. \u0130\u015fte Headless Chrome tam da bu ihtiyaca cevap verir. Headless Chrome, Google Chrome taray\u0131c\u0131s\u0131n\u0131n GUI&#8217;si olmadan, yani &#8220;ba\u015fs\u0131z&#8221; modda \u00e7al\u0131\u015fabilen bir s\u00fcr\u00fcm\u00fcd\u00fcr. Bu modda \u00e7al\u0131\u015f\u0131rken, taray\u0131c\u0131 arka planda bir sunucu ortam\u0131nda veya komut sat\u0131r\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131labilir, web sayfalar\u0131n\u0131 y\u00fckleyebilir, JavaScript kodlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilir ve DOM&#8217;u manip\u00fcle edebilir.<\/p>\n<p>Headless Chrome&#8217;un ba\u015fl\u0131ca avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Performans:<\/strong> GUI&#8217;nin olmamas\u0131, taray\u0131c\u0131n\u0131n daha az sistem kayna\u011f\u0131 t\u00fcketmesini ve daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli otomasyon g\u00f6revlerinde veya s\u00fcrekli entegrasyon (CI) ortamlar\u0131nda kritik bir avantajd\u0131r.<\/li>\n<li><strong>Otomasyon:<\/strong> Web testleri, ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma, PDF olu\u015fturma, web i\u00e7eri\u011fi kaz\u0131ma gibi g\u00f6revler i\u00e7in idealdir.<\/li>\n<li><strong>Sunucu Ortamlar\u0131:<\/strong> GUI&#8217;nin bulunmad\u0131\u011f\u0131 sunucu ortamlar\u0131nda kolayca da\u011f\u0131t\u0131labilir ve \u00e7al\u0131\u015ft\u0131r\u0131labilir.<\/li>\n<li><strong>G\u00fcvenlik:<\/strong> G\u00f6rsel bir aray\u00fcz olmamas\u0131, belirli g\u00fcvenlik risklerini azaltabilir (her ne kadar taray\u0131c\u0131n\u0131n kendisi g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7erebilse de).<\/li>\n<\/ul>\n<p>Headless Chrome, \u00f6zellikle web geli\u015ftiricileri, QA m\u00fchendisleri ve veri bilimcileri i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir.<\/p>\n<h4>Puppeteer Nedir?<\/h4>\n<p>Puppeteer, Google Chrome ekibi taraf\u0131ndan geli\u015ftirilen bir Node.js k\u00fct\u00fcphanesidir. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, &#8220;kuklac\u0131&#8221; anlam\u0131na gelir ve bir kukla gibi Headless Chrome veya Chromium&#8217;u programatik olarak kontrol etmenizi sa\u011flar. Puppeteer, Chrome DevTools Protokol\u00fc \u00fczerinden taray\u0131c\u0131 ile ileti\u015fim kurar. Bu protokol, taray\u0131c\u0131n\u0131n i\u00e7 i\u015fleyi\u015fine derinlemesine eri\u015fim sa\u011flayarak, sayfa gezintisi, DOM manip\u00fclasyonu, JavaScript y\u00fcr\u00fctme, a\u011f isteklerini engelleme ve daha fazlas\u0131 gibi geni\u015f bir yelpazede kontrol imkan\u0131 sunar.<\/p>\n<p>Puppeteer&#8217;\u0131n temel \u00f6zellikleri ve yetenekleri:<\/p>\n<ul>\n<li><strong>Sayfa Gezinimi:<\/strong> URL&#8217;lere gitme, ileri\/geri navigasyon, sayfa y\u00fcklemelerini bekleme.<\/li>\n<li><strong>DOM Etkile\u015fimi:<\/strong> Elementleri se\u00e7me, metin ve niteliklerini alma, form alanlar\u0131n\u0131 doldurma, butonlara t\u0131klama.<\/li>\n<li><strong>Ekran G\u00f6r\u00fcnt\u00fcs\u00fc ve PDF Olu\u015fturma:<\/strong> Web sayfalar\u0131n\u0131n tam veya belirli b\u00f6l\u00fcmlerinin ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc alma, web sayfalar\u0131n\u0131 PDF olarak kaydetme.<\/li>\n<li><strong>Otomatik Testler:<\/strong> Kullan\u0131c\u0131 etkile\u015fimlerini sim\u00fcle ederek u\u00e7tan uca (end-to-end) testler yazma.<\/li>\n<li><strong>A\u011f \u0130zleme:<\/strong> A\u011f isteklerini ve yan\u0131tlar\u0131n\u0131 engelleme, de\u011fi\u015ftirme veya izleme.<\/li>\n<li><strong>Kullan\u0131c\u0131 Arac\u0131s\u0131 ve G\u00f6r\u00fcn\u00fcm Ayarlar\u0131:<\/strong> Taray\u0131c\u0131n\u0131n kullan\u0131c\u0131 arac\u0131s\u0131n\u0131 (User-Agent) de\u011fi\u015ftirme, farkl\u0131 ekran boyutlar\u0131n\u0131 sim\u00fcle etme.<\/li>\n<li><strong>JavaScript Y\u00fcr\u00fctme:<\/strong> Sayfa ba\u011flam\u0131nda \u00f6zel JavaScript kodlar\u0131 \u00e7al\u0131\u015ft\u0131rma.<\/li>\n<\/ul>\n<p>Puppeteer, Node.js ekosisteminde \u00e7al\u0131\u015fan geli\u015ftiriciler i\u00e7in Headless Chrome&#8217;un g\u00fcc\u00fcn\u00fc kolayca kullanmalar\u0131n\u0131 sa\u011flayan modern, g\u00fc\u00e7l\u00fc ve iyi belgelenmi\u015f bir k\u00fct\u00fcphanedir. Kurulumu basit, kullan\u0131m\u0131 sezgiseldir ve geni\u015f bir topluluk deste\u011fine sahiptir.<\/p>\n<h3>Puppeteer Kurulumu ve \u0130lk Ad\u0131mlar<\/h3>\n<p>Puppeteer ile \u00e7al\u0131\u015fmaya ba\u015flamak olduk\u00e7a basittir. Temel gereksinimler Node.js ve npm&#8217;dir. E\u011fer sisteminizde Node.js y\u00fckl\u00fc de\u011filse, <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\">nodejs.org<\/a> adresinden indirip kurman\u0131z gerekmektedir.<\/p>\n<h4>Puppeteer Kurulumu<\/h4>\n<p>Bir Node.js projesi olu\u015fturduktan sonra, projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak Puppeteer&#8217;\u0131 kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm install puppeteer<\/code><\/pre>\n<p>Bu komut, Puppeteer k\u00fct\u00fcphanesini ve onunla birlikte uyumlu bir Chromium s\u00fcr\u00fcm\u00fcn\u00fc indirip projenize ekleyecektir. Chromium&#8217;un indirilmesi, internet ba\u011flant\u0131n\u0131z\u0131n h\u0131z\u0131na ba\u011fl\u0131 olarak biraz zaman alabilir.<\/p>\n<h4>Basit Bir &#8220;Hello World&#8221; \u00d6rne\u011fi: Ekran G\u00f6r\u00fcnt\u00fcs\u00fc Alma<\/h4>\n<p>\u015eimdi Puppeteer&#8217;\u0131n temel i\u015flevselli\u011fini g\u00f6steren basit bir \u00f6rnekle ba\u015flayal\u0131m. Bu \u00f6rnekte, belirli bir web sitesine gidecek, sayfan\u0131n bir ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc alacak ve taray\u0131c\u0131y\u0131 kapataca\u011f\u0131z. Bu, Puppeteer ile yapabilece\u011finiz en temel i\u015flemlerden biridir.<\/p>\n<p>\u00d6rnek kodu <code>screenshot.js<\/code> ad\u0131nda bir dosyaya kaydedelim:<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\n\nasync function takeScreenshot() {\n  \/\/ 1. Bir taray\u0131c\u0131 \u00f6rne\u011fi ba\u015flat\n  const browser = await puppeteer.launch(); \/\/ Varsay\u0131lan olarak headless: true\n  \n  \/\/ 2. Yeni bir sayfa a\u00e7\n  const page = await browser.newPage();\n  \n  \/\/ 3. Belirli bir URL'ye git\n  await page.goto('https:\/\/www.example.com');\n  \n  \/\/ 4. Sayfan\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc al\n  await page.screenshot({ path: 'example.png' });\n  \n  \/\/ 5. Taray\u0131c\u0131y\u0131 kapat\n  await browser.close();\n  \n  console.log('Ekran g\u00f6r\u00fcnt\u00fcs\u00fc ba\u015far\u0131yla al\u0131nd\u0131: example.png');\n}\n\ntakeScreenshot();\n<\/code><\/pre>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalinizde a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">node screenshot.js<\/code><\/pre>\n<p>Komut ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda, projenizin dizininde <code>example.png<\/code> ad\u0131nda bir dosya olu\u015ftu\u011funu g\u00f6receksiniz. Bu dosya, <code>https:\/\/www.example.com<\/code> adresinin ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc i\u00e7erecektir.<\/p>\n<p>\u015eimdi kodun her ad\u0131m\u0131n\u0131 a\u00e7\u0131klayal\u0131m:<\/p>\n<ol>\n<li><code>const puppeteer = require('puppeteer');<\/code>: Puppeteer k\u00fct\u00fcphanesini projenize dahil eder.<\/li>\n<li><code>async function takeScreenshot() { ... }<\/code>: Asenkron bir fonksiyon tan\u0131mlar\u0131z \u00e7\u00fcnk\u00fc Puppeteer&#8217;\u0131n \u00e7o\u011fu i\u015flemi asenkrondur ve <code>await<\/code> anahtar kelimesi ile beklememiz gerekir.<\/li>\n<li><code>const browser = await puppeteer.launch();<\/code>: Yeni bir Chromium taray\u0131c\u0131 \u00f6rne\u011fi ba\u015flat\u0131r. Varsay\u0131lan olarak bu, ba\u015fs\u0131z (headless) modda \u00e7al\u0131\u015f\u0131r. E\u011fer taray\u0131c\u0131n\u0131n g\u00f6rsel aray\u00fcz\u00fcn\u00fc g\u00f6rmek isterseniz, <code>puppeteer.launch({ headless: false })<\/code> \u015feklinde kullanabilirsiniz.<\/li>\n<li><code>const page = await browser.newPage();<\/code>: Ba\u015flat\u0131lan taray\u0131c\u0131 i\u00e7inde yeni bir sekme veya sayfa a\u00e7ar. Puppeteer ile birden fazla sayfa \u00fczerinde e\u015f zamanl\u0131 olarak \u00e7al\u0131\u015fabilirsiniz.<\/li>\n<li><code>await page.goto('https:\/\/www.example.com');<\/code>: A\u00e7\u0131lan sayfay\u0131 belirtilen URL&#8217;ye y\u00f6nlendirir. Bu i\u015flem, sayfa tamamen y\u00fcklenene kadar bekler.<\/li>\n<li><code>await page.screenshot({ path: 'example.png' });<\/code>: Ge\u00e7erli sayfan\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc al\u0131r ve belirtilen yola kaydeder. <code>path<\/code> parametresi dosya ad\u0131n\u0131 ve konumunu belirler.<\/li>\n<li><code>await browser.close();<\/code>: \u0130\u015flem tamamland\u0131ktan sonra taray\u0131c\u0131 \u00f6rne\u011fini kapat\u0131r. Bu ad\u0131m, kaynaklar\u0131n serbest b\u0131rak\u0131lmas\u0131 i\u00e7in \u00e7ok \u00f6nemlidir.<\/li>\n<\/ol>\n<p>Bu basit \u00f6rnek, Puppeteer&#8217;\u0131n g\u00fcc\u00fcne bir ba\u015flang\u0131\u00e7 niteli\u011findedir. Bir sonraki b\u00f6l\u00fcmde, Puppeteer&#8217;\u0131n daha geli\u015fmi\u015f kullan\u0131m senaryolar\u0131n\u0131 ve yeteneklerini ke\u015ffedece\u011fiz.<\/p>\n<h3>Puppeteer ile Geli\u015fmi\u015f Kullan\u0131m Senaryolar\u0131<\/h3>\n<p>Puppeteer&#8217;\u0131n ger\u00e7ek g\u00fcc\u00fc, sadece ekran g\u00f6r\u00fcnt\u00fcs\u00fc almaktan \u00e7ok daha fazlas\u0131n\u0131 yapabilmesinde yatar. Web sayfalar\u0131yla etkile\u015fim kurma, veri \u00e7ekme, form doldurma ve otomatik testler gibi karma\u015f\u0131k g\u00f6revleri kolayca otomatikle\u015ftirebilir.<\/p>\n<h4>Web Sayfas\u0131 \u0130\u00e7eri\u011fi \u00c7ekme (Web Scraping)<\/h4>\n<p>Web scraping, web sitelerinden yap\u0131land\u0131r\u0131lm\u0131\u015f veri \u00e7ekme i\u015flemidir. Puppeteer, JavaScript ile dinamik olarak y\u00fcklenen i\u00e7eriklere sahip modern web sitelerinden veri \u00e7ekmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\n\nasync function scrapeProducts() {\n  const browser = await puppeteer.launch();\n  const page = await browser.newPage();\n  await page.goto('https:\/\/www.hepsiburada.com\/laptop-c-300300'); \/\/ \u00d6rnek bir e-ticaret sayfas\u0131\n\n  \/\/ Sayfan\u0131n y\u00fcklenmesini ve belirli bir elementin g\u00f6r\u00fcnmesini bekle\n  await page.waitForSelector('.productListContent-zAP0s5Qef_qYJ4uzgpnJ'); \n\n  \/\/ page.evaluate ile taray\u0131c\u0131 ba\u011flam\u0131nda JavaScript kodu \u00e7al\u0131\u015ft\u0131r\n  const products = await page.evaluate(() => {\n    const productElements = Array.from(document.querySelectorAll('.productListContent-zAP0s5Qef_qYJ4uzgpnJ > li'));\n    return productElements.map(product => {\n      const title = product.querySelector('[data-test-id=\"product-card-name\"]')?.innerText.trim();\n      const price = product.querySelector('[data-test-id=\"price-box\"]')?.innerText.trim();\n      const imageUrl = product.querySelector('img[data-test-id=\"product-image\"]')?.src;\n      return { title, price, imageUrl };\n    }).filter(p => p.title && p.price); \/\/ Ba\u015fl\u0131k ve fiyat\u0131 olmayanlar\u0131 filtrele\n  });\n\n  console.log(products);\n\n  await browser.close();\n}\n\nscrapeProducts();\n<\/code><\/pre>\n<p>Bu \u00f6rnek, Hepsiburada gibi bir e-ticaret sitesinden \u00fcr\u00fcn ba\u015fl\u0131klar\u0131n\u0131, fiyatlar\u0131n\u0131 ve resim URL&#8217;lerini \u00e7ekmeye \u00e7al\u0131\u015f\u0131r. <code>page.waitForSelector<\/code> ile i\u00e7eri\u011fin y\u00fcklendi\u011finden emin oluruz. <code>page.evaluate<\/code> methodu, taray\u0131c\u0131n\u0131n DOM&#8217;u \u00fczerinde do\u011frudan JavaScript \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flar. Burada, <code>querySelectorAll<\/code> ile \u00fcr\u00fcn elementlerini se\u00e7er ve her bir \u00fcr\u00fcn i\u00e7in gerekli bilgileri toplar\u0131z.<\/p>\n<h4>Form Doldurma ve Etkile\u015fim<\/h4>\n<p>Puppeteer, web formlar\u0131n\u0131 otomatik olarak doldurmak ve butonlara t\u0131klamak i\u00e7in kullan\u0131labilir. Bu, oturum a\u00e7ma i\u015flemleri, kay\u0131t formlar\u0131 veya arama i\u015flemleri gibi g\u00f6revler i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\n\nasync function fillForm() {\n  const browser = await puppeteer.launch({ headless: false }); \/\/ \u0130\u015flemi g\u00f6rmek i\u00e7in headless: false\n  const page = await browser.newPage();\n  await page.goto('https:\/\/www.google.com'); \/\/ Google arama sayfas\u0131n\u0131 ziyaret et\n\n  \/\/ Arama kutusunu bul ve metin gir\n  await page.type('textarea[name=\"q\"]', 'Puppeteer ile otomasyon');\n\n  \/\/ Arama butonuna t\u0131kla (veya enter tu\u015funa bas)\n  await Promise.all([\n    page.waitForNavigation(), \/\/ Sayfa y\u00fcklenene kadar bekle\n    page.keyboard.press('Enter') \/\/ Enter tu\u015funa bas\n    \/\/ Alternatif olarak: await page.click('input[name=\"btnK\"]'); \/\/ Arama butonuna t\u0131kla\n  ]);\n\n  \/\/ Arama sonu\u00e7 sayfas\u0131n\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc al\n  await page.screenshot({ path: 'google_search_results.png' });\n\n  await browser.close();\n  console.log('Google aramas\u0131 yap\u0131ld\u0131 ve ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\u0131nd\u0131.');\n}\n\nfillForm();\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, Google arama sayfas\u0131ndaki arama kutusuna metin girilir ve ard\u0131ndan arama ba\u015flat\u0131l\u0131r. <code>page.type<\/code> belirli bir se\u00e7iciye sahip input alan\u0131na metin girmek i\u00e7in kullan\u0131l\u0131r. <code>page.keyboard.press('Enter')<\/code> klavye etkile\u015fimini sim\u00fcle eder. <code>page.waitForNavigation()<\/code> yeni sayfan\u0131n y\u00fcklenmesini beklemek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>Otomatik Testler (E2E Testing)<\/h4>\n<p>Puppeteer, bir uygulaman\u0131n u\u00e7tan uca testlerini otomatikle\u015ftirmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Kullan\u0131c\u0131 ak\u0131\u015flar\u0131n\u0131 sim\u00fcle edebilir ve beklenen sonu\u00e7lar\u0131 do\u011frulayabilir.<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\nconst assert = require('assert'); \/\/ Do\u011frulama i\u00e7in Node.js'in dahili assert mod\u00fcl\u00fc\n\nasync function runLoginTest() {\n  const browser = await puppeteer.launch();\n  const page = await browser.newPage();\n\n  try {\n    await page.goto('http:\/\/localhost:3000\/login'); \/\/ Test edece\u011finiz uygulaman\u0131n giri\u015f sayfas\u0131\n    \n    \/\/ Kullan\u0131c\u0131 ad\u0131 ve \u015fifre alanlar\u0131n\u0131 doldur\n    await page.type('#username', 'testuser');\n    await page.type('#password', 'password123');\n\n    \/\/ Giri\u015f butonuna t\u0131kla ve sayfa navigasyonunu bekle\n    await Promise.all([\n      page.waitForNavigation(),\n      page.click('#loginButton')\n    ]);\n\n    \/\/ Giri\u015f sonras\u0131 bir elementin varl\u0131\u011f\u0131n\u0131 kontrol et\n    const welcomeMessage = await page.$eval('.welcome-message', el => el.innerText);\n    assert.strictEqual(welcomeMessage, 'Ho\u015f Geldiniz, testuser!', 'Giri\u015f ba\u015far\u0131l\u0131 mesaj\u0131 yanl\u0131\u015f.');\n    \n    console.log('Giri\u015f testi BA\u015eARILI!');\n\n  } catch (error) {\n    console.error('Giri\u015f testi BA\u015eARISIZ:', error);\n    await page.screenshot({ path: 'login_fail_error.png' }); \/\/ Hata durumunda ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\n  } finally {\n    await browser.close();\n  }\n}\n\n\/\/ runLoginTest(); \/\/ Bu testi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in yerel bir giri\u015f sayfas\u0131 kurman\u0131z gerekir.\n<\/code><\/pre>\n<p>Bu \u00f6rnek, bir giri\u015f ak\u0131\u015f\u0131n\u0131 test eder. Kullan\u0131c\u0131 ad\u0131 ve \u015fifre girilir, giri\u015f butonuna t\u0131klan\u0131r ve ard\u0131ndan giri\u015f sonras\u0131 sayfada beklenen bir mesaj\u0131n varl\u0131\u011f\u0131 ve i\u00e7eri\u011fi kontrol edilir. <code>assert<\/code> mod\u00fcl\u00fc, test sonu\u00e7lar\u0131n\u0131 do\u011frulamak i\u00e7in kullan\u0131l\u0131r. Hata y\u00f6netimi i\u00e7in <code>try-catch-finally<\/code> bloklar\u0131, testin g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<h4>PDF Olu\u015fturma<\/h4>\n<p>Web sayfalar\u0131n\u0131 PDF format\u0131nda kaydetmek, raporlama veya ar\u015fivleme gibi bir\u00e7ok senaryoda kullan\u0131\u015fl\u0131d\u0131r. Puppeteer, bu i\u015flemi kolayca yapman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\n\nasync function createPdf() {\n  const browser = await puppeteer.launch();\n  const page = await browser.newPage();\n  await page.goto('https:\/\/tr.wikipedia.org\/wiki\/Puppeteer', { waitUntil: 'networkidle0' }); \/\/ T\u00fcm a\u011f isteklerinin bitmesini bekle\n\n  await page.pdf({\n    path: 'puppeteer_wiki.pdf',\n    format: 'A4',\n    printBackground: true, \/\/ Arka plan renklerini ve resimlerini yazd\u0131r\n    margin: {\n      top: '1cm',\n      right: '1cm',\n      bottom: '1cm',\n      left: '1cm'\n    }\n  });\n\n  await browser.close();\n  console.log('PDF ba\u015far\u0131yla olu\u015fturuldu: puppeteer_wiki.pdf');\n}\n\ncreatePdf();\n<\/code><\/pre>\n<p><code>page.pdf()<\/code> fonksiyonu, \u00e7e\u015fitli se\u00e7eneklerle PDF \u00e7\u0131kt\u0131s\u0131 alman\u0131z\u0131 sa\u011flar. <code>format<\/code>, <code>printBackground<\/code> ve <code>margin<\/code> gibi \u00f6zellikler, \u00e7\u0131kt\u0131n\u0131n g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131labilir. <code>waitUntil: 'networkidle0'<\/code> parametresi, sayfan\u0131n ve t\u00fcm alt kaynaklar\u0131n\u0131n (resimler, CSS, JS) tamamen y\u00fcklenmesini bekleyerek daha do\u011fru bir PDF \u00e7\u0131kt\u0131s\u0131 al\u0131nmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Ekran G\u00f6r\u00fcnt\u00fcs\u00fc Alma (Screenshot)<\/h4>\n<p>Daha \u00f6nce basit bir ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma \u00f6rne\u011fi g\u00f6rm\u00fc\u015ft\u00fck. Puppeteer, ekran g\u00f6r\u00fcnt\u00fcleri i\u00e7in daha fazla esneklik sunar.<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\n\nasync function takeAdvancedScreenshots() {\n  const browser = await puppeteer.launch();\n  const page = await browser.newPage();\n  await page.setViewport({ width: 1280, height: 800 }); \/\/ Belirli bir g\u00f6r\u00fcnt\u00fc alan\u0131 ayarla\n  await page.goto('https:\/\/www.google.com');\n\n  \/\/ Tam sayfan\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc al\n  await page.screenshot({ path: 'google_full_page.png', fullPage: true });\n\n  \/\/ Belirli bir elementin ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc al\n  const searchBox = await page.$('textarea[name=\"q\"]');\n  await searchBox.screenshot({ path: 'google_search_box.png' });\n\n  await browser.close();\n  console.log('Geli\u015fmi\u015f ekran g\u00f6r\u00fcnt\u00fcleri al\u0131nd\u0131.');\n}\n\ntakeAdvancedScreenshots();\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>page.setViewport<\/code> ile taray\u0131c\u0131n\u0131n g\u00f6r\u00fcnt\u00fc alan\u0131 (viewport) ayarlan\u0131r. <code>fullPage: true<\/code> parametresi, sayfan\u0131n tamam\u0131n\u0131n (kayd\u0131r\u0131labilir i\u00e7erik dahil) ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc alman\u0131z\u0131 sa\u011flar. Ayr\u0131ca, <code>page.$()<\/code> ile belirli bir DOM elementini se\u00e7ip, o elementin kendi <code>screenshot()<\/code> methodunu kullanarak sadece o elementin ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc alabilirsiniz.<\/p>\n<h4>Tek Sayfal\u0131 Uygulamalar\u0131 (SPA) \u0130\u015fleme<\/h4>\n<p>Modern web uygulamalar\u0131n\u0131n \u00e7o\u011fu, JavaScript ile dinamik olarak i\u00e7erik y\u00fckleyen Tek Sayfal\u0131 Uygulamalar (SPA) olarak tasarlanm\u0131\u015ft\u0131r. Puppeteer, bu t\u00fcr uygulamalar\u0131 i\u015flemek i\u00e7in \u00f6zel bekleme stratejileri sunar.<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\n\nasync function handleSPA() {\n  const browser = await puppeteer.launch();\n  const page = await browser.newPage();\n  await page.goto('https:\/\/react-redux.realworld.io\/'); \/\/ \u00d6rnek bir SPA\n\n  \/\/ Bir elementin y\u00fcklenmesini bekle\n  await page.waitForSelector('.article-preview:first-child');\n\n  \/\/ \u0130lk makalenin ba\u015fl\u0131\u011f\u0131n\u0131 al\n  const firstArticleTitle = await page.$eval('.article-preview:first-child h1', el => el.innerText);\n  console.log('\u0130lk makale ba\u015fl\u0131\u011f\u0131:', firstArticleTitle);\n\n  \/\/ Bir sonraki sayfaya gitmek i\u00e7in butona t\u0131kla (pagination)\n  await Promise.all([\n    page.waitForNavigation({ waitUntil: 'networkidle0' }), \/\/ T\u00fcm a\u011f isteklerinin bitmesini bekle\n    page.click('.page-item:nth-child(3) > .page-link') \/\/ Sayfaland\u0131rma butonuna t\u0131kla\n  ]);\n\n  \/\/ Yeni sayfadaki ilk makalenin ba\u015fl\u0131\u011f\u0131n\u0131 al\n  const newFirstArticleTitle = await page.$eval('.article-preview:first-child h1', el => el.innerText);\n  console.log('Yeni sayfadaki ilk makale ba\u015fl\u0131\u011f\u0131:', newFirstArticleTitle);\n\n  await browser.close();\n}\n\nhandleSPA();\n<\/code><\/pre>\n<p><code>page.waitForSelector<\/code> belirli bir DOM elementinin sayfada g\u00f6r\u00fcnmesini beklerken, <code>page.waitForNavigation<\/code> URL de\u011fi\u015fikli\u011fi veya tam sayfa yenilemesi gibi navigasyon olaylar\u0131n\u0131 bekler. <code>waitUntil: 'networkidle0'<\/code> se\u00e7ene\u011fi, sayfan\u0131n t\u00fcm a\u011f etkinlikleri durana kadar bekleyerek, JavaScript taraf\u0131ndan dinamik olarak y\u00fcklenen t\u00fcm i\u00e7eri\u011fin mevcut oldu\u011fundan emin olman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Taray\u0131c\u0131 Ayarlar\u0131 ve Performans Optimizasyonu<\/h4>\n<p>Puppeteer, taray\u0131c\u0131 davran\u0131\u015f\u0131n\u0131 ve performans\u0131n\u0131 etkileyen \u00e7e\u015fitli ayarlar\u0131 yap\u0131land\u0131rman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const puppeteer = require('puppeteer');\n\nasync function configureBrowser() {\n  const browser = await puppeteer.launch({\n    headless: true,\n    args: [\n      '--no-sandbox', \/\/ Docker gibi ortamlarda gerekli olabilir\n      '--disable-setuid-sandbox',\n      '--disable-infobars', \/\/ \"Chrome is being controlled by automated test software\" mesaj\u0131n\u0131 gizler\n      '--window-size=1920,1080' \/\/ Ba\u015flang\u0131\u00e7 pencere boyutunu ayarla\n    ]\n  });\n  const page = await browser.newPage();\n\n  \/\/ Kullan\u0131c\u0131 arac\u0131s\u0131n\u0131 de\u011fi\u015ftirme\n  await page.setUserAgent('Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/91.0.4472.124 Safari\/537.36 PuppeteerBot');\n\n  \/\/ G\u00f6r\u00fcn\u00fcm alan\u0131n\u0131 (viewport) ayarlama\n  await page.setViewport({ width: 1920, height: 1080 });\n\n  \/\/ A\u011f isteklerini engelleme (\u00f6rne\u011fin resimleri veya CSS'i)\n  await page.setRequestInterception(true);\n  page.on('request', (request) => {\n    if (['image', 'stylesheet', 'font'].includes(request.resourceType())) {\n      request.abort(); \/\/ Resim, CSS ve font isteklerini engelle\n    } else {\n      request.continue();\n    }\n  });\n\n  await page.goto('https:\/\/www.google.com'); \/\/ Daha h\u0131zl\u0131 y\u00fcklenmesi beklenir\n  await page.screenshot({ path: 'optimized_google.png' });\n\n  await browser.close();\n  console.log('Taray\u0131c\u0131 ayarlar\u0131 yap\u0131land\u0131r\u0131ld\u0131 ve optimize edilmi\u015f ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\u0131nd\u0131.');\n}\n\nconfigureBrowser();\n<\/code><\/pre>\n<p><code>puppeteer.launch<\/code> fonksiyonuna ge\u00e7irilen <code>args<\/code> dizisi, Chromium&#8217;a komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 eklemenizi sa\u011flar. Bu, taray\u0131c\u0131n\u0131n davran\u0131\u015f\u0131n\u0131 ince ayarlamak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. <code>page.setUserAgent<\/code> ile taray\u0131c\u0131n\u0131n kendini tan\u0131tma \u015feklini de\u011fi\u015ftirebilirsiniz. <code>page.setRequestInterception<\/code> ile a\u011f isteklerini izleyebilir ve hatta engelleyebilir veya de\u011fi\u015ftirebilirsiniz. Bu, \u00f6zellikle performans\u0131 art\u0131rmak (gereksiz kaynaklar\u0131 y\u00fcklemeyerek) veya belirli t\u00fcrdeki i\u00e7erikleri filtrelemek i\u00e7in \u00e7ok g\u00fc\u00e7l\u00fc bir \u00f6zelliktir.<\/p>\n<h3>Puppeteer&#8217;\u0131 Etkin Kullanmak \u0130\u00e7in \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Puppeteer ile karma\u015f\u0131k otomasyon g\u00f6revlerini ba\u015far\u0131yla tamamlamak i\u00e7in baz\u0131 ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h4>Hata Y\u00f6netimi<\/h4>\n<p>Otomasyon betikleri, beklenmeyen durumlarla (a\u011f hatalar\u0131, elementlerin bulunamamas\u0131, zaman a\u015f\u0131mlar\u0131) kar\u015f\u0131la\u015fabilir. Sa\u011flam bir hata y\u00f6netimi, betiklerinizin daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">try {\n  \/\/ Puppeteer i\u015flemleri\n  await page.goto('https:\/\/example.com\/non-existent-page');\n} catch (error) {\n  console.error('Bir hata olu\u015ftu:', error.message);\n  \/\/ Hata durumunda ekran g\u00f6r\u00fcnt\u00fcs\u00fc al, log kayd\u0131 tut vb.\n  await page.screenshot({ path: 'error_screenshot.png' });\n}\n<\/code><\/pre>\n<p><code>try-catch<\/code> bloklar\u0131, olas\u0131 hatalar\u0131 yakalamak ve uygun \u015fekilde i\u015flemek i\u00e7in esast\u0131r. Hata durumunda ekran g\u00f6r\u00fcnt\u00fcs\u00fc almak, sorunu ay\u0131klamak i\u00e7in \u00e7ok de\u011ferli bir ipucudur.<\/p>\n<h4>Bekleme Stratejileri<\/h4>\n<p>Web sayfalar\u0131 asenkron y\u00fcklenir ve i\u00e7eri\u011fin ne zaman haz\u0131r olaca\u011f\u0131n\u0131 tahmin etmek zor olabilir. Puppeteer&#8217;\u0131n bekleme fonksiyonlar\u0131n\u0131 do\u011fru kullanmak, betiklerinizin kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<ul>\n<li><code>page.waitForSelector(selector)<\/code>: Belirli bir DOM elementinin sayfada g\u00f6r\u00fcnmesini bekler.<\/li>\n<li><code>page.waitForNavigation(options)<\/code>: Sayfa navigasyonunun tamamlanmas\u0131n\u0131 bekler. <code>waitUntil<\/code> se\u00e7enekleriyle (\u00f6rne\u011fin, <code>'load'<\/code>, <code>'domcontentloaded'<\/code>, <code>'networkidle0'<\/code>, <code>'networkidle2'<\/code>) daha spesifik bekleme ko\u015fullar\u0131 belirlenebilir. <code>networkidle0<\/code> genellikle t\u00fcm a\u011f isteklerinin durmas\u0131n\u0131 bekledi\u011fi i\u00e7in en g\u00fcveniliridir.<\/li>\n<li><code>page.waitForFunction(pageFunction, options, ...args)<\/code>: Sayfa ba\u011flam\u0131nda bir JavaScript fonksiyonunun <code>true<\/code> d\u00f6nd\u00fcrmesini bekler. \u00c7ok esnek bir bekleme y\u00f6ntemidir.<\/li>\n<li><code>page.waitForTimeout(milliseconds)<\/code>: Belirli bir s\u00fcre bekler. Genellikle ka\u00e7\u0131n\u0131lmas\u0131 gereken bir y\u00f6ntemdir \u00e7\u00fcnk\u00fc sayfan\u0131n y\u00fcklenme s\u00fcresi de\u011fi\u015febilir ve gereksiz gecikmelere yol a\u00e7abilir. Sadece kesinlikle gerekli oldu\u011funda kullan\u0131lmal\u0131d\u0131r.<\/li>\n<\/ul>\n<h4>Kaynak Y\u00f6netimi<\/h4>\n<p>Her Puppeteer beti\u011fi, taray\u0131c\u0131 ve sayfa \u00f6rneklerini d\u00fczg\u00fcn bir \u015fekilde kapatmal\u0131d\u0131r. Aksi takdirde, bellekte gereksiz kaynaklar kalabilir ve sistem performans\u0131n\u0131 olumsuz etkileyebilir.<\/p>\n<pre><code class=\"language-javascript\">const browser = await puppeteer.launch();\nconst page = await browser.newPage();\ntry {\n  \/\/ \u0130\u015flemler\n} finally {\n  await browser.close(); \/\/ Her zaman taray\u0131c\u0131y\u0131 kapat\n}\n<\/code><\/pre>\n<p><code>finally<\/code> blo\u011fu, i\u015flemler ba\u015far\u0131yla tamamlansa da hata olu\u015fsa da taray\u0131c\u0131n\u0131n kapat\u0131lmas\u0131n\u0131 garanti eder.<\/p>\n<h4>Paralel \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Birden fazla URL&#8217;yi e\u015f zamanl\u0131 olarak i\u015flemek, otomasyon g\u00f6revlerinin s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilir. Puppeteer, birden fazla sayfa veya taray\u0131c\u0131 \u00f6rne\u011fi \u00fczerinde paralel \u00e7al\u0131\u015fmay\u0131 destekler.<\/p>\n<pre><code class=\"language-javascript\">async function processUrls(urls) {\n  const browser = await puppeteer.launch();\n  const results = await Promise.all(urls.map(async (url) => {\n    const page = await browser.newPage();\n    await page.goto(url);\n    const title = await page.title();\n    await page.close(); \/\/ Her sayfa i\u015flendikten sonra kapat\n    return { url, title };\n  }));\n  await browser.close();\n  return results;\n}\n\n\/\/ processUrls(['https:\/\/example.com', 'https:\/\/google.com']).then(console.log);\n<\/code><\/pre>\n<p><code>Promise.all<\/code> kullanarak, her URL i\u00e7in ayr\u0131 bir sayfa olu\u015fturulur ve e\u015f zamanl\u0131 olarak i\u015flenir. Her sayfa i\u015flendikten sonra kapat\u0131lmal\u0131d\u0131r.<\/p>\n<h4>Proxy Kullan\u0131m\u0131<\/h4>\n<p>Web scraping yaparken veya belirli co\u011frafi k\u0131s\u0131tlamalar\u0131 a\u015farken, IP adresinizin engellenmemesi i\u00e7in proxy sunucular\u0131 kullanmak \u00f6nemlidir.<\/p>\n<pre><code class=\"language-javascript\">const browser = await puppeteer.launch({\n  args: ['--proxy-server=http:\/\/your_proxy_ip:port']\n});\n<\/code><\/pre>\n<p>Proxy sunucu kimlik do\u011frulamas\u0131 gerektiriyorsa, <code>page.authenticate()<\/code> y\u00f6ntemini kullanabilirsiniz.<\/p>\n<h4>CAPTCHA ve Bot Alg\u0131lama Sistemlerinden Ka\u00e7\u0131nma<\/h4>\n<p>Bir\u00e7ok web sitesi, botlar\u0131 alg\u0131lamak ve engellemek i\u00e7in geli\u015fmi\u015f sistemler kullan\u0131r. Puppeteer ile bu sistemleri atlatmak zor olabilir, ancak baz\u0131 stratejiler yard\u0131mc\u0131 olabilir:<\/p>\n<ul>\n<li><code>headless: false<\/code>: Taray\u0131c\u0131y\u0131 ba\u015fs\u0131z modda \u00e7al\u0131\u015ft\u0131rmak yerine g\u00f6rsel aray\u00fczle \u00e7al\u0131\u015ft\u0131rmak, baz\u0131 bot alg\u0131lama sistemlerini atlatmaya yard\u0131mc\u0131 olabilir, \u00e7\u00fcnk\u00fc ger\u00e7ek bir taray\u0131c\u0131 gibi davran\u0131r.<\/li>\n<li><code>page.setUserAgent()<\/code>: Ger\u00e7ek bir kullan\u0131c\u0131n\u0131n taray\u0131c\u0131 bilgilerini taklit edin.<\/li>\n<li><code>page.evaluateOnNewDocument()<\/code>: Sayfa y\u00fcklenmeden \u00f6nce taray\u0131c\u0131da baz\u0131 JavaScript de\u011fi\u015fkenlerini (\u00f6rne\u011fin, <code>navigator.webdriver<\/code> \u00f6zelli\u011fini <code>undefined<\/code> olarak ayarlamak) de\u011fi\u015ftirebilirsiniz.<\/li>\n<li><code>puppeteer-extra<\/code> ve <code>puppeteer-extra-plugin-stealth<\/code>: Bu k\u00fct\u00fcphaneler, Puppeteer&#8217;\u0131 daha &#8220;insan&#8221; gibi g\u00f6stermek i\u00e7in \u00e7e\u015fitli hileler uygular.<\/li>\n<li>Ger\u00e7ek\u00e7i Kullan\u0131c\u0131 Davran\u0131\u015flar\u0131: Rastgele gecikmeler eklemek, fare hareketlerini ve kayd\u0131rma i\u015flemlerini sim\u00fcle etmek, insan benzeri etkile\u015fimler sa\u011flamak.<\/li>\n<\/ul>\n<h3>Puppeteer ve Di\u011fer Otomasyon Ara\u00e7lar\u0131<\/h3>\n<p>Web otomasyonu d\u00fcnyas\u0131nda Puppeteer tek se\u00e7enek de\u011fildir. Di\u011fer pop\u00fcler ara\u00e7larla kar\u015f\u0131la\u015ft\u0131rmak, do\u011fru arac\u0131 se\u00e7menize yard\u0131mc\u0131 olabilir.<\/p>\n<h4>Selenium ile Kar\u015f\u0131la\u015ft\u0131rma<\/h4>\n<p>Selenium, uzun y\u0131llard\u0131r web otomasyonu ve test d\u00fcnyas\u0131n\u0131n lideridir. \u00c7e\u015fitli programlama dilleri (Java, Python, C#, Ruby, JavaScript vb.) i\u00e7in s\u00fcr\u00fcc\u00fcleri ve farkl\u0131 taray\u0131c\u0131lar (Chrome, Firefox, Safari, Edge) i\u00e7in deste\u011fiyle bilinir.<\/p>\n<ul>\n<li><strong>\u00c7oklu Dil ve Taray\u0131c\u0131 Deste\u011fi:<\/strong> Selenium&#8217;un en b\u00fcy\u00fck avantaj\u0131, \u00e7oklu dil ve taray\u0131c\u0131 deste\u011fidir. Puppeteer ise \u00f6ncelikle Node.js ve Chromium tabanl\u0131 taray\u0131c\u0131lar i\u00e7in optimize edilmi\u015ftir.<\/li>\n<li><strong>API Yakla\u015f\u0131m\u0131:<\/strong> Selenium, WebDriver protokol\u00fc \u00fczerinden taray\u0131c\u0131larla ileti\u015fim kurarken, Puppeteer do\u011frudan Chrome DevTools Protokol\u00fc&#8217;n\u00fc kullan\u0131r. Bu, Puppeteer&#8217;a daha d\u00fc\u015f\u00fck seviyeli ve daha h\u0131zl\u0131 bir kontrol imkan\u0131 sunar, \u00f6zellikle Chrome\/Chromium i\u00e7in.<\/li>\n<li><strong>Performans:<\/strong> Genellikle Puppeteer, Chromium ile do\u011frudan entegrasyonu sayesinde daha h\u0131zl\u0131 performans sunar.<\/li>\n<li><strong>Kurulum ve Kullan\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Puppeteer&#8217;\u0131n kurulumu ve kullan\u0131m\u0131 genellikle daha basittir, \u00e7\u00fcnk\u00fc Chromium&#8217;u otomatik olarak indirir ve yap\u0131land\u0131r\u0131r. Selenium&#8217;da ise taray\u0131c\u0131 s\u00fcr\u00fcc\u00fclerini manuel olarak y\u00f6netmek gerekebilir.<\/li>\n<li><strong>Kullan\u0131m Alanlar\u0131:<\/strong> Puppeteer, daha \u00e7ok web scraping, PDF\/ekran g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturma gibi g\u00f6revler i\u00e7in tercih edilirken, Selenium daha geni\u015f \u00e7apl\u0131 u\u00e7tan uca test otomasyon projelerinde kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<h4>Playwright ile Kar\u015f\u0131la\u015ft\u0131rma<\/h4>\n<p>Playwright, Microsoft taraf\u0131ndan geli\u015ftirilen ve Puppeteer&#8217;a benzer, ancak daha geni\u015f taray\u0131c\u0131 deste\u011fi sunan yeni nesil bir web otomasyon k\u00fct\u00fcphanesidir. Node.js, Python, Java ve .NET dillerini destekler.<\/p>\n<ul>\n<li><strong>\u00c7oklu Taray\u0131c\u0131 Deste\u011fi:<\/strong> Playwright, tek bir API ile Chromium, Firefox ve WebKit (Safari&#8217;nin motoru) taray\u0131c\u0131lar\u0131n\u0131 destekler. Bu, Puppeteer&#8217;\u0131n \u00f6tesinde bir avantajd\u0131r.<\/li>\n<li><strong>Otomatik Beklemeler:<\/strong> Playwright, elementlerin eylemler i\u00e7in haz\u0131r olmas\u0131n\u0131 otomatik olarak bekleyerek, manuel <code>waitForSelector<\/code> veya <code>waitForNavigation<\/code> \u00e7a\u011fr\u0131lar\u0131na olan ihtiyac\u0131 azalt\u0131r. Bu, test kodunu daha temiz ve daha az k\u0131r\u0131lgan hale getirir.<\/li>\n<li><strong>Paralel \u00c7al\u0131\u015ft\u0131rma ve Test Ko\u015fucusu:<\/strong> Playwright, yerle\u015fik bir test ko\u015fucusu ile gelir ve testleri paralel olarak \u00e7al\u0131\u015ft\u0131rma konusunda Puppeteer&#8217;dan daha entegre bir \u00e7\u00f6z\u00fcm sunar.<\/li>\n<li><strong>Video Kayd\u0131 ve \u0130zleme:<\/strong> Playwright, otomasyon s\u0131ras\u0131nda taray\u0131c\u0131 etkile\u015fimlerinin video kayd\u0131n\u0131 alabilir ve test hatalar\u0131n\u0131 ay\u0131klamak i\u00e7in kapsaml\u0131 izleme yetenekleri sunar.<\/li>\n<\/ul>\n<p>Puppeteer hala g\u00fc\u00e7l\u00fc ve ge\u00e7erli bir ara\u00e7 olsa da, Playwright daha geni\u015f taray\u0131c\u0131 deste\u011fi ve baz\u0131 geli\u015fmi\u015f \u00f6zellikleriyle modern web otomasyonu i\u00e7in g\u00fc\u00e7l\u00fc bir alternatif olarak \u00f6ne \u00e7\u0131kmaktad\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>Puppeteer sadece Chrome ile mi \u00e7al\u0131\u015f\u0131r?<\/h4>\n<p>Puppeteer, esas olarak Chromium tabanl\u0131 taray\u0131c\u0131larla \u00e7al\u0131\u015fmak \u00fczere tasarlanm\u0131\u015ft\u0131r. Varsay\u0131lan olarak, Puppeteer paketi ile birlikte gelen Chromium s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131r. Ancak, Puppeteer&#8217;\u0131 Google Chrome&#8217;un y\u00fckl\u00fc bir s\u00fcr\u00fcm\u00fcne veya Microsoft Edge gibi di\u011fer Chromium tabanl\u0131 taray\u0131c\u0131lara ba\u011flamak da m\u00fcmk\u00fcnd\u00fcr. Firefox deste\u011fi deneysel a\u015famadayd\u0131 ancak \u015fu anda <a href=\"https:\/\/github.com\/puppeteer\/puppeteer\/issues\/6265\" target=\"_blank\">Puppeteer&#8217;\u0131n kendi i\u00e7inde aktif olarak desteklenmemektedir<\/a>; bunun yerine Playwright gibi ara\u00e7lar \u00e7oklu taray\u0131c\u0131 deste\u011fi sunar.<\/p>\n<h4>Headless modun dezavantajlar\u0131 nelerdir?<\/h4>\n<p>Headless modun ba\u015fl\u0131ca dezavantaj\u0131, g\u00f6rsel bir aray\u00fcz olmamas\u0131 nedeniyle hata ay\u0131klaman\u0131n daha zor olmas\u0131d\u0131r. Bir betik bekledi\u011finiz gibi \u00e7al\u0131\u015fmad\u0131\u011f\u0131nda, neyin yanl\u0131\u015f gitti\u011fini g\u00f6rmek i\u00e7in taray\u0131c\u0131 penceresini izleyemezsiniz. Bu durumda, ekran g\u00f6r\u00fcnt\u00fcleri almak, taray\u0131c\u0131 g\u00fcnl\u00fcklerini incelemek veya <code>headless: false<\/code> modunda \u00e7al\u0131\u015farak sorunu g\u00f6rsel olarak tespit etmek gerekebilir. Ayr\u0131ca, baz\u0131 web siteleri, ba\u015fs\u0131z taray\u0131c\u0131lar\u0131 alg\u0131lay\u0131p engelleyebilir.<\/p>\n<h4>Performans\u0131 nas\u0131l optimize edebilirim?<\/h4>\n<p>Puppeteer betiklerinizin performans\u0131n\u0131 art\u0131rmak i\u00e7in birka\u00e7 strateji vard\u0131r:<\/p>\n<ul>\n<li><strong>Gereksiz Kaynaklar\u0131 Engelleme:<\/strong> <code>page.setRequestInterception(true)<\/code> kullanarak resimler, CSS dosyalar\u0131 veya fontlar gibi gereksiz kaynaklar\u0131n y\u00fcklenmesini engelleyebilirsiniz. Bu, sayfa y\u00fckleme s\u00fcresini ve bant geni\u015fli\u011fi kullan\u0131m\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>Do\u011fru Bekleme Stratejileri:<\/strong> <code>waitForTimeout<\/code> kullanmaktan ka\u00e7\u0131n\u0131n. Bunun yerine <code>waitForSelector<\/code>, <code>waitForNavigation<\/code>, <code>waitForFunction<\/code> gibi daha spesifik bekleme y\u00f6ntemlerini kullan\u0131n.<\/li>\n<li><strong>\u00d6nbelle\u011fi Devre D\u0131\u015f\u0131 B\u0131rakma:<\/strong> Baz\u0131 durumlarda, taray\u0131c\u0131 \u00f6nbelle\u011fini devre d\u0131\u015f\u0131 b\u0131rakmak (\u00f6zellikle her zaman en yeni i\u00e7eri\u011fi \u00e7ekmek istiyorsan\u0131z) performans\u0131 art\u0131rabilir.<\/li>\n<li><strong>Headless Modu Kullanma:<\/strong> Ba\u015fs\u0131z mod, GUI y\u00fck\u00fcn\u00fc ortadan kald\u0131rd\u0131\u011f\u0131 i\u00e7in her zaman daha h\u0131zl\u0131d\u0131r.<\/li>\n<li><strong>Taray\u0131c\u0131 Arg\u00fcmanlar\u0131:<\/strong> <code>puppeteer.launch<\/code> fonksiyonuna <code>--no-sandbox<\/code>, <code>--disable-gpu<\/code> gibi arg\u00fcmanlar ekleyerek performans\u0131 art\u0131rabilirsiniz (ancak g\u00fcvenlik etkilerini g\u00f6z \u00f6n\u00fcnde bulundurun).<\/li>\n<li><strong>Paralel \u0130\u015flem:<\/strong> Birden fazla sayfa veya taray\u0131c\u0131 \u00f6rne\u011fini e\u015f zamanl\u0131 olarak \u00e7al\u0131\u015ft\u0131rarak toplam i\u015flem s\u00fcresini azaltabilirsiniz.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Puppeteer, Node.js ekosistemindeki en g\u00fc\u00e7l\u00fc ve esnek web otomasyon k\u00fct\u00fcphanelerinden biridir. Headless Chrome&#8217;un g\u00fcc\u00fcn\u00fc geli\u015ftiricilerin parmak u\u00e7lar\u0131na getirerek, web scraping&#8217;den u\u00e7tan uca testlere, PDF olu\u015fturmaktan dinamik i\u00e7erik manip\u00fclasyonuna kadar geni\u015f bir yelpazede g\u00f6revleri otomatikle\u015ftirmeyi m\u00fcmk\u00fcn k\u0131lar. Sa\u011flad\u0131\u011f\u0131 d\u00fc\u015f\u00fck seviyeli kontrol ve DevTools Protokol\u00fc ile do\u011frudan ileti\u015fim yetene\u011fi, Puppeteer&#8217;\u0131 \u00f6zellikle karma\u015f\u0131k ve performans odakl\u0131 otomasyon projeleri i\u00e7in ideal bir se\u00e7enek haline getirir.<\/p>\n<p>Bu makalede ele al\u0131nan kurulum, temel ve geli\u015fmi\u015f kullan\u0131m senaryolar\u0131, hata y\u00f6netimi, bekleme stratejileri ve performans optimizasyonu ipu\u00e7lar\u0131, Puppeteer&#8217;\u0131 etkin bir \u015fekilde kullanman\u0131z i\u00e7in sa\u011flam bir temel olu\u015fturmaktad\u0131r. Her ne kadar Playwright gibi alternatifler daha geni\u015f taray\u0131c\u0131 deste\u011fi sunsa da, Puppeteer&#8217;\u0131n Chromium ile derin entegrasyonu, olgunlu\u011fu ve geni\u015f topluluk deste\u011fi, onu bir\u00e7ok geli\u015ftirici i\u00e7in vazge\u00e7ilmez bir ara\u00e7 yapmaya devam etmektedir. Web otomasyonu d\u00fcnyas\u0131nda, Puppeteer ile Headless Chrome ikilisi, dijital i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 h\u0131zland\u0131rmak ve tekrarlayan g\u00f6revleri ortadan kald\u0131rmak i\u00e7in s\u0131n\u0131rs\u0131z potansiyel sunar.<\/p>\n<p><\/body><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber\nDijital d\u00fcnyada otomasyonun \u00f6nemi her ge\u00e7en g\u00fcn artmaktad\u0131r. Web say","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-35599","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>Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber - 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\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber Dijital d\u00fcnyada otomasyonun \u00f6nemi her ge\u00e7en g\u00fcn artmaktad\u0131r. Web say\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-01T12:40:55+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=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-12-01T12:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/\"},\"wordCount\":3426,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/\",\"name\":\"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-01T12:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber\"}]},{\"@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":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber - 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\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber","og_description":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber Dijital d\u00fcnyada otomasyonun \u00f6nemi her ge\u00e7en g\u00fcn artmaktad\u0131r. Web say","og_url":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-01T12:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber","datePublished":"2025-12-01T12:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/"},"wordCount":3426,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/","name":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-01T12:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/puppeteer-ile-headless-chrome-uzerinde-kolay-kontrol-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Puppeteer ile Headless Chrome \u00dczerinde Kolay Kontrol: Kapsaml\u0131 Bir Rehber"}]},{"@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\/35599","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=35599"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35599\/revisions"}],"predecessor-version":[{"id":35600,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35599\/revisions\/35600"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}