Extension Method in Selenium, what, why, and how???

An Extension Method enable us to add methods to existing   types without creating a new derived type, recompile, or modify the original types.

Alright, confusing???

Picture1

Now consider you don’t have access for Car class and if I ask you to add a method for Car class, how would you do that?

In this kind of circumstances you can use Extension method concept to add a method for existing type without creating new class.

Still???

If I ask you write a program which should give today date, probably you would write below lines of code-

Picture2

Now if I ask you to give 1 month back date, probably you would write below method to get 1 month back date-

Picture3

Certainly you would write this method in a class and to call this method you would create object.

Picture4

How it would be if you get same method like this-

Picture5

You can achieve above line of code using Extension Method concept.

Picture6

Now you will see your extension method in below manner-

Picture7

OK, there are some rules also-

  • It should be static method.
  • It must be located in a static class.
  • It should use the “this” keyword as the first parameter with a type in .NET and this method will be called by a given type instance on the client side.
  • An extension method should be in the same namespace as it is used or you need to import the namespace of the class by a using statement.
  • You can give any name for the class that has an extension method but the class should be static.
  • If you want to add new methods to a type and you don’t have the source code for it, then the solution is to use and implement extension methods of that type.

Picture8

Now you will see your selenium extension method in below manner-

Picture9

Alright, now we will see a real time example-

While automating an application sometimes we all observed that click action performs the operation but button does not get clicked.

In that scenario, mostly we write different line of codes or methods to achieve our goal.

So instead of writing code each time for specific click, we can write different extension methods to handle all possible click actions and if one click is not working out we can call another IWebElement click methods (Extension Method).

It’s a right approach in any Automation framework to keep extension methods to perform the similar kind of actions using different ways.

 

How to include screenshots in ReportNG report?

Any test automation report is incomplete without the screenshots and including them in ReportNG is not that much difficult. In today’s post we will see how we can include the screenshots in ReportNG report. If you are wondering how to configure ReportNg with selenium then you can refer my previous post.

Here I am again considering that you already have below set-up-

  • Your project is already set-up in Eclipse
  • Project already has testng.xml file.
  • ReportNG is already set-up with Selenium and TestNG.

If above conditions are true then you just need to complete two steps-

1: Make it Escape_Property=false like this-

Screenshot

2: Now take the screenshot after some actions and pass through Reporter.log method to ReportNG report-

Screenshot1

Now run your testng.xml file and open the test report. If you have configured ReportNG properly and above set-up then you report should look like this-

screenshot3

How to configure ReportNG with Selenium WebDriver?

Selenium WebDriver is open source test automation framework which does not come with reporting facility. So selenium user has to be depended upon the third party plug-ins.

ReportNG is a simple HTML reporting plug-in for the TestNG unit-testing framework. It is intended as a replacement for the default TestNG HTML report. There are very few steps to configure ReportNG with WebDriver+TestNG.

To configure it we need three jar files (Guice, ReportNG, and Velocity-dep) which you can download from here-

http://reportng.uncommons.org/

and

https://github.com/google/guice/wiki/Guice30

Once you have these three jar files, please include them in your project-

lib

Here I am considering that you already have TestNg.xml file inside your project; if Yes, please include below listeners inside suite tag-

<listeners>
<listener class-name=”org.uncommons.reportng.HTMLReporter”/>
<listener class-name=”org.uncommons.reportng.JUnitXMLReporter”/>
</listeners>

Once you done, your testng.xml file should look like this-

TestNg

Now last step, disable the default testng listener by-

Right click on Project folder > click on Properties > click on TestNG which visible in left pane.

Test

All set, now run your testng.xml file and refresh your project. Once all done, It will add ‘test-output’ folder. Go to test-output > html > and open index.html to see the report.

report

Your report should look like this after all above set-up-

reports

How to configure Properties file with Selenium WebDriver?

Why Properties file?

To hide sensitive information of the projects we save the information in properties file.

To configure Properties file, create a new file and save as with .properties extension. Now add the data in following manner in Properties file:

URL=http://www.google.com
INT_USR=msrivastava
INT_PWD=Hello123&

Now use below lines of code to read this property file-

try{
FileInputStream prop = new FileInputStream (“D:\\Selenium_Projects\\Property\\setup.properties”);
Properties a = new Properties ();
try {
a.load(prop);
} catch (IOException e) {

e.printStackTrace();
}
String URL=a.getProperty(“URL”);
String USR=a.getProperty(“INT_USR”);
String PWD=a.getProperty(“INT_PWD”);
System.out.println(URL);
System.out.println(USR);
System.out.println(PWD);
}catch (FileNotFoundException e){
e.printStackTrace();
}

How to configure Selenium Grid?

Here I noted down some quick steps to configure Selenium Grid on windows. I am assuming that you are aware about selenium and its features. So here we go-

  • Download Selenium Standalone Jar file from here.
  • Dump it somewhere in host and node machines.
  • Open CMD at Host machine and go to location where you have been dumped the jar file.
  • Now run this command Java –jar seleniumserver-standalone_version.jar –role hub.
  • Now open http://localhost:4444/grid/console.
  • Now go to Node machine.
  • Open CMD at Node machine and go to location where you have been dumped the jar file.
  • Run the below commend if machine is remote-

java –jar selenium-server-standalone_version – role webdriver –hubHost HOST MACHINE NAME – “browserName=iexplorer, platform=WINDOWS” –port 5556

  • Run the below commend if machine is same machine where host is running-

java –jar selenium-server-standalone_version – role webdriver – “browserName=iexplorer, platform=WINDOWS” hubHost http://localhost:4444/grid/register –port 5555

How to run Selenium + TestNG script from Command Line?

This is an alternate way to execute our selenium script from command prompt. Here, I am considering few points-

  • Your project is already set-up in Eclipse
  • Project already has testng.xml file.
  • All selenium and other third party jar files are located under project home folder (lib folder).
  • You are able to execute your script by running testng.xml file.

cmd3

If above conditions are matching then very few steps are there to execute same script from command prompt. Follow the below steps-

Open Command Prompt and Go to Project home directory-

CMD

Set the class path and libraries path by running below command-

set classpath=<Project Home Path>\bin;<Project Home Path>\lib\*

cmd1

Now run the testng.xml file by running below command-

java org.testng.TestNG testng.xml—-Make sure “org.testng.TestNG” TestNG word should have ‘T’ and ‘NG’ in caps.

CMD2

I hope it would help people to run testng.xml file from the command prompt.

EventFiringWebDriver, WebDriverEventListener, and AbstarctWebDriverEventListener

Before getting into the sample code, lets have a look on EventFiringWebDriver, WebDriverEventListener, and AbstarctWebDriverEventListener descriptions.

  • EventFiringWebDriver is a class and wrapper around an arbitrary webdriver instance which supports registering of a WebDriverEventListener.
  • WebDriverEventListener is interface which includes list of abstract events methods and all should be implemented if we are implementing it.
  • AbstarctWebDriverEventListener is abstract class which has implemented WebDriverEventListener interface. We can extend this class if we are only interested in some events. All methods provided by this class have an empty method body.

So we can choose between EventFiringWebDriver and AbstarctWebDriverEventListener according to our needs.

Note: I have used AbstarctWebDriverEventListener class in below example.

Let’s have a look on example-

Create a class file and extends AbstarctWebDriverEventListener class-
public class WebDriverEventListenerClass extends AbstractWebDriverEventListener {
@Override
public void onException(Throwable arg0, WebDriver driver) {

File screenShot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(screenShot, new File(“c:\\tmp\\exception.png”));
} catch (IOException e) {
e.printStackTrace();
}}}

Create another class file and register WebDriverEventListenerClass file as it has implemented onException event method-

public class EventFiringDriverExample {
@Test
public void Events(){
System.setProperty(“webdriver.ie.driver”, “D:/Training/IE_Driver/IEDriverServer.exe”);

WebDriver driver = new InternetExplorerDriver();

// Creating EventFiringWebDriver instance

EventFiringWebDriver eventFiringDriver= new EventFiringWebDriver(driver);

// Creating instance of eventListener, that we just defined
eventFiringDriver.register(new WebDriverEventListenerClass());

eventFiringDriver.get(“https://www.google.co.in/&#8221;);

eventFiringDriver.findElement(By.className(“nosuchelement”));

}}

Once you run ‘Events()’ method, it will open Google and search for element which is not available. In this case, method will throw WebElementNotFound exception and system will capture the screenshot and save it at “c:\\tmp\\exception.png” location..

Logging with Log4J

Log4j is widely used API for generating the logs and there are few steps to configure it with Selenium Webdriver.

  • Download the latest log4j api from here.
  • Include the log4j-1.2.XX.jar file in your project build path.
  • Right click on your project > New > Other…>XML>XML FIle> and create a XML file with the log4j.xml name.
  • Copy and paste the below xml contents in newly created XML file-

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE log4j:configuration SYSTEM “log4j.dtd”>
<log4j:configuration xmlns:log4j=”http://jakarta.apache.org/log4j/&#8221; debug=”false”>
<appender name=”fileAppender” class=”org.apache.log4j.FileAppender”>
<param name=”Threshold” value=”INFO” />
<param name=”File” value=”logfile.log“/>
<param name=”append” value=”true”/>
<layout class=”org.apache.log4j.PatternLayout”>
<param name=”ConversionPattern” value=”%d %-5p [%c{1}] %m %n” />
</layout>
</appender>
<root>
<level value=”INFO”/>
<appender-ref ref=”fileAppender”/>
</root>
</log4j:configuration>

  • Create new class file without main method and paste below code-

public class TestCase_Logging {
public static WebDriver driver=null;
private static Logger Log = Logger.getLogger(TestCase_POF.class.getName());
public static void main(String[] args) {
DOMConfigurator.configure(“log4j.xml”);
System.setProperty(“webdriver.ie.driver”, “D:/IE_Driver/IEDriverServer.exe”);
driver = new InternetExplorerDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Log.info(“Start the application.”);
driver.get(“https://google.com&#8221;);

}
}

Note: Highlighted codes are important to generate the log, so don’t miss them.

  • Now run the program and go to Project root folder. System has been generated logfile.log file.

Apache ANT Setup

Follow the below steps to set-up ANT build tool-

  1. Go to the folder which have been downloaded in this cases

“C:\Selenium\ANT\apache-ant-1.8.4-bin\apache-ant-1.8.4”

  1. Go to Computer properties->Click on Advance tab->Environment Variables
  2. In the System Variable Create an new variable name as “ANT_HOME”
  3. Paste the above ANT directory in the path text box Click Search for a PATH variable select the variable and click on Edit button
  4. Append a semicolon”;” and paste the above ANT directory appending “/bin”
  5. To check whether ANT is completely set into the Environment Go to Command prompt and type ant and hit enter key.
  6. After pressing ant you will see “Buildfile: build.xml does not exist! Build failed”
  7. This message will confirm you that Ant is configured properly.

Significance of alwaysRun=true @Test annotation property.

alwaysRun=true property informs the system that TestNg should run the test method if depends on @Test method fails also. Basically it helps to achieve the soft dependency, the feature of TestNG which helps to execute the testng test methods in order. Below is the code example:

AlwaysRun

So above code states that system will execute the Close() method if Login method fails also.