← Tüm yazılar

Selenium beklemeleri ve HTML ayrıştırmasını ayırmak

Tarayıcı otomasyonunda sayfanın açılmış olması, aradığım verinin hazır olduğu anlamına gelmiyor. JavaScript ile sonradan eklenen kartları sabit süre uyutarak beklemek yerine, gereken DOM koşulunu bekleyip ayrıştırmayı o noktadan sonra yapıyorum.

t.Turgay
Selenium beklemeleri ve HTML ayrıştırmasını ayırmak

Tarayıcı açıldı, adres doğru, ekrandaki ürün de gözümün önünde; buna rağmen otomasyon boş başlık döndürebiliyor. Sebep çoğu zaman “Selenium yavaş” değil, yanlış hazır olma koşulu. Belgenin yüklenmesi, JavaScript ile doldurulacak kartın hazır olduğunu söylemez. Arşivimdeki tarayıcı otomasyonu ve HTML ayrıştırma kodlarını incelerken bu iki sorumluluğu ayrı düşünmek özellikle işe yarıyor.

Beklenecek şeyi iş ihtiyacı belirler

Bir yerel test sayfasının .product kartını iki saniye sonra eklediğini varsayalım. Thread.Sleep ile üç saniye beklemek o makinede çalışabilir; ağ gecikmesi veya işlem yükü artınca kırılır. Üstelik kart yüz milisaniyede hazır olduğunda da kalan süreyi boşuna tüketir. Explicit wait, bir üst süre içinde gereken koşulu tekrar kontrol eder. Süre bir hedef gecikme değil, vazgeçme sınırıdır.

Bu örnekte koşul görünür karttır. Gerçekte gereken şey fiyat veya başlıksa, yalnız kabuğun görünmesini yeterli saymam; ilgili alanın beklenen duruma gelmesini kontrol ederim. Aşağıdaki yardımcı, Selenium.WebDriver, Selenium.Support ve HtmlAgilityPack ile mevcut WebDriver üzerinden çağrılan bir entegrasyon parçasıdır.

using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using HtmlAgilityPack;

static string ReadTitle(IWebDriver driver, Uri localPage)
{
    driver.Navigate().GoToUrl(localPage);
    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
    var card = wait.Until(browser =>
        browser.FindElements(By.CssSelector(".product"))
            .FirstOrDefault(element => element.Displayed));
    var html = new HtmlDocument();
    html.LoadHtml(card.GetAttribute("outerHTML"));
    return HtmlEntity.DeEntitize(html.DocumentNode
        .SelectSingleNode("//h2")?.InnerText ?? "").Trim();
}

Canlı DOM ile HTML anlık görüntüsü arasındaki sınır

FindElements boş bir koleksiyon döndürebildiğinden ilk kontrolde kart yokken akış normal şekilde beklemeye devam eder. FirstOrDefault ile bulunan görünür element koşulu sağladığında outerHTML alınır. Bu noktadan sonra HtmlAgilityPack canlı sayfaya bağlı değildir; o anda elde edilmiş metni işler. Ayrıştırıcıya aynı metni vererek tarayıcı açmadan test yazabilmem, bu ayrımın pratik getirisi.

SelectSingleNode çağrısı burada yalnız karttan oluşan belgede h2 arıyor. Birden fazla kartı aynı belgeye taşırsam belge genelinde //h2 aramak yanlış kartın başlığını seçebilir; arama kapsamını ilgili düğümle sınırlarım. Başlık bulunmadığında mevcut örnek boş metin döndürür. Başlığın zorunlu olduğu bir içe aktarımda bunu başarılı kayıt gibi saklamam.

Entity çözümü ve görünür metin

HTML içinde Kitap & Defter yazıyorsa InnerText, entity ifadesini metin olarak taşıyabilir. DeEntitize bu katmanı çözer, Trim kenardaki boşlukları temizler. Her adımın neyi düzelttiğini bilmek gerekir: bu işlem eksik veriyi tamamlamaz, ekranın gizlediği metni yorumlamaz veya bozuk seçiciyi iyileştirmez. Aynı metni sebepsiz yere tekrar tekrar decode etmek de doğru bir normalizasyon stratejisi değildir.

DOM yeniden çizildiğinde ne olur?

Bir element bulunduğu anda geçerli olsa bile sonraki yeniden çizimde eski referans stale hale gelebilir. Kartı bulma ile HTML alma arasında da bu yarış vardır. Böyle bir sayfada yeniden bulma ve metni alma işini aynı bekleme koşulunda yapmayı değerlendiririm; yalnız belirli geçici hataları yeniden denerim. Bütün exception türlerini yutup boş başlık üretmek, seçici hatasını veri yokluğu gibi gösterebilir.

Implicit ve explicit wait sürelerini birlikte artırmak bekleme hesabını anlaşılmaz hale getirebilir. Bir otomasyon katmanında bekleme yaklaşımını tutarlı tutarım. Driver nesnesini bu yardımcı oluşturmadığı için kapatma sorumluluğu da çağırandadır; tarayıcı süreçlerinin görev bitince açık kalmamasını sağlamak gerekir.

Üç ayrı hata, üç ayrı test

Test sayfasını önce gecikmeli ama doğru kartla çalıştırırım; sonuç Demo kitap olmalı. Sonra kartı hiç eklemeyip zaman aşımını gözlerim. Son denemede kartı görünür bırakıp h2 düğümünü kaldırırım; bu kez bekleme geçer, ayrıştırma boş sonuç verir. Böylece yüklenme koşulu ile veri sözleşmesini gerçekten ayrı sınamış olurum. Ekran görüntüsü ve gerekli DOM parçası tanıya yardımcı olabilir; bunların içine oturum veya kişisel veri dökmek şart değildir.

Selenium bekleme stratejileri; Stale element hatasının anlamı.

✳ Bu yörüngenin sonuna geldin.
Diğer yazıları keşfet →
turgay.Biraz kod, biraz piksel, bolca merak.© 2026 · Dünya’dan sevgilerle ✳