Python İle Pyppeteer Kütüphanesi Kullanarak Web Form Testi Nasıl Yapılır?

Python İle Pyppeteer Kütüphanesi Kullanarak Web Form Testi Nasıl Yapılır?
Python İle Pyppeteer Kütüphanesi Kullanarak Web Form Testi Nasıl Yapılır?

Gereksinimler ve Ortam Kurulumu

Çalışmalara başlamadan önce sisteminizde Python'ın yüklü olduğundan emin olmalısınız. Pyppeteer, asenkron (asyncio) yapısını temel alır; bu nedenle kodlarımızı yazarken async ve await anahtar kelimelerini kullanacağız.

Gerekli kütüphaneyi kurmak için terminalinize şu komutu yazın:

pip install pyppeteer

Kurulum tamamlandıktan sonra, Pyppeteer ilk çalıştırıldığında Chromium'u otomatik olarak indirecektir. Eğer ağ kısıtlamaları nedeniyle indirme gerçekleşmezse, pyppeteer-install komutunu kullanarak manuel tetikleme yapabilirsiniz.

Pyppeteer ile Tarayıcıyı Başlatma ve Sayfaya Erişim

Otomasyonun ilk adımı, tarayıcıyı kontrol edilebilir bir nesne olarak başlatmaktır. Aşağıdaki örnekte, tarayıcıyı nasıl başlatacağınızı ve belirli bir URL'ye nasıl gideceğinizi görebilirsiniz.

import asyncio
from pyppeteer import launch

async def main():
    # headless=False parametresi tarayıcıyı görmenizi sağlar
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://example.com/login')
    
    # İşlemler bittiğinde tarayıcıyı kapatın
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

Burada launch fonksiyonu tarayıcı örneğini oluşturur. headless=False seçeneği, testlerinizi geliştirirken görsel hata ayıklama yapmanıza olanak tanır. Üretim ortamında (CI/CD) bu değeri True yapmanız kaynak tasarrufu sağlar.

Web Form Alanlarını Doldurma ve Etkileşim

Form testi yaparken en kritik nokta, doğru input alanlarını seçmek ve veri girişi yapmaktır. Pyppeteer, CSS seçicilerini (selectors) kullanarak elementlere erişmemizi sağlar.

async def form_doldur(page):
    # Kullanıcı adı ve şifre alanlarını CSS seçicisi ile bulma
    await page.type('#username', 'test_kullanicisi')
    await page.type('#password', 'GucluSifre123!')
    
    # Gönder butonuna tıklama
    await page.click('#login-button')
    
    # Sayfa yönlendirmesini bekleme
    await page.waitForNavigation()

type metodu, klavye girişi simüle eder. Eğer formunuzda JavaScript tabanlı bir doğrulama varsa, delay parametresi ekleyerek yazma hızını yavaşlatıp insan davranışını taklit edebilirsiniz.

Form Testlerinde Doğrulama (Assertion) İşlemleri

Formun başarıyla gönderilip gönderilmediğini anlamak için sayfa içeriğini kontrol etmelisiniz. Başarılı bir girişten sonra çıkan "Hoş geldiniz" mesajını yakalamak, testin geçtiğini kanıtlar.

async def test_dogrulama(page):
    # Sayfadaki bir metni kontrol etme
    element = await page.querySelector('.success-message')
    if element:
        text = await page.evaluate('(element) => element.textContent', element)
        print(f"Test Başarılı: {text}")
    else:
        print("Test Başarısız: Mesaj bulunamadı.")

evaluate metodu, tarayıcı bağlamında JavaScript çalıştırmanıza imkan tanır. Bu, karmaşık DOM işlemlerini Python içinden yönetmek için en güçlü yöntemdir.

Test Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
Pyppeteer Hızlı, asenkron, modern Öğrenme eğrisi (Asyncio)
Selenium Geniş topluluk desteği Daha yavaş, hantal
Playwright Daha gelişmiş API Pyppeteer kadar yaygın değil

Kritik Güvenlik ve Hata Yönetimi

Dikkat: Test otomasyonunda asla gerçek kullanıcı verilerini (gerçek şifreler, kredi kartı bilgileri) kullanmayın. Test verileri için her zaman izole edilmiş, sahte veriler (mock data) kullanın. Ayrıca, test betiklerinizi sürüm kontrol sistemlerine (Git) yüklerken API anahtarlarını ve şifreleri asla hard-coded (kodun içine gömülü) bırakmayın; ortam değişkenlerini (environment variables) tercih edin.

Form Hatalarını Yakalama ve Debug Etme

Form testlerinde bazen beklenmedik hatalar oluşabilir. Hataları yakalamak için try-except bloklarını ve ekran görüntüsü alma özelliğini kullanmalısınız.

async def test_hata_yakalama(page):
    try:
        await page.type('#email', 'gecersiz-email')
        await page.click('#submit')
        # Hata mesajı görünene kadar bekle
        await page.waitForSelector('.error-box', timeout=5000)
    except Exception as e:
        await page.screenshot({'path': 'hata_aninda.png'})
        print(f"Hata oluştu: {e}")

screenshot metodu, testin neden başarısız olduğunu görsel olarak incelemenizi sağlar. timeout parametresi ise testin sonsuza kadar beklemesini engeller.

Sıkça Sorulan Sorular

Pyppeteer ile Selenium arasındaki temel fark nedir?

Pyppeteer, Chromium'un DevTools protokolünü doğrudan kullanır ve asenkron çalışır. Selenium ise WebDriver protokolünü kullanır ve genellikle senkron yapıdadır. Pyppeteer, modern web uygulamaları için daha hafif ve hızlıdır.

Headless modu nedir, neden kullanmalıyım?

Headless modu, tarayıcının grafik arayüzü olmadan çalışmasıdır. Sunucu taraflı testlerde veya CI/CD süreçlerinde daha az bellek tüketimi sağlar ve daha hızlı çalışır.

waitForSelector neden kullanmalıyım?

Web sayfaları dinamik içerik yükleyebilir. Eğer element henüz DOM'a eklenmeden etkileşime girmeye çalışırsanız hata alırsınız. waitForSelector, elementin yüklenmesini bekleyerek testin kararlılığını artırır.

Pyppeteer ile çoklu sekme yönetimi mümkün mü?

Evet, browser.newPage() metodu ile yeni sayfalar açabilir ve browser.pages() ile mevcut sayfalar arasında geçiş yapabilirsiniz.

Testlerimi nasıl zamanlayabilirim?

Python'ın schedule kütüphanesini veya işletim sisteminin zamanlanmış görevlerini (Cron job) kullanarak test betiklerinizi belirli aralıklarla çalıştırabilirsiniz.

Pyppeteer Testlerini CI/CD Süreçlerine Entegre Etme

Yazdığınız testlerin sadece yerel makinenizde çalışması yeterli değildir. Gerçek dünya senaryolarında, bu testlerin her kod gönderiminde (push) otomatik olarak çalışması gerekir. GitHub Actions veya GitLab CI gibi araçlar kullanarak Pyppeteer testlerinizi bir pipeline içerisine dahil edebilirsiniz.

CI/CD ortamında tarayıcıyı çalıştırmak için --no-sandbox ve --disable-setuid-sandbox bayraklarını kullanmanız zorunludur. Aksi takdirde, kısıtlı yetkilere sahip sunucu ortamlarında tarayıcı başlatılamaz.

import asyncio
from pyppeteer import launch

async def run_ci_test():
    browser = await launch(
        args=['--no-sandbox', '--disable-setuid-sandbox']
    )
    page = await browser.newPage()
    await page.goto('https://example.com/form')
    # Test adımları buraya gelecek
    await browser.close()

if __name__ == "__main__":
    asyncio.get_event_loop().run_until_complete(run_ci_test())

Test Senaryolarında Performans Optimizasyonu

Form testleri sırasında sayfanın tamamen yüklenmesini beklemek yerine, sadece ilgili form elemanının görünür olmasını beklemek test süresini ciddi oranda kısaltır. Ayrıca, gereksiz kaynakların (resimler, fontlar veya reklam scriptleri) yüklenmesini engelleyerek bant genişliğinden tasarruf edebilirsiniz.

İstek Engelleme (Request Interception) Kullanımı

Aşağıdaki örnekte, test sırasında resim dosyalarının yüklenmesini engelleyerek testin daha hızlı tamamlanmasını sağlayan bir yapı kurulmuştur:

async def intercept_request(request):
    if request.resourceType in ['image', 'media', 'font']:
        await request.abort()
    else:
        await request.continue_()

async def optimized_test():
    browser = await launch()
    page = await browser.newPage()
    await page.setRequestInterception(True)
    page.on('request', intercept_request)
    
    await page.goto('https://example.com/form')
    # Sadece gerekli içerik yüklendiği için test daha hızlı çalışır
    await browser.close()

İleri Seviye Hata Ayıklama İpuçları

Testleriniz karmaşıklaştıkça, "neden başarısız oldu?" sorusuna yanıt bulmak zorlaşabilir. Pyppeteer, tarayıcı konsolundaki hataları yakalamanıza ve hata anında ekran görüntüsü almanıza olanak tanır.

  • Console Loglarını İzleme: Tarayıcı içindeki JavaScript hatalarını Python konsoluna aktarabilirsiniz.
  • Ekran Görüntüsü (Screenshot): Hata anında page.screenshot() metodunu kullanarak o anki durumu görselleştirebilirsiniz.
  • PDF Çıktısı: Formun doldurulmuş halini kanıt olarak PDF formatında kaydedebilirsiniz.
# Hata anında ekran görüntüsü alma örneği
try:
    await page.type('#username', 'test_user')
    await page.click('#submit')
    await page.waitForSelector('.success-message', timeout=5000)
except Exception as e:
    await page.screenshot({'path': 'hata_ani.png'})
    print(f"Test başarısız oldu: {e}")

Sonuç

Python ile Pyppeteer kullanarak web form testi yapmak, uygulamalarınızın güvenilirliğini artırmak için atabileceğiniz en etkili adımlardan biridir. Bu rehberde tarayıcıyı başlatmayı, form doldurmayı, doğrulama yapmayı ve hataları yönetmeyi öğrendiniz. Bir sonraki adım olarak, bu testleri bir test çerçevesi olan pytest ile entegre ederek daha profesyonel bir test suite (test takımı) oluşturmayı deneyebilirsiniz.

Not: Bu içerik eğitim amaçlıdır. Web otomasyonu yaparken hedef sitenin "robots.txt" kurallarına ve kullanım şartlarına uymanız yasal sorumluluğunuzdur.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Ev ekonomisi ve kişisel organizasyon üzerine birçok yayın yönettim. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeyi hedefliyorum.

Yorumlar (0)

Yorum Yaz