How to use JavascriptExecutor in Selenium Webdriver using java

JavaScriptExecutor : JavaScriptExecutor is an interface which helps to execute Javascript through selenium driver. It has two 'executescript' & 'executeAsyncScript' methods to run JavaScript in the context of the currently selected frame or window. Javascript plays very important role when we are not able to perform complex operation on the element on the webpage. We can use all HTML DOM methods and properties when using javascript.
In simple words  “Javascript can be executed within the browser with the help of JavaScript Executor.”

Package:
import org.openqa.selenium.JavascriptExecutor;

Methods
Name: executeAsyncScript(java.lang.String script, java.lang.Object... args)
Description: Execute an asynchronous piece of JavaScript in the context of the currently selected frame or window.

Name: executeScript(java.lang.String script, java.lang.Object... args)
Description: Executes JavaScript in the context of the currently selected frame or window.

Syntax:
JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript(Script,Arguments);
        script - The JavaScript to execute
        Arguments - The arguments to the script.(Optional)

The list of Scenario’s below you can handle

Alert Pop window
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
Js.executeScript("alert('JavascriptExecutor');");

Click a button in Selenium WebDriver using JavaScript
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].click();", element);

Refresh browser window using Javascript
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("history.go(0)");

Get innertext of the entire web page in Selenium Webdriver
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
String sText =  js.executeScript("return document.documentElement.innerText;").toString();

Get Web page title
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
String sText =  js.executeScript("return document.title;").toString();

Handle Scroll on Web page
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
//Vertical scroll - down by 50  pixels
js.executeScript("window.scrollBy(0,50)");

Click on a SubMenu which is only visible on mouse hover on Menu
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
//Hover on Automation Menu on the MenuBar
js.executeScript("$('ul.menus.menu-secondary.sf-js-enabled.sub-menu li').hover()");

Navigate to one page to other page
Code:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.location = 'https://www.google.com/'");


Demo Source Code


 import java.util.concurrent.TimeUnit;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.JavascriptExecutor;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 public class JavaScriptExecuterExample {  
 public static void main(String[] args) throws InterruptedException {  
 //Create FireFox object   
 WebDriver driver = new FirefoxDriver();  
 //Launching the browser application  
 driver.get("http://hiromia.blogspot.com/");  
 //10 second waittig time  
 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  
 //Maximize window  
 driver.manage().window().maximize();  
 
//Creating the Javascriptexecutor interface object by Type casting  
 JavascriptExecutor js = (JavascriptExecutor) driver;
  
 //Click on Selenium Webdriver level button  
 js.executeScript("arguments[0].click();", driver.findElement(By.xpath(".//*[@id='Label1']/div/ul/li[3]/a")));  

 //Fetching the Domain Name   
 System.out.println("Domain = " + js.executeScript("return document.domain;").toString());  
 //Fetching the URL     
 System.out.println("URL = " + js.executeScript("return document.URL;").toString());  
 //Fetching the Title  
 System.out.println("Title = " + js.executeScript("return document.title;").toString());  
 //refresh browser window  
 js.executeScript("history.go(0)");  
 Thread.sleep(3000);  

 //Vertical scroll - down by 100 pixels  
 js.executeScript("window.scrollBy(0,1000)");  
 // Navigate to google  
 js.executeScript("window.location = 'https://www.google.com/'");  
 Thread.sleep(5000);  

 //close Firefox  
 driver.quit();  
   }  
 }  







How to handle DOM in Selenium Webdriver using java.


Document Object Model(DOM): The Document Object Model (DOM) is an application programming interface (API). It defines the logical structure of documents and the way Javascript sees its containing pages' data. It is an object that includes how the HTML/XHTML/XML is formatted, as well as the browser state.
A DOM element is something like a DIV, HTML, BODY element on a page. You can add classes to all of these using CSS, or interact with them using JS.The DOM strategy works by locating elements that matches the JavaScript expression referring to an element in the DOM of the page.



HTML CODE

There are Three basic ways to locate an element through DOM
getElementById
The value of the ID attribute of the element to be accessed. This value should always be enclosed in a pair of parentheses ('').The most efficient way and preferred way to locate an element on a web page is By ID. ID will be the unique on web page which can be easily identified
Syntax: document.getElementById('id')
id=id of the element
Example:
WebElement email = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.getElementById('email');");
email.sendKeys("abcdef@gmail.com");

getElementsByName
Locates an element using the Class attribute.It collects an array of elements that have the name that you specified. You access the individual elements using an index which starts at 0.
Syntax: document.getElementsByName("name")[index]
name = name of the element as defined by its 'name' attribute
index = an integer that indicates which element within getElementsByName's array will be used.
Example:
WebElement last = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.getElementsByName('name1')[0];");
last.sendKeys("aaaaaa");

Forms
There are four way locate input form. The combination of form locators is given below.
Syntax 1: document.forms[index of the form].elements[index of the element]
Syntax 2: document.forms[index of the form].elements['name of the element']
Syntax 3: document.forms['name of the form'].elements[index of the element]
Syntax 4: document.forms['name of the form'].elements['name of the element']
index of the form = the index number (starting at 0) of the form with respect to the whole page.
index of the element = the index number (starting at 0) of the element with respect to the whole form that contains it.
name of the form =The name of the form as defined by its 'name' attribute and it applies only to elements within a named form.
name of the element: The name of element and defined by 'name' attribute.
Example:
WebElement pass = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.forms['domf2'].elements['password'];");
pass.sendKeys("aaaaaa");

WebElement btn = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.forms[1].elements['butt'];");
btn.click();

Working Demo:-
 import java.util.concurrent.TimeUnit;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.openqa.selenium.JavascriptExecutor;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.NoSuchElementException;  
 public class DOMhandlerProgram {  
 public static void main(String[] args) throws InterruptedException {  
     try {  
 WebDriver driver = new FirefoxDriver();  
 //Maximize window  
 driver.manage().window().maximize();  
 //Launching the browser page  
 driver.get("file:///C:/Users/Hiro%20Mia/Desktop/Blog%20content/DOM%20locator.html");  
 //Adding wait  
 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  
 
//Creating the Javascriptexecutor interface object by Type casting  
 JavascriptExecutor js = (JavascriptExecutor) driver;  
 //Send email address   
 WebElement email = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.getElementById('email');");  
 email.sendKeys("abcdef@gmail.com");  
 Thread.sleep(3000);  

 //send pass  
 WebElement pass = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.forms['domf2'].elements['password'];");  
 pass.sendKeys("aaaaaa");  
 Thread.sleep(3000);  

 //Click on button  
 WebElement btn = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.forms[1].elements['butt'];");  
 btn.click();  
 WebElement last = (WebElement) ((JavascriptExecutor) driver).executeScript("return document.getElementsByName('name1')[0];");  
 last.sendKeys("aaaaaa");  
 Thread.sleep(3000);  

 //close firefox browser   
 driver.quit();  
     } catch (NoSuchElementException e) {  
     }  
   }  
 }  

How to read data from Properties file in Selenium Webdriver using Java.

'.properties' files have configuration data, database config or project settings etc to maintain project in Java. Each parameter in properties file are stored as a pair of strings, in key and value format and key is case sensitive, where each key is on one line. You can easily read properties from some file using object of type Properties.

In Selenium .properties files are mainly used to store GUI locators / elements, and also Global fields like database configuration details.

The sample properties file that was used for the java program

Here is a example program which demonstrate to read the data from .properties file using Java.

 import java.io.File;  
 import java.io.FileInputStream;  
 import java.io.FileNotFoundException;  
 import java.io.IOException;  
 import java.util.Properties;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.NoSuchElementException;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 public class Readdatafrompro {  
 public static void main(String[] args) {  
 try {  
 // Create FileInputStream Object  
 FileInputStream fileInput = new FileInputStream(new File("data.properties"));  
 // Create Properties object  
 Properties prop = new Properties();  
 //load properties file  
 prop.load(fileInput);  
 //// WebDriver reference but Firefox object  
 WebDriver driver = new FirefoxDriver();  
 //Maximize browser window    
 driver.manage().window().maximize();  

 //Visit to Facebook   
 driver.get(prop.getProperty("URL"));  
 //Read Username from Properties and send to facebook Username text field  
 driver.findElement(By.id("email")).sendKeys(prop.getProperty("Username"));  
 //Read Password from Properties and send to facebook password text field   
 driver.findElement(By.id("pass")).sendKeys(prop.getProperty("Password"));  
 driver.findElement(By.id("loginbutton")).click();  

 if (driver.getPageSource().contains("Please re-enter your password")) {  
   System.out.println("--- Pass ---");  
 } else {  
   System.out.println("!!!! Fail !!!");  
 }  

 //Print Properties Values  
 System.out.println("URL    =: " + prop.getProperty("URL"));  
 System.out.println("User name =: " + prop.getProperty("Username"));  
 System.out.println("Password =: " + prop.getProperty("Password"));  

 // Browser close    
 driver.close();
   
     } catch (FileNotFoundException e) {  
 e.printStackTrace();  
     } catch (IOException e) {  
 e.printStackTrace();  
     } catch (NoSuchElementException e) {  
 e.printStackTrace();  
     }  
   }  
 }  




How to create custom Firefox profile and handle Firefox profile in Selenium Webdriver using Java.

A collection of browser bookmarks, settings, extensions, passwords, history and user preferences call profile, which is stored in a separate location from the browser program files; in short, all of your personal settings.You can have multiple Firefox profiles, each containing a separate set of user information. The Profile Manager allows you to create, remove, rename, and switch profiles. The default Firefox profile is not very automation friendly.  When you want to run automation reliably on a Firefox browser it is advisable to make a separate profile. Automation profile should be light to load and have special proxy and other settings to run good test.

How to create custom Firefox profile

1) At the top of the Firefox window, click on the File menu and then select Exit.

2) Press ‘Windows Key + R’  or click on the Windows Start Menu (bottom left button) and then select Run.

3) In the Run dialog box, type in: ‘firefox.exe -p' and then Click OK.

Note: If the Profile Manager window does not appear, it may be opened in the background. It needs to be closed properly, you may use Ctrl+Alt+Del program to kill it. If it still does not open then you may need to specify the full path of the Firefox program, enclosed in quotes; for example:
On 32-bit Windows: "C:Program FilesMozilla Firefoxfirefox.exe" -p
On 64-bit Windows: "C:Program Files (x86)Mozilla Firefoxfirefox.exe" -p

4) The Choose User Profile window will look like this.

5) Click the ‘Create Profile…’ button on the ‘Firefox – Choose User Profile’ window that comes up.

6) Click ‘Next >’ in the ‘Create Profile Wizard’ window that comes up.

7) Type in a new name ‘profileToolsQA’ in the ‘Enter new profile name’ box and click ‘Finish’.

8) ‘Choose User Profile’ window will display the newly created profile in the list.

9) Click on the ‘Start Firefox’ box. Firefox will start with the new profile.

Note: You will notice that the new Firefox window will not show any of your Bookmarks and Favorite icons.
Note: The last selected profile will then start automatically when you next start Firefox and you will need to start the Profile Manager again to switch profiles.

How to handle new Firefox profile in Selenium Webdriver

Two way We can call custom Firefox profile.

One Way:
ProfilesIni profile = new ProfilesIni();
// Create object for FirefoxProfile
FirefoxProfile myprofile = profile.getProfile("profileToolsQA");
// Initialize Firefox driver     
WebDriver driver = new FirefoxDriver(myprofile)
Example one:
import java.io.File;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;

public class HandlecustomProfile1 {
public static void main(String[] args) {

ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("profileToolsQA");
  
// Initialize Firefox driver    
WebDriver driver = new FirefoxDriver(myprofile);

//Maximize browser window       
driver.manage().window().maximize();
//Go to URL      
driver.get("http://www.google.com");
//Set  timeout      
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

//close firefox browser  
driver.close();
    }

}
Other way:
// Create object for FirefoxProfile
FirefoxProfile myprofile = new FirefoxProfile(new File("C:\\Users\\Hiro Mia\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\giyi7yui.profileToolsQA"));
// Initialize Firefox driver     
WebDriver driver = new FirefoxDriver(myprofile)
Example Two
import java.io.File;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;

public class HandlecustomProfile2 {
public static void main(String[] args) {

// Create object for FirefoxProfile
FirefoxProfile myprofile = new FirefoxProfile(new File("C:\\Users\\Hiro Mia\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\giyi7yui.profileToolsQA"));
  
// Initialize Firefox driver    
WebDriver driver = new FirefoxDriver(myprofile);

//Maximize browser window       
driver.manage().window().maximize();
//Go to URL      
driver.get("http://www.yahoo.com");
//Set  timeout      
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

//close firefox browser  
driver.close();
    }

}

How to convert color RGB to HEX and HEX to RGB in Selenium Webdriver using Java.

We read font color by getCssValue("color") and it is RGB Format. In Software Requirement Specification (SRS) Color code is Hex format. We need to convert RGB to HEX format or HEX to RGB format for automation. I am going to describe how to convert RGB to HEX color and HEX to RGB color.


 import java.awt.Color;  
 import java.util.concurrent.TimeUnit;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.NoSuchElementException;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 public class Convertrgbtohex {  
 public static void main(String[] a) {  
 try {  
 // Initialize Firefox driver  
 WebDriver driver = new FirefoxDriver();  
 //Maximize browser window   
 driver.manage().window().maximize();  
 //Go to URL  
 driver.get("http://www.yahoo.com/");  
 //Set selenium webdriver get timeout  
 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
  
 String font_name, font_size, font_color;  
 // Get font family name  
 font_name = driver.findElement(By.partialLinkText("My Yahoo")).getCssValue("font-family").trim();  
 // Get font size  
 font_size = driver.findElement(By.partialLinkText("My Yahoo")).getCssValue("font-size").trim();  
 // Get font color RGB code  
 font_color = driver.findElement(By.partialLinkText("My Yahoo")).getCssValue("color").trim();  

 //Print font-family, font-size and font-color  
 System.out.println("font-family : " + font_name);  
 System.out.println("font-size : " + font_size);  
 System.out.println("font-color : " + font_color);  

 // Convert rgb to hex   
 String color1[];  
 color1 = font_color.replace("rgba(", "").split(",");       
 String hex = String.format("#%02x%02x%02x", Integer.parseInt(color1[0].trim()), Integer.parseInt(color1[1].trim()), Integer.parseInt(color1[2].trim()));  
 System.out.println("Convert rgb to hex : " + hex.toUpperCase());  

 //Convert hex to rgb and Print rgb code  
 System.out.println("Convert hex to rgb : rgb (" + Color.decode(hex).getRed() + ", " + Color.decode(hex).getGreen() + ", " + Color.decode(hex).getRed() + ")");  

 // Browser close   
 driver.close();  

 } catch (NoSuchElementException e) {  
 e.printStackTrace();  
     }  
   }  
 }  

How to extend Listener in Selenium WebDriver using java.


Webdriver Listeners: Event listener in WebDriver helps to track events those take place in WebDriver during script execution. It allows do something before or after an action. For example, if you want to wait for an ajax element before every click, or log that action into logger, it is possible to do with the event listener.
AbstractWebDriverEventListener: is a Abstract class
EventFiringWebDriver: This is an class that actually fire Webdriver event

Create a class called AbstractHandle to override events just by Extending AbstractWebDriverEventListener abstract class where AbstractWebDriverEventListener is a abstract which have near about 15 methods that we can override to see after and before tracking of each events that we trigger through our scripts. Creating one object of EventFiringWebDriver just by calling one of its constructor which takes instance of WebDriver.

 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.support.events.AbstractWebDriverEventListener;  
 public class AbstractHandle extends AbstractWebDriverEventListener {  
 //Called after WebElement.clear(), WebElement.sendKeys(...).  
 @Override  
 public void afterChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after WebElement.click()  
 @Override  
 public void afterClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void afterFindBy(By by, WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after navigate().back().  
 @Override  
 public void afterNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after navigate().forward().  
 @Override  
 public void afterNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after get(String url) respectively navigate().to(String url).  
 @Override  
 public void afterNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after RemoteWebDriver.executeScript(String, Object[]).  
 @Override  
 public void afterScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before WebElement.clear(), WebElement.sendKeys(...)  
 @Override  
 public void beforeChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before WebElement.click().    
 @Override  
 public void beforeClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void beforeFindBy(By by, WebElement element, WebDriver driver) {  
 }  
 //Called before navigate().back().  
 @Override  
 public void beforeNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before navigate().forward().  
 @Override  
 public void beforeNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before get(String url) respectively navigate().to(String url).  
 @Override  
 public void beforeNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before RemoteWebDriver.executeScript(String, Object[])  
 @Override  
 public void beforeScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 // Called whenever an exception would be thrown.  
 @Override  
 public void onException(Throwable throwable, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 }  



Create a new Class that implement WebDriverEventListener methods
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.support.events.AbstractWebDriverEventListener;  
 public class AbstractHandle extends AbstractWebDriverEventListenerr {  
 //Called after WebElement.clear(), WebElement.sendKeys(...).  
 @Override  
 public void afterChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("inside method afterChangeValueOf on =: " + element.toString());  
 }  
 //Called after WebElement.click()  
 @Override  
 public void afterClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
  System.out.println("inside method afterClickOn on =: " + element.toString());  
 }  
 //Called after WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void afterFindBy(By by, WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
  System.out.println("Find happened on =: " + by.toString());  
 }  
 //Called after navigate().back().  
 @Override  
 public void afterNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the after navigateback to =: " + driver.getCurrentUrl());  
 }  
 //Called after navigate().forward().  
 @Override  
 public void afterNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the afterNavigateForward to =: " + driver.getCurrentUrl());  
 }  
 //Called after get(String url) respectively navigate().to(String url).  
 @Override  
 public void afterNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the afterNavigateTo to =: " + url);  
 }  
 //Called after RemoteWebDriver.executeScript(String, Object[]).  
 @Override  
 public void afterScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the afterScript to, Script is =: " + script);  
 }  
 //Called before WebElement.clear(), WebElement.sendKeys(...)  
 @Override  
 public void beforeChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the beforeChangeValueOf method =; "+element.toString());  
 }  
 //Called before WebElement.click().    
 @Override  
 public void beforeClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("About to click on the " + element.toString());  
 }  
 //Called before WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void beforeFindBy(By by, WebElement element, WebDriver driver) {  
   System.out.println("before FindBY =: "+by.toString());  
 }  
 //Called before navigate().back().  
 @Override  
 public void beforeNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeNavigateBack =: " + driver.getCurrentUrl());  
 }  
 //Called before navigate().forward().  
 @Override  
 public void beforeNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeNavigateForward =: " + driver.getCurrentUrl());  
 }  
 //Called before get(String url) respectively navigate().to(String url).  
 @Override  
 public void beforeNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeNavigateTo =: " + url);  
 }  
 //Called before RemoteWebDriver.executeScript(String, Object[])  
 @Override  
 public void beforeScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeScript =: " + script);  
 }  
 // Called whenever an exception would be thrown.  
 @Override  
 public void onException(Throwable throwable, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Exception occured at =: " + throwable.getMessage());  
 }  
 }  


Create Event Throwing WebDriver
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.openqa.selenium.support.events.EventFiringWebDriver;  

 public class AbstractListernerDemo {  
 public static void main(String[] args) {  
 //Initializing instance of Webdriver  
 WebDriver wDriver = new FirefoxDriver();  

 //Initializing instance of EventFiringWebDriver  
 EventFiringWebDriver driver = new EventFiringWebDriver(wDriver);  
 //Now create object of EventListerHandler to register it with EventFiringWebDriver   
 AbstractHandle handle = new AbstractHandle ();  
 System.out.println("===============================");  
 //register the object of this event listener class with EventFiringWebDriver   
 driver.register(handle); 
 
 driver.get("http://www.facebook.com");  
 driver.findElement(By.id("email")).sendKeys("abcde@gmail.com");  
 driver.findElement(By.id("pass")).sendKeys("aaaaaaaa");  
 driver.findElement(By.id("loginbutton")).click();  
 driver.get("http://www.gmail.com");  
 driver.get("http://www.outlook.com");  
 driver.navigate().back();  
 driver.navigate().forward();  
 driver.quit();  
 driver.unregister(handle);  
 System.out.println("===============================");  
   }  
 }  

Output:
>



How to implement Event Listener Interface in Selenium WebDriver using java.

Webdriver Listeners: Event listener in WebDriver helps to track events those take place in WebDriver during script execution. It allows do something before or after an action. For example, if you want to wait for an ajax element before every click, or log that action into logger, it is possible to do with the event listener.
WebDriverEventListener: is a interface which have near about 15 methods
EventFiringWebDriver: This is an class that actually fire Webdriver event

Create a class called EventListerHandler to override events just by Implementing WebDriverEventListener interface. We can override to see after and before tracking of each events that we trigger through our scripts.
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.support.events.WebDriverEventListener;  
 public class EventListerHandler implements WebDriverEventListener {  
 //Called after WebElement.clear(), WebElement.sendKeys(...).  
 @Override  
 public void afterChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after WebElement.click()  
 @Override  
 public void afterClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void afterFindBy(By by, WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after navigate().back().  
 @Override  
 public void afterNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after navigate().forward().  
 @Override  
 public void afterNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after get(String url) respectively navigate().to(String url).  
 @Override  
 public void afterNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called after RemoteWebDriver.executeScript(String, Object[]).  
 @Override  
 public void afterScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before WebElement.clear(), WebElement.sendKeys(...)  
 @Override  
 public void beforeChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before WebElement.click().    
 @Override  
 public void beforeClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void beforeFindBy(By by, WebElement element, WebDriver driver) {  
 }  
 //Called before navigate().back().  
 @Override  
 public void beforeNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before navigate().forward().  
 @Override  
 public void beforeNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before get(String url) respectively navigate().to(String url).  
 @Override  
 public void beforeNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 //Called before RemoteWebDriver.executeScript(String, Object[])  
 @Override  
 public void beforeScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 // Called whenever an exception would be thrown.  
 @Override  
 public void onException(Throwable throwable, WebDriver driver) {  
 // TODO Auto-generated method stub  
 }  
 }  



Create a new Class that implement WebDriverEventListener methods
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.WebElement;  
 import org.openqa.selenium.support.events.WebDriverEventListener;  
 public class EventListerHandler implements WebDriverEventListener {  
 //Called after WebElement.clear(), WebElement.sendKeys(...).  
 @Override  
 public void afterChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("inside method afterChangeValueOf on =: " + element.toString());  
 }  
 //Called after WebElement.click()  
 @Override  
 public void afterClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
  System.out.println("inside method afterClickOn on =: " + element.toString());  
 }  
 //Called after WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void afterFindBy(By by, WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
  System.out.println("Find happened on =: " + by.toString());  
 }  
 //Called after navigate().back().  
 @Override  
 public void afterNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the after navigateback to =: " + driver.getCurrentUrl());  
 }  
 //Called after navigate().forward().  
 @Override  
 public void afterNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the afterNavigateForward to =: " + driver.getCurrentUrl());  
 }  
 //Called after get(String url) respectively navigate().to(String url).  
 @Override  
 public void afterNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the afterNavigateTo to =: " + url);  
 }  
 //Called after RemoteWebDriver.executeScript(String, Object[]).  
 @Override  
 public void afterScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the afterScript to, Script is =: " + script);  
 }  
 //Called before WebElement.clear(), WebElement.sendKeys(...)  
 @Override  
 public void beforeChangeValueOf(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Inside the beforeChangeValueOf method =; "+element.toString());  
 }  
 //Called before WebElement.click().    
 @Override  
 public void beforeClickOn(WebElement element, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("About to click on the " + element.toString());  
 }  
 //Called before WebDriver.findElement(...), or WebDriver.findElements(...), or WebElement.findElement(...), or WebElement.findElements(...).  
 @Override  
 public void beforeFindBy(By by, WebElement element, WebDriver driver) {  
   System.out.println("before FindBY =: "+by.toString());  
 }  
 //Called before navigate().back().  
 @Override  
 public void beforeNavigateBack(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeNavigateBack =: " + driver.getCurrentUrl());  
 }  
 //Called before navigate().forward().  
 @Override  
 public void beforeNavigateForward(WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeNavigateForward =: " + driver.getCurrentUrl());  
 }  
 //Called before get(String url) respectively navigate().to(String url).  
 @Override  
 public void beforeNavigateTo(String url, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeNavigateTo =: " + url);  
 }  
 //Called before RemoteWebDriver.executeScript(String, Object[])  
 @Override  
 public void beforeScript(String script, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Just before beforeScript =: " + script);  
 }  
 // Called whenever an exception would be thrown.  
 @Override  
 public void onException(Throwable throwable, WebDriver driver) {  
 // TODO Auto-generated method stub  
 System.out.println("Exception occured at =: " + throwable.getMessage());  
 }  
 }  


Create Event Throwing WebDriver
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import org.openqa.selenium.support.events.EventFiringWebDriver;  

 public class EventListerDemo {  
 public static void main(String[] args) {  
 //Initializing instance of Webdriver  
 WebDriver wDriver = new FirefoxDriver();  

 //Initializing instance of EventFiringWebDriver  
 EventFiringWebDriver driver = new EventFiringWebDriver(wDriver);  
 //Now create object of EventListerHandler to register it with EventFiringWebDriver   
 EventListerHandler handle = new EventListerHandler();  

 System.out.println("===============================");  
 //Registering it with EventFiringWebDriver   
 driver.register(handle);  
 driver.get("http://www.facebook.com");  
 driver.findElement(By.id("email")).sendKeys("abcde@gmail.com");  
 driver.findElement(By.id("pass")).sendKeys("aaaaaaaa");  
 driver.findElement(By.id("loginbutton")).click();  
 driver.get("http://www.gmail.com");  
 driver.get("http://www.outlook.com");  
 driver.navigate().back();  
 driver.navigate().forward();  
 driver.quit();  
 driver.unregister(handle);  
 System.out.println("===============================");  
   }  
 }  

Output:
>

How to handle Page Object Model (POM) in Selenium Webdriver using Java.

Create a simple class (PageObjectsFacebook.java) within a package and create methods for each one of those object identifiers as shown under.
 
 import org.openqa.selenium.*;  
   
 public class PageObjectsFacebook {  
   
 private static WebElement element = null;  
   
 //Username Text Box  
 public static WebElement txt_username(WebDriver driver) {  
 element = driver.findElement(By.id("email"));  
 return element;  
 }  
   
 //Password Text Box   
 public static WebElement txt_password(WebDriver driver) {  
 element = driver.findElement(By.id("pass"));  
 return element;  
 }  
   
 //Login Button   
 public static WebElement btn_lgin(WebDriver driver) {  
 element = driver.findElement(By.id("loginbutton"));  
 return element;  
 }  
   
 }  


Create a class call Loginfailtext with main and inherited upper super class as shown below.
 import java.util.concurrent.TimeUnit;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
   
 public class Loginfailtext {  
   
 static WebDriver driver = null;  
   
 public static void main(String[] args) {  
   
 // WebDriver reference but Firefox object  
 driver = new FirefoxDriver();  
 //Maximize browser window   
 driver.manage().window().maximize();  
 //Go to URL  
 driver.get("http://www.facebook.com");  
 //Set timeout  
 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  
   
 //Use page Object library now   
 PageObjectsFacebook.txt_username(driver).clear();  
 PageObjectsFacebook.txt_username(driver).sendKeys("abcde@gmail.com");  
   
 PageObjectsFacebook.txt_password(driver).clear();  
 PageObjectsFacebook.txt_password(driver).sendKeys("aaaaaaaa");  
   
 PageObjectsFacebook.btn_lgin(driver).click();  
   
 if (driver.getPageSource().contains("Please re-enter your password")) {  
 System.out.println("Pass");  
 } else {  
 System.out.println("Fail");  
 }  
 driver.close();  
 }  
 }  


How to write Log into log file in Selenium webdriver using java.


Components:
1. Instance of Logger class with below mention methods.
error, warn, info, debug, log

Configuration:
1. Download "log4j-1.2.17.zip" file from Here and unzipe, add "log4j-1.2.17.jar" file into your desired java project.
2. Add a New XML file, name is "configure_logfile.xml" with under properties in your desired java project Home_directory.





   
                                              
Source Code:
 import org.apache.log4j.LogManager;  
 import org.apache.log4j.Logger;  
 import org.apache.log4j.xml.DOMConfigurator;  
   
 import java.util.concurrent.TimeUnit;  
 import org.openqa.selenium.*;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
   
 public class Writelogintofile {  
     
 static final Logger logger = LogManager.getLogger(Writelogintofile.class.getName());  
     
 public static void main(String[] args) {  
   
 DOMConfigurator.configure("configure_logfile.xml");  
 logger.info("============================================ ");  
 logger.info("Log has started to write");  
 //create Firefox instance  
 WebDriver driver = new FirefoxDriver();  
 logger.info("create Firefox instance");  
 //Puts a Implicit wait, Will wait for 10 seconds before throwing exception  
 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  
   
 //Launch website  
 driver.navigate().to("http://www.google.com/");  
 logger.info("Open Google Website");  
   
 //Maximize the browser  
 driver.manage().window().maximize();  
 logger.info("Maximize the browser");  
   
 //Click on Gmail  
 driver.findElement(By.linkText("Gmail")).click();  
 logger.info("Clicked Gmail Link");  
   
 // Back previos state   
 driver.navigate().back();  
 logger.info("Backed Google from gmail");  
 // Forwart previos state   
 driver.navigate().forward();  
 logger.info("Forwared Google to gmail");  
 //Navigate to facebook   
 driver.get("http://www.facebook.com/");  
 logger.info("Navigated to facebook ");  
   
 if (driver.getTitle().trim().equals("Google")) {  
   logger.info("The Result is Pass");  
 } else {  
   logger.error("TEST FAILED. NEEDS INVESTIGATION");  
 }  
 logger.warn("May be condition is not fullfill");  
   
 //Close the Browser.  
 driver.close();  
 logger.info("============================================ ");  
   }  
 }  
   
   
Output: After execution, "write_log.log" file is created on the root folder with below output