Im trying to run a simple feature file with java and intellij and I cant seem to get it working.
Ive set up my Cukes test runner class
package config;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;
#RunWith(Cucumber.class)
#CucumberOptions(monochrome = true,
features = {"src/test/resources/features/"},
dryRun = false,
glue = "com.ecs.googleuat"
)
public class RunCukesTest {
}
feature:
Feature: home
Scenario: home
Given I am on the home page
step definitions:
import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
public class MyStepdefs {
#Given("^I am on the home page$")
public void iAmOnTheHomePage() {
System.out.println("Hello");
}
}
project structure:
Im using a maven project with the java cucumber plugins.
When I run the feature file I get the following error:
Undefined step: Given I am on the home page
1 Scenarios (1 undefined)
1 Steps (1 undefined)
0m0.000s
You can implement missing steps with the snippets below:
#Given("^I am on the home page$")
public void i_am_on_the_home_page() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}
Process finished with exit code 0
Please help me understand what Im doing wrong.
Thanks
Not 100% sure but I think the issue is with the method name. The easy solution just copy-paste the suggested step definition inside MyStepdefs and remove exception and add your println and then run. Also try removing the glue com.ecs.googleuat you added.
Please follow this for further help!
Though I would strictly recommend going ahead with java-8.
Anyways, If you are comfortable with Java-8. Remove the glue inRunCukesTest.java. And update your MyStepdefs.java
public class MyStepdefs implements En {
public Stepdefs() {
Given("^I am on the home page$", () -> {
System.out.println("Hello");
});
}
}
En automatically implements default Glue for you.
Also, use appropriate dependencies. Follow this for same.
Edit:
For Java 8 please make sure that if you are using IntelliJ Idea, then Project SDK is enabled to 1.8.
Related
I have a problem that I think is silly ...
I can't run my tests on the cucumber.
Returns the following error:
cucumber.runtime.CucumberException:
Classes annotated with #RunWith(Cucumber.class) must not define any
Step Definition or Hook methods. Their sole purpose is to serve as
an entry point for JUnit. Step Definitions and Hooks should be defined
in their own classes. This allows them to be reused across features.
Offending class: class Teste.testecucumber
Could anyone help?
Thank you !!
#Runwith is declared in the TestRunner class of a Cucumber project. The Cucumber project has 3 defined types of classes:
Step Definition class
Feature class
Runner class
Please find the below examples for the above classes:
1. Feature Class
The test cases are written in this class
Feature: Title of your feature
I want to use this template for my feature file
#tag1
Scenario: Verify login to the system.
Given I navigate to url
And I enter username as "username"
And I enter password as "password"
When I click Login
Then I should be logged into the system
2. Step Definition class
The feature steps are defined in this class
public class LoginPage(){
#Given("I navigate to the url")
public void navigate() {
/* your code for the above
step comes here*/
}
}
3. Runner Class
The runner class consist of the location of features and step definition. It is a Junit class and cannot contain cucumber step definition annotations. (This is the reason why runner class cannot be a step definition class). But, you can include the BeforeClass, AfterClass (Junit annotations) in this class
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
#RunWith(Cucumber.class)
#CucumberOptions(
features = {"classpath:<location of your folder with feature classes / package name>"},
glue = {"<package name>" },
tags = { "<the tags that has to be executed>","can be comma separated multiple tags" }
)
public class testrunner {
//#AfterClass
public static void quitDriver() {
driver.quit();
}
}
Hope this helps you !
This has been puzzling me for half a day now. I can't seem to find the issue. Basically I have my Test runner, feature file, and the steps file in my workspace. The java files are in the same package (i.e. no package).
Below is my TestRunner.java
import org.junit.Test;
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
#RunWith(Cucumber.class)
#CucumberOptions(features = "test/resources/features", tags = { "~#Ignore" })
public class TestRunner {
#Test
public void feature() {
}
}
My feature file, helloWorld.feature
Feature: Simple Test Feature
Scenario: Run Scenario ONE
GIVEN step one
WHEN step two
THEN step three
and my steps file CucumberJava.java,
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
public class CucumberJava {
#Given("^step one$")
public void step_one() {
System.out.println("step one");
}
#When("step two")
public void step_two() {
System.out.println("step two");
}
#Then("^step three$")
public void step_three() {
System.out.println("step three");
}
}
When I execute TestRunner.java as JUnit, everything passes, but I get the following in the console:
0 Scenarios
0 Steps
0m0.000s
WHY? In fact, when I remove CucumberJava.java from the project, I get the exact same output. What am I missing?
I also tried setting the glue option in TestRunner.java code too; still the same result.
Your help is highly appreciated.
The feature file words like Given etc are in uppercase in your feature file. They need to be like Given ie sentence case.
Feature: Simple Test Feature
Scenario: Run Scenario ONE
Given step one
When step two
Then step three
Also you might need to append a 'src' to the feature path in the runner. Like this features = "src/test/resources/features", if you are using Maven. Also no need to have a #Test annotation and method inside the runner.
I am trying to build a Cucumber BDD framework with multiple step definition files. I am still trying to understand how to use picocontainer to run the step definition files. My problem is that once I have added the picocontainer jar into a project's build path, when executing the test runner it is unable to find any scenarios or steps.
Console
Java project build path
My project contains:
• A feature file
• 2 step definition files
• 1 test runner
• Utilities package with a webdriver initializer method
My feature file has the following steps:
The first 2 gherkin steps are glued to methods in following step definition class:
package stepDefinitions;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import cucumber.api.java.en.Given;
public class SD_HomePage {
WebDriver driver;
#Given ("^the user is on the websites homepages$")
public void user_is_on_the_websites_homepage() {
driver = utilities.WebDriverInitializer.openWebdriver("Chrome");
driver.get("https://www.forExample.com/");
}
#Given("^then clicks on AboutUs title$")
public void then_clicks_on_AboutUs_title() throws Throwable {
driver.findElement(By.xpath("//a[#href='/en/about-us'][1]")).click();
}
}
The third gherkin step is glued to this separate step def class:
package stepDefinitions;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import cucumber.api.java.en.When;
public class SD_AboutUsPage {
WebDriver driver;
#When("^the user clicks on Contact widget$")
public void the_user_clicks_on_Contact_widget() throws Throwable {
driver.findElement(By.xpath("//span[#class='icon-envelope listCta__img'][1]")).click();
}
}
When executing the test from the test runner no scenarios or steps will be found by the runner:
package testRunners;
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
#RunWith(Cucumber.class)
#CucumberOptions(features = "Features", glue = "stepDefinitions")
public class TestRun_NewsletterForm {
}
Console results from the Testrunner
However, when I remove the picocontainer the scenario and steps will be found. This will leave me with the original problem of not being able to make use of a shared state Webdriver.
Test Run after picocontainer jar is removed
I am aware that in this project I have not yet set up a class that will contain the shared state Webdriver, and constructors on the step definition pages. I have another project that has that is affected by this same issue but I felt that it would make this issue more complicated if I used that example.
I am trying to generate the step definitions from my feature file and as well as I have also designed test runner class but upon execution both give output on console as :-
0 scenarios
0 steps
0m0s.000s
Even though my feature file contains scenarios and steps.
Remove the colon (:) after the keywords (Given, When, etc) in your feature file.
Since you haven't shared any code or much details as to what you've done the only assumption that I can make is you have done something wrong in your testrunner class.
#RunWith(Cucumber.class)
#CucumberOptions(
features = "Feature"
,glue={"stepDefinition"}
)
public class TestRunner {
}
in the features make sure the path to your feature files is correct. i.e. if they are stored at some other directory, provide the path for the same
Ex: features = {"src/test/java/features"}
Also, please share your project structure, your feature file and your testrunner class code if possible in case this doesn't work for you.
Actually my runner class file looks like this:-
package runner;
import org.testng.annotations.Test;
import cucumber.api.CucumberOptions;
import cucumber.api.testng.AbstractTestNGCucumberTests;
#CucumberOptions(features={"src//test//resources//featurefiles"},glue= {"im801clsteps"},plugin={"html:target/cucumber-html-report",
"json:target/cucumber.json", "pretty:target/cucumber-pretty.txt"})
#Test
public class MainRunner extends AbstractTestNGCucumberTests {
}
And I am using testng not junit to run my tests,please let me know why I am wrong?
Hi I have setUp a Java project using Maven in eclipse.
I am facing an issue whenever I am trying to run the script. Its is executed by the not opening the desired website which I am parsing from the feature file.
Please have a look to the following code and Image of my directories setup in eclipse
Here is my code for PageStepsDefs.java
package com.workshop.airport.workshop.airport;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import cucumber.api.java.After;
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
public class PageStepsDefs {
public String ChromeDriverPath="C:\\Users\\zain.jamshaid\\Desktop\\chromedriver.exe";
public WebDriver driver;
String localhost="www.google.com";
#Before
public void deleteAllCookies() {
driver.manage().deleteAllCookies();
driver.manage().window().maximize();
}
#Before
public void setup(){
System.setProperty("webdriver.chrome.driver",ChromeDriverPath);
driver = new ChromeDriver();
}
#Given("^I browse to the (.+) page$")
public void open_page(String url)
{
driver.get(localhost+url);
System.out.println(localhost+url);
}
#After
public void tearDown(){
driver.quit();
}
}
Here is my code for RunCukeTest.java
package com.workshop.airport.workshop.airport;
import cucumber.api.junit.*;
import org.junit.runner.RunWith;
#RunWith(Cucumber.class)
#Cucumber.Options(
tags={"#mysingle"},
format={"pretty", "html:target/cucumber-html-report"},
monochrome=true,
features={"."},
strict=true)
public class RunCukeTest {
}
Here is statements in feature file
Feature: Login Functionality
#mysingle
Scenario: user successfully logins to the application
Given I browse to the / page
Any help will be awesome.
Thanks In advance.
Zain
I think I know the problem. As per your comment, the '/' from feature file is getting parsed to your step correctly. So this is not a cucumber issue. The issue I think is with your url. The url you have is incorrectly formed. URL should start with http://
I think everything will work fine if you change your localhost variable to String localhost="http://www.google.com";
Is it really executing your feature file? Try putting test.feature under src/test/resources/com/workshop/airport/workshop/airport: the JUnit running uses the unit test package as the location for finding the feature files.