Selenium WebDriver’ınıza Kulak Verin | Event Firing WebDriver

Emirhan Gül
4 min readApr 1, 2019

Selamlar, sizlere Event Firing WebDriver’ın ne olduğundan ve neden ihtiyaç duyabileceğinizden bahsedeceğim.

https://i.stack.imgur.com/mV1Jv.png

EFWD(Event Firing WebDriver) teknik olarak, Selenium’un bize sağlamış olduğu bir class.

Ne iş yaptığına gelirsek; kullandığımız WebDriver’ı(Chrome, Firefox, IE vb.) çevreliyor ve bir aksiyon alınmasının öncesinde ve sonrasında event’ler fırlatıyor. Daha sonra bizler, implement edeceğimiz WebDriverEventListener interface’i sayesinde bu fırlatılan eventleri yakalayıp, bunlarla istediğimiz işlemleri yaptırabiliyoruz. Dolayısıyla, scriptlerimiz koşarken WebDriver’ımızı sürekli dinlemiş oluyoruz. Bunun(Listener’ların), genel kullanım amacının da etkili loglar ve raporlar yaratmak olduğunu görüyoruz. Ben bu iki amacın yanı sıra, JavascriptExecutor kütüphanesini kullanarak,

public void waitDomReady(EventFiringWebDriver efdriver) {
ExpectedCondition<Boolean> pageLoadCondition = new
ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver efdriver) {
return ((JavascriptExecutor)efdriver).executeScript("return document.readyState").equals("complete");
}
};
WebDriverWait wait = new WebDriverWait(efdriver, 30);
wait.until(pageLoadCondition);
}

yukarıdaki gibi bir metot sayesinde DOM’un tamamen yüklenmiş olduğunu her bir listener metodu içinde kontrol ediyorum. Dolayısıyla nasıl kullanacağınız tamamen yaratıcılığınızda veya ihtiyacınızda saklı. 👀

Başlamadan önce göreceğimiz iki yeni kavramın tanımlarını yapalım.

WebDriverEventListener: Bu interface, Selenium’un bize sağladığı metodları implement etmemize yarıyor.

Senaryolarımızı koşmaya başladığımızda, WebDriver’ımız SendKeys, Click, Navigate vs. aktivitelerini yapmaya başlıyor ve biz de bu aktivitelerin izini tutmak için bu interface’i kullanıyoruz.

EventFiringWebDriver: Bu class ise kendisini WebDriver’ımıza bind ettiğimizde(geleceğiz o konuya) aslında WebDriver aktivilerini artık EFWD üzerinden yapmaya başlıyoruz.

Böylece, “before text is changed, after text is changed, before url is loaded” vs. olaylarını dinleyebiliyor ve isteğe bağlı ekstra işlemler yaptırabiliyorsunuz.

Şimdi yapıyı ufaktan örmeye başlayalım 👨🏻‍💻

1. Adım

Öncelikle WebDriverEventListener interface’imizi implement edeceğimiz bir sınıf oluşturmamız gerekiyor. Ben buna aşağıdaki görselde WebDriverListeners sınıfı adını verdim. Implementasyonu tamamladıktan sonra, mouse ile interface’in üzerine gelip “Add unimplemented methods” seçeneğini seçip metodları override ederek sınıfınıza dahil edebilirsiniz. (Aşağıda benim kullandığım metodları yazı olarak paylaşayacağım.)

Implementation of WebDriverEventListener interface

2. Adım

Sonrasında, aşağıdaki görselde de belirttiğim üzere; WebDriver’mızı yarattıktan sonra, oluşturacağınız EventFiringWebDriver instance’ının yapıcı metoduna oluşturduğumuz WebDriver’ımızı parametre olarak geçiyoruz.

Sonra, oluşturduğumuz WebDriverListeners class’ından da bir instance oluşturup, bunu EFWD’a register ediyoruz.

Ve artık EFWD’yi WebDriver’ımıza başarılı bir şekilde bind etmiş olduk, dolayısıyla bundan sonraki bütün selenium olaylarını bu EFWebDriver üzerinden yapıyoruz ki listener metodlarımızı kullanabilelim.

Registration of the listeners

DONE! 💪🏻

Şimdi geriye kalan tek şey, listener’ları nasıl kullanmak istediğinize karar vermek 🤓

Ayrıca, kullanmak isteyeceğinizi bildiğim bir yönteme de değinmek istiyorum; aşağıdaki görselde de açıkladığım üzere, senaryolarınız koşarken alınan ekran görüntülerinde veya video kayıtlarında tıklanılacak elementi daha iyi ayırt etmek için aşağıdaki gibi bir Javascript kullanılarak, aksiyon alınacak elementin çerçevesi 3 piksel kalınlaştırılıp rengi siyah yapılıyor ve ortaya bir aşağısındaki gibi bir görsel çıkıyor.

Benim implement edilen metodları kullanım şeklim aşağıdaki gibidir:

    /*
* FINDING ELEMENTS | FINDELEMENT() & FINDELEMENTS()
*/
// Called before finding Element(s)
@Override
public void beforeFindBy(By by, WebElement element, WebDriver driver) {
System.out.println("Trying to find: " + by.toString());
waitAllRequests();
}
// Called after finding Element(s)
@Override
public void afterFindBy(By by, WebElement element, WebDriver driver) {
System.out.println("Found: " + by.toString() + "'.");
waitAllRequests();
}
/*
* CLICK | CLICK()
*/
// Called before clicking an Element
@Override
public void beforeClickOn(WebElement element, WebDriver driver) {
System.out.println("Trying to click: '" + element + "'");
// Highlight Elements before clicking
for (int i = 0; i < 1; i++) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(
"arguments[0].setAttribute('style', arguments[1]);",
element, "color: black; border: 3px solid black;");
}
waitAllRequests();
}
// Called after clicking an Element
@Override
public void afterClickOn(WebElement element, WebDriver driver) {
System.out.println("Clicked Element with: '" + element + "'");
waitAllRequests();
}
/*
* URL NAVIGATION | NAVIGATE() & GET()
*/
// Prints the URL before Navigating to specific URL
@Override
public void beforeNavigateTo(String url, WebDriver driver) {
waitAllRequests();
}
@Override
public void afterNavigateTo(String url, WebDriver driver) {
waitAllRequests();
}
@Override
public void beforeNavigateBack(WebDriver driver) {
waitAllRequests();
}
@Override
public void afterNavigateBack(WebDriver driver) {
waitAllRequests();
}
/*
* ON EXCEPTION | SCREENSHOT, THROWING ERROR
*/
// Takes screenshot on any Exception thrown during test execution
@Override
public void onException(Throwable throwable, WebDriver webdriver) {
System.out.println("Caught Exception");
File scrFile = ((TakesScreenshot) webdriver)
.getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(scrFile, new File(
"/Users/sahabt/Documents/MavenDev/gaugebasics/screenshots/"+System.currentTimeMillis()+".png"));
} catch (Exception e) {
System.out.println("Unable to Save");
}
}

Umarım sizler için faydalı olmuştur! Bir sonraki yazımda görüşmek üzere, mutlu testler 🤘🏼

Referanslar:

https://www.seleniumeasy.com/selenium-tutorials/webdriver-event-listener-example
https://www.softwaretestingmaterial.com/webdriver-event-listeners/ https://www.vskills.in/certification/tutorial/selenium/event-firing/ https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/events/EventFiringWebDriver.html http://www.testingdocs.com/eventfiringwebdriver/

--

--