TestFly Bölüm 11: Selenium 4 CDP ile Ağ Manipülasyonu ve API Mocking
TestFly ve Selenium 4 CDP ile harici proxy olmadan ağ hızını yavaşlatma (3G/Offline), API yanıtlarını mock'lama ve konsol JS hatalarını yakalama rehberi.
Özet: Ağ isteklerini engelleme ve sahte yanıtlarla besleme (mocking) uzun süre yalnızca Playwright'a özgü bir avantaj olarak görüldü. TestFly, Selenium 4'ün Chrome DevTools Protocol (CDP) yeteneklerini Java'da soyutlayarak harici proxy sunucularına gerek kalmadan yavaş ağ simülasyonu (3G / Offline), API yanıt stubbing ve otomatik konsol JavaScript hata denetimi sunar.
Ağ Manipülasyonu Modern Web Testlerinde Neden Zorunludur?
Tek sayfalı modern web uygulamaları (SPA); onlarca mikroservis, ödeme ağ geçidi ve harici analitik servisiyle iletişim kurar. Geleneksel Selenium testlerinde:
- Ödeme servisinin 500 hatası vermesi gibi uç senaryoları test etmek için backend veritabanlarına müdahale etmek veya hantal proxy araçları (BrowserMob gibi) kurmak gerekirdi.
- Üçüncü parti harici servislerin gecikmesi testleri kararsız (flaky) hale getirirdi.
- Tarayıcı konsolunda patlayan JavaScript hataları, DOM'daki bir buton bozulmadığı sürece fark edilmezdi.
TestFly, Selenium 4'ün yerel CDP altyapısını kullanarak HTTP trafiğini doğrudan tarayıcı seviyesinde manipüle eder.
Yavaş Bağlantı (3G) ve Çevrimdışı (Offline) Mod Nasıl Simüle Edilir?
Mobil ve zayıf bağlantı koşullarında uygulamanızın davranışını test etmek kritik önem taşır:
package io.testfly.examples.network;
import io.testfly.network.NetworkSpeed;
import io.testfly.test.BaseTest;
import org.testng.annotations.Test;
public class AgManipulasyonTesti extends BaseTest {
@Test
public void cevrimdisiUyariKartiGoruntulenmeli() {
open("/dashboard");
// 1. Ağ bağlantısını anında kes
network().emulateOffline();
// 2. Ağ gerektiren işlemi yap
find("#sync-btn").click();
// 3. Çevrimdışı uyarısını doğrula
assertThat(find("#offline-alert")).hasText("İnternet bağlantınız koptu");
// 4. Ağı normale döndür
network().resetThrottling();
}
@Test
public void yavas3gYuklenmeAnimasyonuGosterilmeli() {
// Gerçekçi 3G gecikmesi: 2000ms gecikme, 400kbps indirme hızı
network().throttle(NetworkSpeed.SLOW_3G);
open("/raporlar");
assertThat(find(".loading-spinner")).isVisible();
}
}Arka Uç API Yanıtları Nasıl Mock'lanır (Stubbing)?
Backend servisine hiç dokunmadan belirli bir uç noktadan dönen HTTP durum kodunu veya JSON gövdesini manipüle edin:
@Test
public void odemeHatasiDurumundaKullaniciUyarisi() {
// Ödeme servisine giden POST çağrısını yakala ve 500 dön
network().intercept(rota -> rota
.matchingUrl("**/api/v1/charge")
.respondWith(500, "{\"error\": \"Ödeme servisi geçici olarak hizmet dışı\"}")
);
open("/checkout");
find("#pay-btn").click();
// Kullanıcıya gösterilen hata mesajını doğrula
assertThat(find(".error-toast")).hasText("Ödeme servisi geçici olarak hizmet dışı");
}Sessiz JavaScript Konsol Hataları Nasıl Yakalanır?
DOM elemanları doğru görünse bile arka planda fırlatılan kritik JavaScript hataları kullanıcı deneyimini bozar. TestFly'ın ConsoleErrorCollector modülü tarayıcı konsolunu sürekli dinler:
browser:
captureConsoleErrors: true
failOnConsoleErrors: true # Ciddi JS hatalarında testi otomatik başarısız sayKritik bir hata (Uncaught TypeError, kayıp script dosyaları) oluştuğunda TestFly test raporuna hata yığınını ekler ve testi anında patlatır.
SSS
TestFly ağ engelleme için BrowserMob gibi harici bir proxy sunucusuna ihtiyaç duyar mı?
Hayır. TestFly doğrudan Chrome DevTools Protocol (CDP) WebSocket hattı üzerinden tarayıcı motoruyla konuşur; harici port veya sertifika kurulumu gerektirmez.
CDP ağ manipülasyonu headless tarayıcılarda çalışır mı?
Evet. CI/CD sunucularında çalışan headless Chrome/Chromium tarayıcılar CDP protokolünü eksiksiz destekler.
Yanıt başlıkları ve durum kodları özelleştirilebilir mi?
Evet. respondWith() metodu üzerinden istediğiniz HTTP durum kodunu (401, 403, 500, 503) ve JSON başlıklarını döndürebilirsiniz.