Cucumber Selenium WebDriver Java Integration with Example:
In the last tutorial, we discussed the 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 the integration of Selenium WebDriver with Cucumber.
We will set up a Cucumber project with Maven. To set up Maven in your system, please refer to this tutorial on Maven from the same series.
Table of Contents:
Selenium WebDriver Integration With Cucumber
Cucumber Project Setup
Step #1: Create a New Maven Project:
Right Click -> New -> Others -> Maven -> Maven Project -> Next
Step #2: Now the project will look like this:
Step #3: Add the 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 the sample feature file is ready
When I run the feature file
Then the 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 be stored in ‘test-report’ folder under the project folder and the “pretty” format specifies the type of report.
Step #7: Junit Result and Test Report:
Below is the report of when the cucumber test is successful. The green bar in Junit describes the test is passed. Similarly, the red bar describes the test has failed.
If we want to use default reporting, then navigate the path mentioned in Junit Runner. Here, we have given the path as reports->test-reports->index.html.
Open this report in Internet Explorer or Firefox to verify the result. Below is a sample of the report:
Cucumber Selenium WebDriver Integration
The cucumber framework can test the web-based applications along with Selenium WebDriver. The test cases are written in simple feature files that are easily understood by managers, non-technical stakeholders, and business analysts.
And those feature file steps are implemented in the 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 the feature file is self-explanatory.
Feature: Login Feature File
@selenium
Scenario: Login scenario test for Gmail
Given navigate to the Gmail page
When the user logs in using the 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 Firefox as the browser to test the Gmail login functionality.
The WebDriver object is a class variable and is used across the class.
The given statement initializes the browser and navigates to the page.
When the statement logs into the application using the username as “userA” and password as “password”. Both the values ‘username’ and ‘password’ are passed from the feature file and both values are 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 on your project requirements.
Conclusion
In this Cucumber Selenium Java Integration Tutorial, we have covered most of the Cucumber concepts, including Cucumber features, its usage, and WebDriver.
This reduces the complexity of code written to design the traditional frameworks like Keyword Driven and Hybrid Framework. Cucumber is used in most of the projects where people follow the 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 a few important general topics like ‘effort estimation for Selenium projects’ and ‘Selenium interview questions with answers’.
Please post your queries regarding the Cucumber Selenium Tutorial.
Hi Charles, you can create a new Junit test case inside the src/test/java with below code & run as Junit test
import org.junit.runner.RunWith;
import cucumber.junit.Cucumber;
import cucumber.junit.Cucumber.Options;
@RunWith(Cucumber.class)
@Options(format={“pretty”,”html:reports/test-report”},features = “Feature\\seleniumsample.feature”)
public class CucumberRunner
{
}
sir is it supports java to work on calabash and cucumber together?????????? pls take class on that from ur side it will very useful
Hi,
I am new to cucumber and started exploring on it.
May i know how do we link the feature file with selenium script and types of regex to use the step definitions?
Thanks in advance!!!
How to use Internet Explorer or chrome browser.Please suggest.
Hi . I wan’t to get handler of diglog when click [@id=’pop’]”)).click(); show popup. But i only get handler of parent window. Please help me !!!!!!
String parentWindowHandler = driver.getWindowHandle(); // Store your parent window
String subWindowHandler = null;
System.out.println(“So1 “+parentWindowHandler);
driver.findElement(By.xpath(“//*[@id=’pop’]”)).click();
Set handles = driver.getWindowHandles(); // get all window handles
Iterator iterator = handles.iterator();
while (iterator.hasNext()){
subWindowHandler = iterator.next();
System.out.println(“So2 “+subWindowHandler);
}
driver.switchTo().window(subWindowHandler);
Can cucumber use to run window based application or interfaces?
Steps aren’t clear and seem to be making assumptions of prior knowledge. Never got to run successfully if follow these steps exactly as described.
Can we upload data through excel sheet in Cucumber such as passing diff User IDs and PWDs for login scenario?
I have the same question as Charlie and minnu kumari, i.e. where do we put the runner class ? Is Junit a dependency for Cucmuber ? Or will it run without Junit ?
In Junit runner, we should give @CucumberOptions, @Cucumber.Options is not working….
@CucumberOptions(
format={“pretty”,”html:reports/test-report”},
features=”src/test/resources”,
tags= “@smokeTest”)
If you found problem in using regular expression at When statement like @When(“^user logged in using username as \”(.*)\” and password as \”(.*)\”$”) just made change as follows @When (“^user logged in using username as (.*) and password as (.*)$”)
This is great Web site for knowledge.
Hi,
Really it was very useful and easy understand as well as i have learned a lot through this… thanks a lot..
You could use this as a reference.
https://github.com/jbalgue/cucumber-automation
Cheers!
Cannot Run the programs. facing below issues
1. sample.feature File Warning “Step does not have a matching glue code”
2. “No tests found with Test runner Junit 4.”
Use below dependencies
info.cukes
cucumber-java
1.1.5
test
info.cukes
cucumber-junit
1.1.5
test
junit
junit
4.11
test
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
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”);
}
}
And for runner please provide feature path features=”src/test/resources”
import org.junit.runner.RunWith;
import cucumber.api.*;
import cucumber.api.junit.Cucumber;
@SuppressWarnings(“deprecation”)
@RunWith(Cucumber.class)
@Cucumber.Options(format={“pretty”,”html:reports/test-report”}, features=”src/test/resources”,tags= “@smokeTest”)
public class CucumberRunner {
}
Happy coding
HI , Thanks for the valuable efforts you put.Excellent work.
Every time when i execute this script new report is overridden on to old one. So what is the source code to see all the reports instead of single one.
awaiting your reply!!!!!
Thanks 🙂
I am test professional working on BI/ETL
have anyone tried automation testing for BI/ETL projects if so, can you please share some perspective about automation in ETL/BI projects. i am planning to come up with strategy for performance testing for regression suite
@Syed yes u can create multiple scenarios in one feature file.
User Background for common set of pre-conditions.
User multiple scenarios – when then conditions in one feature file.
You say to create a junit runner to run the test but you dont say where to create it? What file? What folder? Where?
Step #6: Create a Junit runner to run the test.
1
@RunWith(Cucumber.class)
2
@Cucumber.Options(format={“pretty”,”html:reports/test-report”},tags= “@smokeTest”)
3
public class CucumberRunner {
4
}
U can creat runner class in src/test/java folder within the same package or creat separate PKG for runner class …..
Hi,
Can anyone help me out with creating cucumber test case for Testing CMP for messages in queue. i have code we need to create test case for that.
{
“documentType”: “Letter”,
“deliveryType”: “COMPOSE”,
“materialTemplateId”: “60”,
“documentData”: {
“contractId”: “5495739”,
“documentTypeTxt”: “A00500SL”,
“longDocumentTypeTxt”: “FWO LTR”,
“documentInstanceId”: null,
“clientInfo”: {
“clientRelationshipCd”: “1”,
“partyId”: “3938701”,
“firstName”: “DIANE”,
“lastName”: “CONROY-KELLOGG”,
“middleName”: “B”,
“fullName”: null,
“phoneNumber”: null,
“addressLine1”: “10332 S BEGOLE RD”,
“addressLine2”: “PERRINTON MI 48871-9767”,
“addressLine3”: null
},
You can refer below link for chrome browser
https://github.com/amarpravin/JavaCucumberWithSelenium
Could you please provide an example for cross browser testing using selenium and cucumber?
Hi,
It is really Awesome !!!
This is very good tutorial to start working with Selenium and it depends on individual, how efficiently use this tutorial and develop framework for his project requirements.
Thank you so much for taking your personal time and effort to write this tutorial. It’s indeed absolutely useful for those starting in the Cucumber/SeleniumWebDriver world. Much appreciated.
Hi,
Can we use @test, @before junit annotations along with cucumber annotations like @given etc
for example, can we write like below? if so, how will be the junit report? pls reply.
@Given(“^user is on homepage$”)
@before
public void launchhomepage()
{
driver.get(“homepageurl”);
}
@When(“^user enters username and password$”)
@And(“^user clicks login button$”)
@test
public void doLogin()
{
driver.findElements(By.id(“usr”).sendKeys(“user1”);
driver.findElements(By.id(“pwd”).sendKeys(“pwd”);
driver.findElements(By.id(“submit”).click();
}
Hi very useful tool.
waiting for selenium interview questions tutorial.
Can we write multiple scenarios in a single .feature file?
where we should create runner class
sir i have tried same code that you are given but when i execute that it throws an error as follows
cucumber.runtime.CucumberException: No features found at [com/cucumber/test] at cucumber.runtime.model.CucumberFeature.load(CucumberFeature.java:47)
at cucumber.runtime.RuntimeOptions.cucumberFeatures(RuntimeOptions.java:82)
at cucumber.junit.Cucumber.(Cucumber.java:60)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:87)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:73)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:46)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:522)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
tting fail gives error
very good tutorial, appreciate!!!
Hi,How to implement Cucumber Using TestNG. I am implemented my project in Hybrid FrameWork[Data driver+TestNG+POM].I want to implement /convert my Project to Cucumber[BDD]. How can i achieve this.
I understand your two classes on Cucumber.I want your suggestion to move forward.My target is convert my project toBDD.
i followed the same steps but it shows ” no feature found “
With what ide is performing the test?
Atte.
Ricardo Pavez
From Santiago. Chile