Selenium Web Driver: Wait Komutu
Daha önceki http://gizemgulec.com/2020/09/selenium-webdriver-sik-karsilasilan-hatalar/ yazımda bahsettiğim exception’ların çoğunun çözümünde ‘wait’ komutu yer almaktadır çünkü bir web sayfasında çalışırken karşılaşılan en büyük sorun elementin farklı sebeplerle bulunamamasıdır. Bu noktada ‘wait’ komutunun kullanım amacına göre farklı türleri bulunmaktadır. Bunlar;
Implicit Wait
Explicit Wait
Fluent Wait
1)Implicit Wait
Selenium’da Implicit Wait, web sürücüsüne “No Such Element Exception” oluşturmadan önce belirli bir süre beklemesini söylemek için kullanılır. Varsayılan ayar 0’dır. Süreyi belirledikten sonra, web sürücüsü bir exception atmadan önce bu süreyi bekleyecektir.
Syntax:
driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
Implicit wait 2 parametre alır; ilkinde ne kadar bekleyeceğinin değeri verilirken, ikinci parametrede zamanın ne cinsinden olacağı verilir(Örneğin; SECONDS, MINUTES, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS).
driver.manage().timeouts().implicitlyWait(15, TimeUnit.MINUTES);
Böyle bir wait komutu eklediğimizde, 15 dakika bekleme süresi olacaktır.
2)Explicit Wait
Selenium’da Explicit Wait, Web Sürücüsüne belirli koşulları (Expected Condition) veya “ElementNotVisibleException” exception’ı atmadan önce aşılan maksimum süreyi beklemesini söylemek için kullanılır. Akıllı bir bekleme türüdür ancak yalnızca belirli öğeler(elementler) için uygulanabilir. Dinamik olarak yüklenen Ajax öğelerini beklerken implicit wait’ten daha iyi seçenekler sunar.
Explicit Wait kullandığımızda, “ExpectedConditions” tanımlamalıyız veya Fluent Wait kullanarak durumu ne sıklıkla kontrol etmek istediğimizi yapılandırmalıyız.
Syntax:
wait.until(ExpectedConditions.typeofExpectedCondition(By.locator(“valueoflocator”));
Syntaxı bir örnek ile açıklayacak olursak;
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(“abc”));
Bu örnekte id değeri “abc” olan element sayfada görünür olana kadar bekleme süresi olacaktır.
Explicit Wait için kullanılabilen çok fazla sayıda Expected Condition çeşitleri bulunmaktadır. Bunlar;
alertIsPresent()
elementSelectionStateToBe()
elementToBeClickable()
elementToBeSelected()
frameToBeAvaliableAndSwitchToIt()
invisibilityOfTheElementLocated()
invisibilityOfElementWithText()
presenceOfAllElementsLocatedBy()
presenceOfElementLocated()
textToBePresentInElement()
textToBePresentInElementLocated()
textToBePresentInElementValue()
titleIs()
titleContains()
visibilityOf()
visibilityOfAllElements()
visibilityOfAllElementsLocatedBy()
visibilityOfElementLocated()
3)Fluent Wait
Selenium’da Fluent Wait, web sürücüsünün bir koşulu beklemesi için maksimum süreyi ve “ElementNotVisibleException” exception’ını atmadan önce koşulu kontrol etmek istediğimiz sıklığı tanımlamak için kullanılır. Nesne bulunana veya zaman aşımı gerçekleşene kadar düzenli aralıklarla web elementini kontrol eder.
Bir elemanın farklı zaman aralıklarında yüklendiği bir senaryo düşünelim. Öğe 10 saniye, 20 saniye veya daha uzun bir süre içinde yüklenebilir. Bu durumda 20 saniyelik Explicit Wait tanımlarsak bir exception atmadan önce belirtilen süreye kadar bekleyecektir. Bu tür senaryolarda, Fluent Wait öğeyi bulana kadar veya son zamanlayıcı bitene kadar farklı frekansta bulmaya çalışacağından, kullanımı ideal olacaktır.
Syntax:
Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);
Değer vererek bir örnek oluşturacak olursak;
Wait <WebDriver> wait = new FluentWait <WebDriver> (driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
Bu örnekte maksimum bekleme süresi 30 saniyedir ve 30 saniye olana kadar 5 saniyelik aralıklarla elementin görünürlüğü kontrol edilecektir.
Özetle;
Implicit, Explicit ve Fluent Wait seleniumda kullanılan farklı beklemelerdir. Bu beklemelerin kullanımı tamamen farklı zaman aralıklarında yüklenen elemanlara dayanmaktadır. Uygulamamızı test ederken Thread.Sleep() kullanılması her zaman tavsiye edilmediği için bu bekleme çeşitlerine başvurulur.