Based on the suggestions by others, I started looking into WebDriverEventListener and found this blog post very helpful: Seleniumworks: EventFiringWebDriver
After implementing this, I have the following code, which seems to work for my needs. (Still need to work on log4j though)
A class for implementing the WebDriverEventListener -
package CommonMethods.Listeners;
import org.openqa.selenium.*;
import org.openqa.selenium.support.events.AbstractWebDriverEventListener;
public class EventListener extends AbstractWebDriverEventListener {
private By lastFindBy;
private WebElement lastElement;
private String originalValue;
// Prints the URL before Navigating to specific URL "get("http://www.google.com");"
@Override
public void beforeNavigateTo(String url, WebDriver driver) {
System.out.println("Before Navigating To : " + url + ", my url was: "
+ driver.getCurrentUrl());
}
// Prints the current URL after Navigating to specific URL "get("http://www.google.com");"
@Override
public void afterNavigateTo(String url, WebDriver driver) {
System.out.println("After Navigating To: " + url + ", my url is: "
+ driver.getCurrentUrl());
}
// Called before finding Element(s)
@Override
public void beforeFindBy(By by, WebElement element, WebDriver driver) {
lastFindBy = by;
System.out.println("Trying to find element: '" + lastFindBy + "'.");
//System.out.println("Trying to find: " + by.toString()); // This is optional and an alternate way
}
// Called after finding Element(s)
@Override
public void afterFindBy(By by, WebElement element, WebDriver driver) {
lastFindBy = by;
System.out.println("Found element: '" + lastFindBy + "'.");
//System.out.println("Found: " + by.toString() + "'."); // This is optional and an alternate way
}
//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;");
}
}
// Called after clicking an Element
@Override
public void afterClickOn(WebElement element, WebDriver driver) {
System.out.println("Clicked Element with: '" + element + "'");
}
//* CHANGING VALUES | CLEAR() & SENDKEYS()
// Before Changing values
@Override
public void beforeChangeValueOf(WebElement element, WebDriver driver) {
lastElement = element;
originalValue = element.getText();
// What if the element is not visible anymore?
if (originalValue.isEmpty()) {
originalValue = element.getAttribute("value");
}
}
// After Changing values
@Override
public void afterChangeValueOf(WebElement element, WebDriver driver) {
lastElement = element;
String changedValue = "";
try {
changedValue = element.getText();
} catch (StaleElementReferenceException e) {
System.out
.println("Could not log change of element, because of a stale"
+ " element reference exception.");
return;
}
// What if the element is not visible anymore?
if (changedValue.isEmpty()) {
changedValue = element.getAttribute("value");
}
System.out.println("Changing value in element: " + lastElement
+ " from '" + originalValue + "' to '" + changedValue + "'");
}
}
And then my page objects were modified to use this listener -
package Pages.LoginPage;
import CommonMethods.Listeners.EventListener;
import configs.BrowserConfig;
import configs.UserConfigs;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.EventFiringWebDriver;
public class LoginPage extends BrowserConfig {
private static WebDriver driver = BrowserConfig.driver;
private static EventFiringWebDriver event1 = new EventFiringWebDriver(driver);
private static EventListener handle = new EventListener();
//Element Locator Variables
String userNameFieldById = "userId";
String passwordFieldById = "passwordId";
String submitButtonById = "submitId";
String pageHeaderTitleByTagName = "Health Hero Network";
String customerSupportLinkByLinkText = "Customer Support";
String termsOfUserLinkByLinkText = "Terms of Use and Legal Notices";
String mainImageByXpath = "//img[contains(@src,'images/login/header1.jpg";
String invalidLoginErrorByClassName = "hhnErrorRedFontBold";
//Constructor
public LoginPage(WebDriver driver) {
this.driver = driver;
}
//Fill Username
public void FillUsername(String userNameEntry) {
event1.register(handle);
WebElement userNameField = event1.findElement(By.id(userNameFieldById));
userNameField.clear();
userNameField.sendKeys(userNameEntry);
event1.unregister(handle);
}
//Fill Password
public void FillPassword(String passwordEntry) {
event1.register(handle);
WebElement passwordField = event1.findElement(By.id(passwordFieldById));
passwordField.clear();
passwordField.sendKeys(passwordEntry);
event1.unregister(handle);
}
//Click Login Button
public void ClickLoginButton(){
event1.register(handle);
WebElement submitButton = event1.findElement(By.id(submitButtonById));
submitButton.click();
event1.unregister(handle);
}
//Login
public void LogIn(String usernameEntry, String passwordEntry) {
FillUsername(usernameEntry);
FillPassword(passwordEntry);
ClickLoginButton();
}
//Invalid Login
public void InvalidLogin(String usernameEntry, String passwordEntry) {
FillUsername(usernameEntry);
FillPassword(passwordEntry);
ClickLoginButton();
}
//Valid Login
public void validLogin() {
FillUsername(UserConfigs.getValidUsername());
FillPassword(UserConfigs.getValidPassword());
ClickLoginButton();
}
//Verify Invalid Login error
public void VerifyInvalidLogin() {
event1.register(handle);
try {
WebElement loginError = event1.findElement(By.className(invalidLoginErrorByClassName));
if (loginError.isDisplayed()) {
System.out.println("Invalid login credentials provided");
} else {
System.out.println("Test error");
}
} catch (NoSuchElementException e) {
System.out.println("Test error. Invalid login error message not present");
} finally {
event1.unregister(handle);
}
}
//Verify successful logout
public void VerifyLogout() {
try {
FillUsername("");
System.out.println("Logout SUCCESSFUL");
}catch (NoSuchElementException e){
System.out.println("Logout FAILED");
}
}
}