Selenium WebDriver Sık Karşılaşılan Hatalar
Bu yazımda Selenium Web Driver’da sıklıkla karşılaştığımız exceptionlara yer vermek istiyorum. Bir web sayfası üzerinde otomasyon gerçekleştirdiğimiz için çoğu zaman sayfada elementi bulamama, bir form içinde açılan bir elementin görünmemesi, yetersiz bekleme süresi gibi sebeplerle exception oluşabilmektedir.
Selenium’da en sık karşılaşılan hatalar:
ElementNotVisibleException: Selenium Web sayfasında görünür olmayan bir elementi bulmaya çalıştığında karşılaşılan bir exception türüdür.
NoAlertPresentException: Olmayan bir uyarı/pop-up şeklindeki diyalog üzerinde işlem yapılmaya çalışıldığında karşılaşılır.
NoSuchWindowException: Yeni bir pencereye geçmeye çalışıldığında alınan exception türüdür.
NoSuchElementException: Sayfada bulunmayan bir elemente erişim sağlanmaya çalışıldığında karşılaşılır.
WebDriverException: Herhangi bir kod bloğu Selenium Web Driver’ı çalıştıramadığında oluşan exception türüdür.
Bu exception’ların sebeplerinden ve bu exception’ları almamak için uygulayabileceğimiz methotlardan bahsetmek istiyorum.
1) org.openqa.selenium.ElementNotVisibleException
ElementNotVisibleException sınıfı ElementNotInteractableException sınıfının bir alt sınıfıdır. Bu exception, WebDriver etkileşime giremeyen görünmez bir web elementi üzerinde bir işlem gerçekleştirmeye çalıştığında atılır. Yani web elementi gizli bir durumdadır. Örneğin, bir sayfa içerisindeki bir butona tam yüklenmeden tıklatmaya çalışılan durumlar. Bu noktada ElementNotVisibleException almamak amacıyla çözüm yollarından biri olarak ‘wait’ komutunu kullanabiliriz.
try {
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.visibilityOfElementLocated(By.id(”login”));
try {
driver.findElement(By.id(“login”)).click();
} catch (WebDriverException e) {
System.out.println(“Exceptional case”);
}
} catch (TimeOutException e)
System.out.println(“WebDriver couldn’t find this element visible”);
}
Yukarıdaki kod bloğu örneğinde wait komutu sayesinde ‘login’ id değerine sahip bir giriş butonunun yüklenmesine zaman vermek adına 10 saniyelik bir bekleme süresi verilmiştir.
2) org.openqa.selenium.NoAlertPresentException
NoAlertPresentException sınıfı NotFoundException sınıfının bir alt sınıfıdır. Bir alert üzerinde işlem yapılmaya çalışıldığında ilgili alert sayfada oluşmadıysa bu exception oluşur. Örnek verecek olursak bir kaydı silmek istideğinizde ‘Bu kaydı silmek istediğinize emin misiniz?’ uyarısı çıktığını düşünelim, bu uyarıda bulunan ‘evet’ butonuna basmak istiyorsak ve bu exception’ı alıyorsak öncelikle silme butonuna tıkladığından emin olmamız gerekiyor.
3) org.openqa.selenium.NoSuchWindowException
Selenium NoSuchWindowException aynı zamanda NoSuchFrameException’a benzer. Bazen uygulamalarda herhangi bir bağlantıya veya düğmeye tıkladığınızda açılan alt pencereler (yani ayrı pencereler) olacaktır. Normalde, alt pencereleri otomatikleştirmek istiyorsanız, o pencereye geçmeniz gerekir, o zaman yalnızca o pencerede bulunan öğelerle etkileşime girebilirsiniz. Bunun üstesinden gelmek için, “driver.getWindowHandles ()” adı verilen webdriver yöntemlerinden birini kullanarak açılan pencereleri işlememiz gerekir. Bu bilgilere sahip olduğunuzda, pencereyi otomatikleştirmek veya pencereyle etkileşim kurmak için ilgili pencereye geçebilirsiniz.
String windowID = driver.getWindowHandle();
driver.switchTo().window(windowID);
Yukarıdaki kod bloğunu kullanarak geçmek istediğimiz pencerenin id değeri ile pencereler arası geçiş yaparak işlemlere devam edebiliriz.
4) org.openqa.selenium.NoSuchElementException
ElementNotVisibleException ile benzer şekilde bu exception’da da konumlandırıcı ile tanımlanmış elementin sayfada bulunamaması durumunda bu hata oluşur. Bu sorunu için kullanabileceğimiz çeşitli çözümler vardır.
Sayfanın tamamen yüklenmesini beklemek.
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
Sayfanın aşağısında yada yukarısında kalan elementler için scroll kullanmak.
public void scrollDown(){
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(“window.scrollBy(0,250)”, “”);
}
Element görünür olana kadar beklemek.
public WebElement waitUntilElementVisible(WebDriver driver, WebElement element, int delay) {
try{
WebDriverWait wait = new WebDriverWait(driver, delay);
return wait.until(ExpectedConditions.visibilityOf(element));
}
catch (NoSuchElementException e){
throw new RuntimeException(“Web element not visible within given time” + element +” Time “+ delay);
}
}
Verilen belirli bir süre kadar bekletmek.
Thread.sleep(2000);
2 saniye kadar bekleme süresi.
5) org.openqa.selenium.WebDriverException
Web driver’ın başlamasına engel olacak bir sorun olduğunda bu exception oluşur. Kodda bulunan bağımlılıklar, etkileşimler kontrol edilmelidir.