Cucumber with Selenium Automation

cucumber
Published

October 7, 2022

click here to read this in medium

Project setup for cucumber Selenium automation using page object modal

Photo by Kaleidico on Unsplash

Steps to be followed β†’

  1. Create a maven project (I will be using IntelliJ).πŸ› 
  2. Add the dependences.πŸ§žβ€β™‚οΈ
  3. Create the Runner JAVA file.πŸ’‘
  4. Create as per the Runner file structure.⏳
  5. Run tests using feature files βœ…

Create a maven project in IntelliJ without any dependencies in it

Photo by Jeremy Bezanger on Unsplash

Adding Dependences to pom.xml β†’ Given pom.xml below

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>amazon-automation</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-gherkin</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-testng</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-gherkin</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.6.0</version>
</dependency>
</dependencies>

</project>

As per the given pom.xml file add the dependencies.

Add Runner.JAVA to the project β†’

Runner.java

@CucumberOptions(
features = "src/test/resources/features",
glue = "StepDefinitions",
plugin = {
"pretty",
"html:target/cucumber-reports/cucumber-pretty",
"json:target/cucumber-reports/CucumberTestReport.json",
"timeline:target/test-output-thread/"
}
)
public class Runner extends AbstractTestNGCucumberTests {



@Override
@DataProvider(parallel = true)
public Object[][] scenarios() {
return super.scenarios();
}

@BeforeSuite
public void beforeSuite() {
System.out.println("================ BEFORE SUITE==========");
}

@AfterSuite
public void afterSuite() {
System.out.println("================ AFTER SUITE ==========");
}
}

Create page object modals β†’

public class BasePage {
private static WebDriver driver;
public static final int TIMEOUT_PERIOD_LONG = 30;

public BasePage(WebDriver driver) {
this.driver = driver;
}

public WebElement waitForElement(By element, long timeout) {
WebElement myElement = null;
try {
myElement = new WebDriverWait(driver, Duration.ofSeconds(timeout)).until(ExpectedConditions.visibilityOfElementLocated(element));
} catch (TimeoutException toe) {
System.out.println(toe);
} finally {
if (myElement == null) {
String str = "Unable to find the WebElement in the web page by using its locator";
System.out.println(str);
}
}
return myElement;
}

public void waitForElementToBeVisible(ById element){
WebElement myElement = new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.visibilityOfElementLocated(element));
WebDriverWait wait= new WebDriverWait(driver,Duration.ofSeconds(5));
wait.until(ExpectedConditions.visibilityOf(myElement));
}

public void waitForElementToBeVisible(ByXPath element){
WebElement myElement = new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.visibilityOfElementLocated(element));
WebDriverWait wait= new WebDriverWait(driver,Duration.ofSeconds(5));
wait.until(ExpectedConditions.visibilityOf(myElement));
}
}
public class HomePage extends BasePage {
public HomePage(WebDriver driver) {
super(driver);
PageFactory.initElements(driver, this);
}

public final ById searchInput = new ById("twotabsearchtextbox");

public WebElement getSearchInput() {
return waitForElement(searchInput,30);
}

public void waitTillSearchVisible() {
waitForElementToBeVisible(searchInput);
}
}

SearchResultPage.class

public class SearchResultPage extends BasePage {
public SearchResultPage(WebDriver driver) {
super(driver);
PageFactory.initElements(driver, this);
}
public final ById logoBtn = new ById("nav-logo-sprites");
public final ByXPath item = new ByXPath("/html/body/div[1]/div[2]/div[1]/div[1]/div/span[3]/div[2]/div[4]/div/div/div/div/div[2]/div[2]/h2/a");
public WebElement getItem() {
return waitForElement(item, 30);
}
public WebElement getLogoBtn() {
return waitForElement(logoBtn, 30);
}
public void waitTillLogoVisible() {
waitForElementToBeVisible(logoBtn);
}
}

Now we need to create a package stepdefinition and write all the steps which will be used in feature file.

Hooks.java

public class Hooks {
public static WebDriver driver;
@Before
public void OpenDriver() {
System.setProperty("webdriver.chrome.driver", "src/test/resources/drivers/mac/chromedriver");
driver = new ChromeDriver();
}
@After
public void closeDriver() {
driver.close();
}
}

HomePageSteps.java

public class HomePageSteps {
private final HomePage homePage;
public HomePageSteps() {
this.homePage = PageObjectManager.pageFactory().getHomePage(Hooks.driver);
}
@Given("I'm on amazon")
public void onAmazon() {
Hooks.driver.get("https://www.amazon.com/");
this.homePage.waitTillSearchVisible();
}
@When("I select Search for {string}")
public void enterSearch(String enterText) {
WebElement searchInput = this.homePage.getSearchInput();
searchInput.clear();
searchInput.sendKeys(enterText);
searchInput.sendKeys(Keys.ENTER);
}
}

SearchPageSteps.java

public class SearchPageSteps {
public final SearchResultPage searchResultPage;
public SearchPageSteps() {
this.searchResultPage = PageObjectManager.pageFactory().getSearchResultPage(Hooks.driver);
}
@Then("I'm on result page")
public void onResultPage() {
this.searchResultPage.waitTillLogoVisible();
}
@And("I click on item")
public void clickOnItem() throws InterruptedException {
WebElement btn = this.searchResultPage.getItem();
btn.click();
Hooks.driver.wait(300);
}
}

Features file

Feature: Search item 
Scenario: Search for given item
Given I'm on amazon
When I select Search for "jackets"
Then I'm on result page
And I click on item

Now according to the statements in feature file Steps will be executed.

complete code is available at https://github.com/propardhu/cucumber-selenium β€¦!