Integration of Selenium WebDriver with Cucumber – Selenium Tutorial #31

In the last tutorial, we discussed Cucumber tool, its usage and different features.

Moving ahead in our free Selenium online training series, we will discuss how to set up a cucumber project and will discuss integration of Selenium WebDriver with Cucumber.

We will set up Cucumber project with Maven. To set up Maven in your system please refer this tutorial on Maven from the same series.

Cucumber Project Setup:

Step #1: Create New Maven Project:

Right Click -> New -> Others -> Maven -> Maven Project -> Next

Step #2: Now the project will look like this:

Step #3: Add below dependencies in pom.xml


<dependencies>
<dependency>
      <groupId>info.cukes</groupId>
      <artifactId>cucumber-java</artifactId>
      <version>1.0.2</version>
      <scope>test</scope>
  </dependency>
<dependency>
     <groupId>info.cukes</groupId>
     <artifactId>cucumber-junit</artifactId>
     <version>1.0.2</version>
     <scope>test</scope>
</dependency>
<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.10</version>
     <scope>test</scope>
</dependency>
</dependencies>

Step #4: Create a sample.feature file under src/test/resources.

@smokeTest

Feature: To test my cucumber test is running

I want to run a sample feature file.

Scenario: cucumber setup

Given sample feature file is ready

When I run the feature file

Then run should be successful

Step #5: Create a class under src/test/java which will implement all the steps.


public class stepDefinition {
       @Given("^sample feature file is ready$")
       public void givenStatment(){
              System.out.println("Given statement executed successfully");
       }
       @When("^I run the feature file$")
       public void whenStatement(){
              System.out.println("When statement execueted successfully");
       }
       @Then("^run should be successful$")
       public void thenStatment(){
              System.out.println("Then statement executed successfully");
       }
}

Step #6: Create a Junit runner to run the test.


@RunWith(Cucumber.class)
@Cucumber.Options(format={"pretty","html:reports/test-report"},tags= "@smokeTest")
public class CucumberRunner {
}

Provide the path of the report as given here. The reports will store in ‘test-report’ folder under project folder and “pretty” format specifies the type of report.

Step #7: Junit Result and Test Report:

Below is the report when the cucumber test is successful. The green bar in Junit describes the test is passed. Similarly, red bar describes that test has failed.



If we want to use default reporting then navigate the path mentioned in Junit Runner. In this case, we have given path as reports->test-reports->index.html.

Open this report in Internet Explorer or in Firefox to verify the result. Below is the sample of the report:

Cucumber and Selenium WebDriver:

Cucumber framework can be used to test the web-based applications along with Selenium WebDriver. The test cases are written in simple feature files which are easily understood by managers, non-technical stakeholders and business analysts. And those feature file steps are implemented in step definition file. If you are using maven then you have to add dependencies for Cucumber and WebDriver.

So here is the sample test case we have implemented using Cucumber and WebDriver. As given below, the scenario in feature file is self-explanatory.

Feature: Login Feature File

@selenium

Scenario: Login scenario test for Gmail

Given navigate to Gmail page

When user logged in using username as “userA” and password as “password”

Then home page should be displayed

WebDriver Implementation in Cucumber stepDefinitions:


public class stepDefinition {
WebDriver dr;
@Given("^navigate to gmail page$")
public void navigate(){
       dr=new FirefoxDriver();
       dr.get("http://www.gmail.com");         
       }
@When ("^user logged in using username as \"(.*)\" and password as \"(.*)\"$")
public void login(String username,String password){
       dr.findElement(By.xpath("//*[@id='Email']")).sendKeys(username);
       dr.findElement(By.xpath("//*[@id='Passwd']")).sendKeys(password);
       dr.findElement(By.xpath("//*[@id='signIn']")).click();
       dr.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
       }
@Then("^home page should be displayed$")
public void verifySuccessful(){
      String expectedText="Gmail";
      String actualText=         dr.findElement(By.xpath("//*[@id='gbq1']/div/a/span")).getText();
      Assert.assertTrue("Login not successful",expectedText.equals(actualText));
      }
}

In this test, we have used the Firefox as the browser to test the Gmail login functionality.

Clearly WebDriver object is a class variable and used across the class.

Given statement initializes the browser and navigates to the page.

When statement logs into the application using the username as “userA” and password as “password”. Both the values ‘username’ and ‘password’ are passed from feature file and both the values to be used in the same order.

Then Statement only validates the conditions after logging into the application.

This is a sample test describing the usage of Cucumber and Selenium. You can create multilayer architecture depending upon your project requirement.

Conclusion:

In this Tutorial we have covered most of the Cucumber concepts which includes Cucumber features and its usage along with WebDriver.

This reduces the complexity of code which is written to design the traditional frameworks like Keyword Driven and Hybrid Framework. Cucumber is used in most of the project where people follow agile methodology as Behavior Driven Development is an Agile Software practice.

Next Tutorial #32: We have now completed all technical tutorials from this Selenium training series. Next, we will post about few important general topics like ‘effort estimation for Selenium projects’ and ‘Selenium interview questions with answers’.

Please post your queries regarding to Cucumber.