Otomatik UI testinin başında, en büyük zorluk, elemanların görünme gecikmeleri ve ayrıca sayfadaki asenkron eylemleri beklemek zorunda kalınması nedeniyle testlerin istikrarsızlığıydı. Önceleri test uzmanları sıkça katı bekleme süreleri (sleep) kullanıyorlardı ki bu da testlerin uzun sürmesine ve düşük istikrara yol açıyordu.
Sorun, web uygulamalarının giderek daha dinamik hale gelmesidir. Elemanlar asenkron olarak ortaya çıkıyor ve kayboluyor; ön yüz ve arka yüzün eş zamanlı çalışması, testlerin UI durumunu yanlış bekleme nedeniyle hata ile sonuçlanmasına sebep olabilecek durumlar yaratabiliyor. Thread.sleep(1000) gibi statik duraklamalar, sadece test sürelerini artırır ve testin başarılı bir şekilde geçeceğini garanti etmez.
Çözüm, açık ve kapalı beklemeleri (explicit/implicit waits) kullanmaktır ki bu da eylemleri arayüzün mevcut durumu ile daha esnek ve etkili bir şekilde senkronize etmeyi sağlar. Örneğin, Selenium veya benzeri çerçevelerde gerekli elemanların belirli bir koşula göre görünürlüğünü kontrol etmek için WebDriverWait veya benzerleri kullanılır:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located((By.ID, "myElem")))
Ana özellikler:
Neden yalnızca kapalı beklemeleri (implicit waits) kullanmak daha iyidir?
Kapalı beklemeler, sürücünün tamamına uygulanır ve beklenmedik gecikmelere veya açık beklemelerle çelişmelere yol açabilir ki bu da genellikle "TimeoutException" hatalarına sebep olur.
UI testlerinde beklemek için Thread.sleep kullanmalı mıyız?
Thread.sleep kullanımı kesinlikle önerilmez: bu, aşırı gecikmelere ve testlerin istikrarsızlığına neden olur. Daha iyi olanı açık beklemeler ve koşulları kullanmaktır.
Eğer eleman bir animasyon ile beliriyorsa ne yapılmalı?
Sadece elemanın görünmesini beklemekle kalmayıp, aynı zamanda onun durumunu (örneğin, görünürlük veya tıklanabilirlik) beklemelisiniz ve visibility_of_element_located gibi özel koşulları kullanmalısınız.
sleep) kullanmak.Projede açılır pencerenin görünmesini beklemek, Thread.sleep(3000) ile gerçekleştirildi. Bazen pencere daha hızlı, bazen daha yavaş açılıyordu. Scriptler yavaş çalıştı ve yük artışı sırasında testler bazen başarısız oluyordu.
Artılar:
Eksiler:
Mantık yeniden yapılandırıldı — tüm UI ile yapılan işlemler, elemanların görünürlük ve aktivite durumları ile açık beklemelere sarılmış fonksiyonlar içine alındı, her şey hızlandı ve istikrar %98’e yükseldi.
Artılar:
Eksiler: