1 year ago

#386648

test-img

LaN tHe MaN

Cucumber-POM hybrid framework implementation issues

I first created a POM model framework for a test practice with LOG4J, listners for Screenshots.

Later tried to add Cucumber BDD framework also into the same framework. I'm able to run the tests as expected, but facing two issues:

  1. POM Framework initial tests are able to take Screenshots, but BDD test fails with Null pointer exception, unable to get the driver object from the Methods.
  2. Logs not getting printed for BDD tests while works fine with POM tests.

Code

TestRunner.java
package cucumberRunner;
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
//import io.cucumber.junit.CucumberOptions;
import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;

//@RunWith(Cucumber.class)
@CucumberOptions(
        features="src/test/java/features",
        glue="stepDefinitions")
public class TestRunner extends AbstractTestNGCucumberTests {
    
    
}
MyStepDefinitions.java

package stepDefinitions;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.openqa.selenium.WebDriver;

import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import e2E4.UserLogins;
import pageObjects.LandingPage;
import pageObjects.LoggedOnPage;
import resources.BaseClass;

public class MyStepDefinitions extends BaseClass {
    public WebDriver driver;
    Logger log=LogManager.getLogger(UserLogins.class.getName());
    
    @Given("^Initialize browser with Chrome$")
    public void initialize_browser_with_Chrome() throws Throwable {
        driver = driverIni();
    }

    @Given("^Navigate to \"([^\"]*)\" website$")
    public void navigate_to_saucelabs_website(String arg1) throws Throwable {
        driver.get(arg1);
    }

    @When("^User enters \"([^\"]*)\" and \"([^\"]*)\" and Logs in$")
    public void user_enters_and_and_Logs_in(String arg1, String arg2) throws Throwable {
        LandingPage lp=new LandingPage(driver);
        lp.sendUsername().sendKeys(arg1);
        lp.sendPassword().sendKeys(arg2);
        lp.sendLoginBtn().click();
        log.info("Logging in");
    }

    @Then("^Verify if user successfully logged in$")
    public void verify_if_user_successfully_logged_in() throws Throwable {
        LoggedOnPage lop=new LoggedOnPage(driver);
        Assert.assertTrue(lop.filterbtn().isDisplayed());
        log.info("Logged in successfully");
    }

}

BaseClass.java

package resources;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.time.Duration;
import java.util.Properties;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class BaseClass {
    public WebDriver driver;
    public Properties prop;
    String dataPath=System.getProperty("user.dir");
    
    public WebDriver driverIni() throws IOException {
        
        FileInputStream fis=new FileInputStream(dataPath+"\\src\\main\\java\\resources\\data.properties");
        prop=new Properties();
        prop.load(fis);
        String browserRequired=prop.getProperty("browser");
        
        if(browserRequired.equalsIgnoreCase("chrome")) {
            System.setProperty("webdriver.chrome.driver", dataPath+"\\chromedriver.exe");
            driver=new ChromeDriver();
            
        }
        
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        
        return driver;
        
    }
    
    public String screenshot(String methodName, WebDriver driver) throws IOException {
        TakesScreenshot ts=(TakesScreenshot) driver;
        File source=ts.getScreenshotAs(OutputType.FILE);
        String dest=dataPath+"\\reports\\"+methodName+".png";
        FileUtils.copyFile(source, new File(dest));
        return dest;
    }
    
}

Listners.java

package e2E4;

import java.io.IOException;

import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;

import resources.BaseClass;
import resources.ExtendRep;

public class Listners extends BaseClass implements ITestListener {
    
    WebDriver driver=null;
    
    ExtendRep er=new ExtendRep();
    
    ExtentReports extent=er.getReports();
    
    ExtentTest test;
    
    ThreadLocal<ExtentTest> et=new ThreadLocal<ExtentTest>();
    
    public void onTestStart(ITestResult result) {
        test=extent.createTest(result.getMethod().getMethodName());
        et.set(test);
        
    }

    public void onTestSuccess(ITestResult result) {
        String methodName=result.getMethod().getMethodName();
        et.get().log(Status.PASS, "Test Passed Successfully");
        try {
            driver=(WebDriver)result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInstance());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        try {
            et.get().addScreenCaptureFromPath(screenshot(methodName,driver),result.getMethod().getMethodName());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void onTestFailure(ITestResult result) {
        String methodName=result.getMethod().getMethodName();
        et.get().fail(result.getThrowable());
        try {
            driver=(WebDriver)result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInstance());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        try {
                et.get().addScreenCaptureFromPath(screenshot(methodName,driver),result.getMethod().getMethodName());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void onTestSkipped(ITestResult result) {

    }

    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {

    }

    public void onTestFailedWithTimeout(ITestResult result) {

    }

    public void onStart(ITestContext context) {

    }

    public void onFinish(ITestContext context) {
        extent.flush();

    }

}

P.S : ExtentReports were working fine tho throu the Listners. Not able to figure it out :(

java

selenium

selenium-webdriver

cucumber

webautomation

0 Answers

Your Answer

Accepted video resources