Playwright ile Web Kazıma ve Test Otomasyonu: Kapsamlı Bir Rehber
Modern web uygulamaları giderek daha dinamik ve etkileşimli hale gelirken, bu uygulamaları test etmek ve içeriklerini programatik olarak çekmek (web scraping) önemli bir ihtiyaç haline gelmiştir. Geleneksel yöntemler genellikle bu karmaşıklıkla başa çıkmakta zorlanırken, Microsoft tarafından geliştirilen açık kaynaklı bir kütüphane olan Playwright, bu alanda güçlü ve modern bir çözüm sunmaktadır. Bu makalede, Playwright’ın web kazıma ve test otomasyonu dünyasındaki yerini, temel özelliklerini, kurulumunu ve pratik kullanım senaryolarını detaylı bir şekilde inceleyeceğiz.
Playwright Nedir ve Neden Tercih Edilmelidir?
Playwright, Chromium (Google Chrome ve Microsoft Edge), Firefox ve WebKit (Safari) gibi popüler tarayıcıları tek bir API üzerinden otomatize etmenizi sağlayan, Node.js, Python, Java ve .NET dillerini destekleyen güçlü bir kütüphanedir. Temel amacı, web uygulamalarının uçtan uca testini kolaylaştırmak olsa da, dinamik içeriklerin bulunduğu web sitelerinden veri çekme (web scraping) konusunda da benzersiz yetenekler sunar.
Playwright’ın Temel Avantajları
- Çoklu Tarayıcı Desteği: Tek bir kod tabanıyla Chromium, Firefox ve WebKit’te test yapma veya veri çekme imkanı sunar. Bu, farklı tarayıcılardaki uyumluluk sorunlarını gidermeye yardımcı olur.
- Otomatik Beklemeler: Playwright, elementlerin yüklenmesini, animasyonların bitmesini ve ağ isteklerinin tamamlanmasını otomatik olarak bekler. Bu, testlerin veya kazıma işlemlerinin daha kararlı olmasını sağlar ve manuel bekleme komutlarına olan ihtiyacı azaltır.
- Paralel Çalışma: Testleri veya kazıma görevlerini aynı anda birden fazla tarayıcıda veya birden fazla bağlamda paralel olarak çalıştırabilir. Bu, işlem sürelerini önemli ölçüde kısaltır.
- Güçlü Seçiciler: CSS, XPath, metin içeriği ve erişilebilirlik (ARIA) nitelikleri gibi çeşitli seçicileri destekleyerek elementleri kolayca bulmanızı sağlar.
- İzolasyon: Her test veya kazıma oturumu tamamen izole edilmiş bir tarayıcı bağlamında çalışır, bu da önceki oturumların çerezleri veya önbellekleri gibi yan etkilerini ortadan kaldırır.
- Headless ve Headful Mod: Tarayıcıyı görünür (headful) veya arka planda (headless) çalıştırabilirsiniz. Hata ayıklama için headful mod, üretim ortamları için headless mod idealdir.
Playwright ve Diğer Araçlar Arasındaki Farklar
Playwright, Selenium gibi daha eski otomasyon araçlarına kıyasla modern web teknolojilerine daha iyi uyum sağlar. Özellikle otomatik beklemeler, tarayıcı bağlam izolasyonu ve çoklu tarayıcı desteği konularında öne çıkar. Puppeteer ile benzerlik gösterse de, Playwright’ın çoklu tarayıcı desteği ve daha geniş dil desteği onu daha kapsamlı bir çözüm haline getirir.
Playwright Kurulumu ve İlk Adımlar
Playwright’ı kullanmaya başlamak oldukça basittir. Python dilini kullanarak kurulum ve temel bir örnek üzerinden ilerleyelim.
Python Ortamının Hazırlanması
Öncelikle sisteminizde Python ve pip kurulu olduğundan emin olun. Ardından sanal bir ortam oluşturmak iyi bir pratiktir:
python -m venv playwright_env
source playwright_env/bin/activate # Linux/macOS
# playwright_env\Scripts\activate # Windows
Playwright Kütüphanesinin Kurulumu
Sanal ortamı etkinleştirdikten sonra Playwright'ı pip ile kurabilirsiniz:
pip install playwright
playwright install
playwright install komutu, Chromium, Firefox ve WebKit tarayıcılarının gerekli sürücülerini otomatik olarak indirir.
Basit Bir Playwright Betiği
Aşağıdaki Python kodu, bir web sayfasını açıp başlığını yazdıran basit bir örnektir:
from playwright.sync_api import sync_playwright
def run():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # Tarayıcıyı görünür aç
page = browser.new_page()
page.goto("https://www.example.com")
print(page.title())
browser.close()
if __name__ == "__main__":
run()
Bu kod, Chromium tarayıcısını açar, "https://www.example.com" adresine gider, sayfanın başlığını konsola yazdırır ve tarayıcıyı kapatır. headless=False parametresi, tarayıcının görsel olarak açılmasını sağlar, bu da hata ayıklama için kullanışlıdır.
Playwright ile Web Kazıma (Web Scraping)
Playwright, dinamik içeriklerin bulunduğu web sitelerinden veri çekmek için ideal bir araçtır. JavaScript tarafından oluşturulan içerikleri, AJAX isteklerini ve kullanıcı etkileşimlerini simüle edebilir.
Dinamik İçerikten Veri Çekme
Çoğu modern web sitesi, içeriği sayfa yüklendikten sonra JavaScript ile dinamik olarak oluşturur. Playwright, bu tür içeriklere erişmek için gereken tüm araçları sunar.
from playwright.sync_api import sync_playwright
def scrape_dynamic_content():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://www.trendyol.com/cep-telefonu-x-c106404") # Örnek bir e-ticaret sayfası
# Sayfanın yüklenmesini ve elementlerin görünür olmasını bekleyebiliriz
page.wait_for_selector("div.prdct-cntnr-wrppr", timeout=10000)
# Ürün isimlerini ve fiyatlarını çekelim
product_elements = page.query_selector_all("div.p-card-wrppr")
products = []
for product_element in product_elements:
title = product_element.query_selector("span.prdct-desc-v2").inner_text()
price = product_element.query_selector("div.prc-box-sllng").inner_text()
products.append({"title": title.strip(), "price": price.strip()})
for product in products[:5]: # İlk 5 ürünü göster
print(f"Ürün: {product['title']}, Fiyat: {product['price']}")
browser.close()
if __name__ == "__main__":
scrape_dynamic_content()
Bu örnekte, Trendyol gibi bir e-ticaret sitesinden ürün bilgilerini çekmeye çalışıyoruz. page.wait_for_selector() komutu, belirli bir elementin sayfada görünmesini bekleyerek veri çekme işleminin kararlılığını artırır.
Sayfalar Arası Gezinme ve Form Doldurma
Playwright, kullanıcı etkileşimlerini simüle ederek sayfalar arasında gezinmenize, formları doldurmanıza ve butonlara tıklamanıza olanak tanır.
from playwright.sync_api import sync_playwright
def fill_form_and_navigate():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.google.com")
# Arama kutusunu bul ve metin yaz
page.fill("input[name='q']", "Playwright web scraping")
# Enter tuşuna basarak aramayı yap
page.press("input[name='q']", "Enter")
# Arama sonuçlarının yüklenmesini bekle
page.wait_for_selector("#search")
# İlk arama sonucunun başlığını yazdır
first_result_title = page.query_selector("h3").inner_text()
print(f"İlk arama sonucu: {first_result_title}")
browser.close()
if __name__ == "__main_":
fill_form_and_navigate()
Playwright ile Test Otomasyonu
Playwright'ın asıl gücü, web uygulamalarının uçtan uca test otomasyonunda yatar. Kullanıcı senaryolarını simüle ederek uygulamanızın beklendiği gibi çalıştığından emin olmanızı sağlar.
Test Ortamının Hazırlanması
Playwright, kendi test runner'ı ile birlikte gelir ve testleri yazmak için basit bir API sunar. Python için pytest-playwright gibi entegrasyonlar da mevcuttur.
pip install pytest pytest-playwright
Temel Test Senaryoları Yazma
Bir web sayfasının başlığını kontrol eden ve bir butona tıklayıp sonucunu doğrulayan basit bir test örneği:
# test_example.py
import pytest
from playwright.sync_api import Page, expect
def test_homepage_title(page: Page):
page.goto("https://www.example.com")
expect(page).to_have_title("Example Domain")
def test_click_and_verify(page: Page):
page.goto("https://playwright.dev/python/docs/intro")
# "Get started" linkine tıkla
get_started_link = page.get_by_role("link", name="Get started")
get_started_link.click()
# URL'in değiştiğini doğrula
expect(page).to_have_url("https://playwright.dev/python/docs/intro#installing-playwright")
# Yeni sayfadaki bir başlığı doğrula
expect(page.get_by_role("heading", name="Installing Playwright")).to_be_visible()
Bu testleri çalıştırmak için terminalde pytest komutunu kullanmanız yeterlidir. Playwright, testleri varsayılan olarak headless modda çalıştırır.
Çoklu Tarayıcı ve Paralel Testler
Playwright, testlerinizi farklı tarayıcılarda paralel olarak çalıştırmanıza olanak tanır. Bu, test süresini önemli ölçüde azaltır ve tarayıcılar arası uyumluluğu garanti eder.
# Testleri Chromium, Firefox ve WebKit'te çalıştır
pytest --browser chromium --browser firefox --browser webkit
# Testleri 3 paralel worker ile çalıştır
pytest -n 3
Test Raporlama ve Hata Ayıklama
Playwright, testler sırasında ekran görüntüleri (screenshots), video kayıtları ve tarayıcı izleri (traces) alarak hata ayıklama sürecini kolaylaştırır. Bu özellikler, başarısız testlerin nedenini anlamak için kritik öneme sahiptir.
- Ekran Görüntüsü Alma:
page.screenshot(path="screenshot.png") - Video Kaydı:
browser = p.chromium.launch(record_video_dir="videos/") - Trace Viewer:
playwright test --trace onkomutu ile testleri çalıştırıp ardındanplaywright show-trace trace.zipile detaylı bir analiz arayüzü açabilirsiniz.
Gelişmiş Özellikler ve En İyi Uygulamalar
Playwright'ın sunduğu bazı gelişmiş özellikler ve bu araçla çalışırken dikkat etmeniz gereken en iyi uygulamalar:
Network İsteklerini İzleme ve Değiştirme
Playwright, ağ trafiğini izlemenize, istekleri engellemenize veya değiştirmenize olanak tanır. Bu, testlerde belirli API yanıtlarını simüle etmek veya kazıma sırasında gereksiz kaynakları yüklemeyi önlemek için kullanışlıdır.
# Örnek: Belirli bir API isteğini engelleme
page.route("**/api/ads", lambda route: route.abort())
# Örnek: Bir API isteğinin yanıtını değiştirme
page.route("**/api/data", lambda route: route.fulfill(
status=200,
content_type="application/json",
body='{"message": "Simüle edilmiş veri"}'
))
Kullanıcı Kimlik Doğrulaması ve Oturum Yönetimi
Playwright, oturumları kaydetmenize ve yeniden kullanmanıza olanak tanır, böylece her test veya kazıma oturumu için tekrar tekrar giriş yapmanıza gerek kalmaz.
# Oturum durumunu kaydetme
page.context.storage_state(path="auth.json")
# Kaydedilmiş oturum durumunu yükleme
browser = p.chromium.launch()
context = browser.new_context(storage_state="auth.json")
page = context.new_page()
Hata Yönetimi ve Yeniden Deneme Mekanizmaları
Web siteleri bazen kararsız olabilir veya geçici ağ sorunları yaşanabilir. Bu durumlarda, Playwright'ın otomatik beklemelerine ek olarak özel yeniden deneme mekanizmaları uygulamak önemlidir.
from playwright.sync_api import TimeoutError
import time
def robust_click(page, selector, retries=3, delay=2):
for i in range(retries):
try:
page.click(selector, timeout=5000)
return True
except TimeoutError:
print(f"Element bulunamadı veya tıklanamadı, yeniden deneme {i+1}/{retries}...")
time.sleep(delay)
return False
Playwright Kullanım Alanları ve Geleceği
Playwright'ın kullanım alanları oldukça geniştir ve sürekli gelişmektedir.
Yaygın Kullanım Senaryoları
- E-ticaret Fiyat Takibi: Farklı sitelerdeki ürün fiyatlarını otomatik olarak izleme.
- Rakip Analizi: Rakip web sitelerinden ürün bilgileri, yorumlar veya içerik trendleri çekme.
- Veri Toplama: Haber siteleri, forumlar veya sosyal medya platformlarından belirli konularda veri toplama.
- Uçtan Uca Test: Bir uygulamanın kullanıcı arayüzü ve işlevselliğinin farklı tarayıcılarda ve cihazlarda doğru çalıştığını doğrulama.
- Regresyon Testleri: Yeni kod değişikliklerinin mevcut işlevselliği bozmadığından emin olma.
- Erişilebilirlik Testleri: Web sitelerinin engelli kullanıcılar için erişilebilirliğini kontrol etme.
Playwright'ın Geleceği
Playwright, Microsoft tarafından aktif olarak geliştirilen ve büyük bir topluluk tarafından desteklenen bir projedir. Yeni tarayıcı sürümleriyle uyumluluğu, performans iyileştirmeleri ve yeni özelliklerin eklenmesiyle web otomasyonu alanındaki lider konumunu sürdürmesi beklenmektedir. Özellikle bulut tabanlı test platformlarıyla entegrasyonu ve yapay zeka destekli test senaryoları oluşturma potansiyeli, gelecekteki gelişim alanları arasında yer alabilir.
Sonuç
Playwright, modern web uygulamalarıyla çalışmak için tasarlanmış, web kazıma ve test otomasyonu alanında çığır açan bir araçtır. Çoklu tarayıcı desteği, otomatik beklemeler, paralel çalışma yetenekleri ve güçlü API'si sayesinde geliştiricilere ve test mühendislerine benzersiz bir esneklik ve verimlilik sunar. İster dinamik içeriklerden veri çekiyor olun, ister karmaşık kullanıcı senaryolarını test ediyor olun, Playwright projenizin ihtiyaçlarını karşılayacak sağlam ve güvenilir bir çözüm sunar. Web otomasyonu dünyasında geleceğe yönelik adımlar atmak isteyen herkesin Playwright'ı keşfetmesi şiddetle tavsiye edilir.
Sıkça Sorulan Sorular (SSS)
Playwright sadece test için mi kullanılır?
Hayır, Playwright öncelikli olarak test otomasyonu için tasarlanmış olsa da, dinamik web sitelerinden veri çekme (web scraping), web tabanlı görevleri otomatikleştirme ve ekran görüntüsü/video kaydı alma gibi birçok farklı amaç için de kullanılabilir.
Playwright hangi programlama dillerini destekler?
Playwright, Node.js (JavaScript/TypeScript), Python, Java ve .NET (C#) dillerini resmi olarak desteklemektedir.
Playwright ve Selenium arasındaki temel farklar nelerdir?
Playwright, modern tarayıcı mimarilerine daha yakındır ve bu sayede otomatik beklemeler, tarayıcı bağlam izolasyonu ve paralel çalışma gibi konularda daha iyi performans ve kararlılık sunar. Selenium ise daha eski bir geçmişe sahip olup, geniş bir topluluk ve entegrasyon ekosistemine sahiptir ancak bazı modern web senaryolarında Playwright kadar verimli olmayabilir.
Playwright ile CAPTCHA'ları aşabilir miyim?
Playwright, bir tarayıcı otomasyon aracıdır ve CAPTCHA'ları doğrudan çözme yeteneğine sahip değildir. CAPTCHA'lar, botları engellemek için tasarlandığından, bunları Playwright ile aşmak için genellikle üçüncü taraf CAPTCHA çözme hizmetleri veya yapay zeka destekli çözümler gibi ek entegrasyonlara ihtiyaç duyulur.
Playwright'ı headless modda çalıştırmak ne anlama gelir?
Headless mod, tarayıcının kullanıcı arayüzü olmadan, yani görsel bir pencere açmadan arka planda çalıştırılması anlamına gelir. Bu mod, genellikle üretim ortamlarında veya CI/CD boru hatlarında testleri ve kazıma işlemlerini daha hızlı ve kaynak açısından daha verimli bir şekilde çalıştırmak için tercih edilir. Hata ayıklama sırasında ise headless=False ile tarayıcıyı görünür şekilde açmak faydalı olabilir.