Automation Using Selenium Webdriver

Wednesday, 2 November 2016

Checking text on web page using WebDriver

While testing any web application, we need to make sure that it is displaying correct text under given elements. Selenium WebDriver provides a method to achieve this. We can retrieve the text from any WebElement using getText() method.

Example
Lets create a test that check for the proper text in flipkart menu tab.

Code:
@Test
public void testFlipkartMenuText() {
    //Get Text from first item and store it in String variable
    String electronics = driver.findElement(By.cssSelector("li[data-key='electronics']>a>span")).getText();
 
    //Compare actual & required texts
    assertEquals("Electronics",electronics); 
}
The WebElement class' getText() method returns value of the innerText attribute
of the element.

P.S : Given script may not work on flipkart site. I've written this code just to give some basic idea of using getText() method

Generate Random Date in between Start Date and End Date(Java)

Generate Random Date in between Start Date and End Date(Java)

Generating random Date using java for Selenium WebDriver by taking inputs as format of date,Start date and End Date.
Please find the below Reusable method for the same

Sample Code for generating Random Date in between Start Date and End Date(Java)::

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class GenerateRandomDate {



public static String generateRandomDate(String Format,String startDate,String endDate) throws ParseException
  {
   DateFormat formatter = new SimpleDateFormat(Format);
   Calendar cal=Calendar.getInstance();
   cal.setTime(formatter.parse(startDate));
   Long value1 = cal.getTimeInMillis();

   cal.setTime(formatter.parse(endDate));
   Long value2 = cal.getTimeInMillis();

   long value3 = (long)(value1 + Math.random()*(value2 - value1));
   cal.setTimeInMillis(value3);
   return formatter.format(cal.getTime());
     }



    public static void main(String args[]) throws ParseException{
   
     System.out.println(GenerateRandomDate.generateRandomDate("dd MMM yyyy", "01 Aug 2016", "01 Sep 2017"));
   
   
    }

}

Advanced TestNG Interview Questions

 #1) What is the significance of <testng.xml> file?

Answer: In a Selenium TestNG project, we use testng.xml file to configure the complete test suite into
a single file. This file makes it easy to group all the test suites and their parameters in one file.
It also gives the ability to pull out subsets of your tests or split several runtime configurations.
Few of the tasks which we can group in the <testng.xml> file are as follows.

1- Can configure test suite comprising of multiple test cases to run from a single place.
2- Can include or exclude test methods test execution.
3- Can mark a group to include or exclude.
4- Can pass parameters in test cases.
5- Can add group dependencies.
6- Can configure parallel test execution.
7- Can add listeners.



Question #2) How to pass parameter through <testng.xml> file to a test case?

Answer: You can set the parameter using the below syntax in the <testng.xml> file.


<parameter name="browser" value="FFX" />
1
<parameter name="browser" value="FFX" />
Here, name attribute represents the parameter name and value signifies the value of that parameter. Then we can use that parameter in the selenium WebDriver software automation test case using the bellow syntax.

Java

@Parameters ({"browser"})
1
@Parameters ({"browser"})


Question #3) How to exclude a @Test method from a test case with two @Test methods? Is it possible?

Answer: Yes, you need to add @Test method in the exclude tag of <testng.xml> file as mentioned below.


<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Test Exclusion Suite">
<test name="Exclusion Test" >
<classes>
<class name="Your Test Class Name">
<methods>
<exclude name="Your Test Method Name To Exclude"/>
</methods>
</class>    
</classes>
</test>
</suite>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Test Exclusion Suite">
  <test name="Exclusion Test" >
    <classes>
      <class name="Your Test Class Name">
       <methods>
       <exclude name="Your Test Method Name To Exclude"/>
      </methods>
      </class>    
    </classes>
  </test>
</suite>


Question #4) How to skip a @Test method from execution?

Answer: You can use the below syntax inside @Test method to skip a test case from test execution.

Java

throw new SkipException("Test Check_Checkbox Is Skipped");
1
throw new SkipException("Test Check_Checkbox Is Skipped");
It will throw skip exception and @Test method will be ignored immediately from execution.



Question #5) Can you arrange the below <testng.xml> tags from parent to child?

<test>
<suite>
<class>
<methods>
<classes>

Answer: The <testng.xml> file will have the following structure.

The parent tag in the <testng.xml> file is the <suite> tag.
<suite> tag can include one or more <test> tags.
<test> tag can include the <classes> tag.
<classes> tag can include one or more <class> tags.
<class> tag wraps the <methods> tag where we define the test methods to include or exclude.
Hence, the correct order of the TestNG tags would be.

<suite>
<test>
<classes>
<class>
<methods>



Question #6) How to define the priority of @Test method? Also, mention its usage?

Answer:

In your Selenium WebDriver project, you can set priority for TestNG @Test annotated methods as shown
in the following example.

Java

@Test(priority=0)
1
@Test(priority=0)
Using priority, you can manage @Test method execution sequence as per your requirement.
That means @Test method with priority = 0 will run 1st and @Test method with priority = 1 will execute
2nd and so on.



Question #7) Can you specify any 6 assertions of TestNG to be used in a Selenium WebDriver software
testing tool.

Answer: There are multiple assertions available In TestNG but generally we use the following assertions

 in out test cases.

1- assertEquals
2- assertNotEquals
3- assertTrue
4- assertFalse
5- assertNull
6- assertNotNull



Question #8) Why soft assertion is used in Selenium WebDriver and TestNG automation project?

Answer: TestNG soft assertion allows to continue the test execution even if the assertion is failed.
That means once the soft assertion fails, remaining part of <@Test> method is executed and the assertion
failure is reported at the end of <@Test> method.



Question #9) How to apply regular expression in <testng.xml> file to find @Test methods containing “product” keyword?

Answer:

Refer below example, here we’ve used a regular expression to find @Test methods containing keyword “product”.


<methods>
<include name=".*product.*"/>
</methods>
1
2
3
<methods>
     <include name=".*product.*"/>
</methods>


Question #10) What are the time unit we specify in test cases and test suites? minutes? seconds? milliseconds? or hours? Give Example.

Answer: Time unit we specify at @Test method level and test suite level which normally set in milliseconds unit.



Question #11) List out the benefits of TestNG over Junit?

Answer:
TestNG framework has following benefits over JUnit.

1- TestNG annotations are more logical and easier to understand.

2- Unlike JUnit, TestNG does not require to declare @BeforeClass and @AfterClass.

3- There is no method name constraint in Selenium TestNG framework.

4- TestNG supports three additional setups:

4.1- @Before/AfterSuite,

4.2- @Before/AfterTest, and

4.3- @Before/AfterGroup.

5- In Selenium TestNG projects, there is no need to extend any class.

7- In TestNG, it is possible to run Selenium test cases in parallel.

8- TestNG supports grouping of test cases which is not possible in JUnit.

9- Based on the group, TestNG allows you to execute the test cases.

10- TestNG permits you to determine the dependent test cases. Every test case is autonomous to other
 test cases.



Question #12) What are the basic steps for drafting TestNG test cases?

Answer:

Following are the most common steps for writing TestNG test cases.

1- Write down the business logic of your test.

2- Add appropriate TestNG annotations in your code.

3- In <build.xml> or <testing.xml>, add the information about your test.

4- Run your TestNG project.



Question #13) List out different ways to run TestNG?

Answer:

You can run TestNG in the following ways.

1- Start directly from the Eclipse IDE, or

2- Run using the IntelliJ’s IDEA IDE.

3- Run with ant build tool.

4- Launch from the command line.



Question #14) In TestNG how can you disable a test?

Answer:

To disable the test case, you can use the following annotation.

@Test(enabled = false).


Question #15) Explain what does the test timeout mean in TestNG?

Answer: The timeout test in TestNG is nothing but the time allotted to perform unit testing.
If the unit test fails to finish in that specific time limit, TestNG will abandon further testing and
mark it as a failed.



Question #16) What is exception test and why is it used for?

Answer:

TestNG provides an option for tracing the Exception handling of code. You can verify whether a code
throws the desired exception or not. The expectedExceptions parameter is availed along with @Test
annotation. Please refer the below example for clarity.

Java

package com.techbeamers.testng.examples.exception;
import org.testng.annotations.Test;
public class TestRuntime {
@Test(expectedExceptions = { IOException.class })
public void exceptionTestOne() throws Exception {
throw new IOException();
}
@Test(expectedExceptions = { IOException.class, NullPointerException.class })
public void exceptionTestTwo() throws Exception {
throw new Exception();
}}


package com.techbeamers.testng.examples.exception;

import org.testng.annotations.Test;

public class TestRuntime {

@Test(expectedExceptions = { IOException.class })

 public void exceptionTestOne() throws Exception {

 throw new IOException();

 }

 @Test(expectedExceptions = { IOException.class, NullPointerException.class })

 public void exceptionTestTwo() throws Exception {

 throw new Exception();

 }

}


Question #17) Explain what is parametric testing?

Answer:

Parameterized testing lets the programmer re-run the same test with different values. TestNG allows
you to pass parameters directly to the test methods using the two ways as given below.

1- With testing.xml.

2- With Data Providers.



Question #18) Explain what does @Test(invocationCount=?) and (threadPoolSize=?) indicates?

Answer:

1- @Test (threadPoolSize=?): The threadPoolSize attribute directs TestNG to create a thread pool to run
 the test method through multiple threads. With thread pool, the running time of the test method
reduces considerably.

2- @Test(invocationCount=?): The invocation count refers to the no. of times TestNG should run the test method.



Question #19) What are the different ways to produce reports for TestNG results?

Answer:

TestNG offers following two ways to produce a report.

Listeners: For a listener class, the class has to implement the org.testng./TestListener interface. TestNG notifies these classes at runtime when the test enters into any of the below states.
e.g. Test begins, finishes, skips, passes or fasils.

Reporters: For a reporting class to implement, the class has to implement an org.testng/Reporter interface. When the whole suite run ends, these classes are called. When called, the object consisting the information of the whole test run is delivered to this class.



Question #20) How does TestNG allow you to state dependencies?

Answer:
TestNG supports two ways to declare the dependencies.

1- Using attributes dependsOnMethods in @Test annotations.

2- Using attributes dependsOnGroups in @Test annotations.

verify element existence using Selenium Webdriver

In this article, one of the way to validate existence of multiple objects of same object type based
on element text in the application is explained using Selenium Webdriver with java.
Please share other better way to verify element existence using Selenium Webdriver.

public boolean IsElementExists(String ObjectType, String strElemText)
{
 boolean boolElemExists = false;
//In case of multiple objects which needs to be validated, Provide multiple objects
// text seperated by  | in strElemText. e.g: strElemText as "mail|inbox"
// Create an array by splitting array based on delimiter "|"
 String[] elemTextArray = strElemText.split("|");
// Loop through array elements
 for ( int j = 0;j<elemTextArray.length;j++)
 {
  List<WebElement> lstElement = null;
  try
// Better approach will be to pass values from enum for Object type
   switch (ObjectType)
   {
   // in case of link object storing all the elements of type link in lstElement
   case "Link":
     lstElement = driver.findElements(By.tagName("a"));
    break;
    // in case of link object storing all the elements of type link in label
   case "Label":
    lstElement = driver.findElements(By.tagName("label"));
    break;
   }
   for (int i=0;i<lstElement.size();i++)
   {
    if (lstElement.get(i).getText().contentEquals(strElemText.trim()))
      {
       boolElemExists = true;
       i= lstElement.size()-1;
      }
   }
   if (boolElemExists = false)
   {
    return false;
   }
   }
  catch(Exception e)
  {
   return false;
  }
 }
 return boolElemExists;
}

Tuesday, 1 November 2016

MySQL database connectivity Selenium Script


Selenium Script for MySQL database connectivity

Prerequisite:

Download - mysql-connector-java-latest-bin.jar and add it to your project

import java.sql.*;
import javax.sql.*;

public class dbconnection{

public static void main(String args[]){
   String username;
   String dbUrl = "jdbc:mysql://localhost:3306/test";  //This URL is based on your IP address
   String username="username"; //Default username is root
   String password="password"; //Default password is root
   String dbClass = "com.mysql.jdbc.Driver";
   String query = "Select username from users where user_id = 1;";
  try {
      Class.forName(dbClass);
      Connection con = DriverManager.getConnection (dbUrl,username,password);
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(query);

      while (rs.next()){
        dbtime = rs.getString(1);
        System.out.println(username);
       } //end while

  con.close();
  } //end try

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

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

}  //end main

}  //end class

Read-Write Text File In Java - Tutorials For WebDriver

We have learnt about String class and Its different functions In my previous post.
Now our next topic Is How to write In to text file or How to read text file In java software
development language. Many times you will need reading or writing text file In your selenium webdriver
software automation test case development. For Example, You are reading some large data from
web page of software web application and wants to store It In text file to use It somewhere else In
future. Same way, You have to read data from file for some purpose.

It Is very easy to Create, Write and read text file In java software development language.
We can use java built in class File to create new file, FileWriter and BufferedWriter class to write
In to file, FileReader and BufferedReader class to read text file.

Bellow given example will first of all create temp.txt file In D: drive and then write two line In to
It. Then It will read both lines one by one from text file using while loop and print In console.
You can use bellow given example code of software development language for reading or writing text
 file In your selenium webdriver software automation test case whenever needed.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class RW_File {

 public static void main(String[] args) throws IOException {
  //Create File In D: Driver.
  String TestFile = "D:\\temp.txt";
  File FC = new File(TestFile);//Created object of java File class.
  FC.createNewFile();//Create file.

  //Writing In to file.
  //Create Object of java FileWriter and BufferedWriter class.
  FileWriter FW = new FileWriter(TestFile);
  BufferedWriter BW = new BufferedWriter(FW);
  BW.write("This Is First Line."); //Writing In To File.
  BW.newLine();//To write next string on new line.
  BW.write("This Is Second Line."); //Writing In To File.
  BW.close();

  //Reading from file.
  //Create Object of java FileReader and BufferedReader class.
  FileReader FR = new FileReader(TestFile);
  BufferedReader BR = new BufferedReader(FR);
  String Content = "";

  //Loop to read all lines one by one from file and print It.
  while((Content = BR.readLine())!= null){
   System.out.println(Content);
  }
 }
}

Monday, 31 October 2016

Super keyword in java

Super keyword in java

Super keyword in java is a reference variable that is used to refer parent class object. Super is an implicit keyword create by JVM and supply each and every java program for performing important role in three places.
  • At variable level
  • At method level
  • At constructor level

Need of super keyword:

Whenever the derived class is inherits the base class features, there is a possibility that base class features are similar to derived class features and JVM gets an ambiguity. In order to differentiate between base class features and derived class features must be preceded by super keyword.

Syntax

 
super.baseclass features.

Super at variable level:

Whenever the derived class inherit base class data members there is a possibility that base class data member are similar to derived class data member and JVM gets an ambiguity.
In order to differentiate between the data member of base class and derived class, in the context of derived class the base class data members must be preceded by super keyword.

Syntax

 
super.baseclass datamember name
if we are not writing super keyword before the base class data member name than it will be referred as current class data member name and base class data member are hidden in the context of derived class.

Program without using super keyword

Example

class Employee
{
float salary=10000;
}
class HR extends Employee
{
float salary=20000;
void display()
{
System.out.println("Salary: "+salary);//print current class salary
}
}
class Supervarible
{
public static void main(String[] args)
{
HR obj=new HR();
obj.display();
}
}

Output

 
Salary: 20000.0
In the above program in Employee and HR class salary is common properties of both class the instance of current or derived class is referred by instance by default but here we want to refer base class instance variable that is why we use super keyword to distinguish between parent or base class instance variable and current or derived class instance variable.

Program using super keyword al variable level

Example

class Employee
{
float salary=10000;
}
class HR extends Employee
{
float salary=20000;
void display()
{
System.out.println("Salary: "+super.salary);//print base class salary
}
}
class Supervarible
{
public static void main(String[] args)
{
HR obj=new HR();
obj.display();
}
}

Output

 
Salary: 10000.0

Super at method level

The super keyword can also be used to invoke or call parent class method. It should be use in case of method overriding. In other word super keyword use when base class method name and derived class method name have same name.

Example of super keyword at method level

Example

class Student
{  
void message()
{
System.out.println("Good Morning Sir");
}
}  
  
class Faculty extends Student
{  
void message()
{
System.out.println("Good Morning Students");
}
  
void display()
{  
message();//will invoke or call current class message() method  
super.message();//will invoke or call parent class message() method  
}  
  
public static void main(String args[])
{  
Student s=new Student();  
s.display();  
}
}

Output

 
Good Morning Students
Good Morning Sir
In the above example Student and Faculty both classes have message() method if we call message() method from Student class, it will call the message() method of Student class not of Person class because priority of local is high.
In case there is no method in subclass as parent, there is no need to use super. In the example given below message() method is invoked from Student class but Student class does not have message() method, so you can directly call message() method.

Program where super is not required

Example

class Student
{  
void message()
{
System.out.println("Good Morning Sir");
}
}  
  
class Faculty extends Student
{  

void display()
{  
message();//will invoke or call parent class message() method  
}
 
public static void main(String args[])
{  
Student s=new Student();  
s.display();  
}
}

Output

 
Good Morning Sir

Super at constructor level

The super keyword can also be used to invoke or call the parent class constructor. Constructor are calling from bottom to top and executing from top to bottom.
To establish the connection between base class constructor and derived class constructors JVM provides two implicit methods they are:
  • Super()
  • Super(...)

Super()

Super() It is used for calling super class default constructor from the context of derived class constructors.

Super keyword used to call base class constructor

Syntax

class Employee
{
Employee()
{
System.out.println("Employee class Constructor");
}
}
class HR extends Employee
{
HR()
{
super(); //will invoke or call parent class constructor  
System.out.println("HR class Constructor");
}
}
class Supercons
{
public static void main(String[] args)
{
HR obj=new HR();
}
}

Output

 
Employee class Constructor
HR class Constructor
Note: super() is added in each class constructor automatically by compiler.

In constructor, default constructor is provided by compiler automatically but it also adds super()before the first statement of constructor.If you are creating your own constructor and you do not have either this() or super() as the first statement, compiler will provide super() as the first statement of the constructor.

Super(...)

Super(...) It is used for calling super class parameterize constructor from the context of derived class constructor.

Important rules

Whenever we are using either super() or super(...) in the derived class constructors the superalways must be as a first executable statement in the body of derived class constructor otherwise we get a compile time error.
The following diagram use possibilities of using super() and super(........)

Rule 1 and Rule 3

Whenever the derived class constructor want to call default constructor of base class, in the context of derived class constructors we write super(). Which is optional to write because every base class constructor contains single form of default constructor?

Rule 2 and Rule 4

Whenever the derived class constructor wants to call parameterized constructor of base class in the context of derived class constructor we must write super(...). which is mandatory to write because a base class may contain multiple forms of parameterized constructors.