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.

 

Difference between @Factory and @DataProvider annotations

Both the annotations belong to TestNg testing framework. Many people get confused while reading about these two annotations that why and where we have to use these two?

Very basic difference between these two are-

@DataProvider- DataProvider annotations parameterize the particular test method and execute the test number of times based on data provided by DataProvider method. So if two parameters are there then test will execute twice.

@Factory- Factory executes all the test methods present inside any test class file using separate instance of the respective class.

Still confused???

Let’s have look on some programs-

@DataProvider
public Object[][] message(){
return new Object [][]{{“Mayank” , new Integer (321)}, {“Dileep”, new Integer (282)}};
}

@Test (dataProvider=”message”)
public void PrintMsg(String name, Integer id){
System.out.println(“Names are: “+name+” “+id);
}

As above program states that there are two data and if I run this program result will be-

Result1

So, it proves that if you increase the number of data in message method, PrintMsg method will execute same number of times.

Now we will see Factory and how it is different from DataProvider-

public class TestFactory {
@Factory
public Object[] factorymethod(){
return new Object[]{new DPandFactoryExaple(), new DPandFactoryExaple()};
}}

public class DPandFactoryExaple {
@DataProvider
public Object[][] message(){
return new Object [][]{{“Mayank” , new Integer (321)}, {“Dileep”, new Integer (282)}};
}
@Test (dataProvider=”message”)
public void PrintMsg(String name, Integer id){
System.out.println(“Names are: “+name+” “+id);
}
@Test
public void PrintSuccessfullMessage(){
System.out.println(“Print the successfull message”);
}}

So if we see DPandFactoryExaple class then you will find there are two @Test methods and 1 @Test method has to execute twice and 1 @Test method has to execute once. So there should be 3 messages.

Now if you see @Factory method it is calling the same class twice and in that case there should be 6 messages. See the results below-

Result2

So did it clear the doubts?? No, then comment it out we will discuss it.

 

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..

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.

How to Launch Chrome browser with Selenium WebDriver?

Before thinking how we can run the our application on Chrome browser, download the ChromeDriver from here.

To lunch chrome browser with Selenium Webdriver takes less than a minute and 3 lines of code. So here we go-

System.setProperty(“webdriver.chrome.driver”, “D:\\Chrome_Driver\\chromedriver.exe”);
WebDriver driver=new ChromeDriver();
driver.get(“http://seleniumeasy.com/&#8221;);

Cross Browser Testing using CodedUI Test

Before starting this topic I would like to clear in beginning that Visual Studio 2013 uses Selenium WebDriver component to achieve cross browser testing as of now.

So to integrate WebDriver component with Visual Studio follow below given steps-

Start the Visual Studio and go to Tools menu and click on Extensions and Updates…

CUIT

System will open Extensions and Updates window. Make sure you are in Online section. Search the ‘Selenium Component’ and download the same.

CUIT1

It will download the .msi file.

CUIT2

Install it on running machine.

CBT

Once you installed it, it keeps all the dll and files in below location-

C:\Program Files (x86)\Common Files\microsoft shared\VSTT\Cross Browser Selenium Components

CUIT3

Now restart the system and write below method-

CUIT4

CurrentBrowser property is a place where you define your browser type. Now run it and see the magic.