0

Please help me in resolving NPE, where I am creating objects for LoginPage.Java and CamapaignPage.Java in my BaseTest.Java class in @BeforeTest method. When I tried call these objects in my test classes everything is working fine for LoginPage object but getting NPE for CampaignPage object. Adding code snippets below. Any help would be appreciable in advance. BaseSetup.Java

package com.paytm.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

public class BaseSetup {

    public WebDriver driver;
    public static Properties config = new Properties();
    public Logger BASE_LOGGER = LoggerFactory.getLogger(BaseSetup.class);
    public WebDriverWait wait;

    String browser = config.getProperty("browser");

    public WebDriver initDriver(){
        if (browser.equals("chrome")){
            driver = new ChromeDriver();
            driver.get(config.getProperty("url"));
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
        }
        return driver;
    }

    public WebDriverWait explicitWait(WebDriver driver, int seconds){
        return new WebDriverWait(driver, Duration.ofSeconds(seconds));
    }

    public void javaWait(int seconds){
        try {
            Thread.sleep(seconds*1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    static {
        String filePath = "./config.properties";
        try {
            final FileInputStream fin = new FileInputStream(filePath);
            config.load(fin);
            fin.close();
        } catch (IOException ie) {
            //test.log(LogStatus.WARNING, "File not found: " + ie.getLocalizedMessage());
            ie.getLocalizedMessage();
        }
    }

}

BaseTest.Java

package com.paytm;

import com.paytm.base.BaseSetup;
import com.paytm.pages.CampaignPage;
import com.paytm.pages.LoginPage;
import org.testng.annotations.*;

public class BaseTest extends BaseSetup {

    LoginPage loginPage;
    CampaignPage campaignPage;

    @BeforeTest
    public void initPageObjects(){
        loginPage = new LoginPage(driver);
        campaignPage = new CampaignPage(driver);
    }

    @BeforeSuite
    public void setupBrowser(){
        driver = initDriver();
    }

    @AfterSuite
    public void tearBrowser(){
        driver.quit();
    }
}

LoginPage.Java

package com.paytm.pages;

import com.paytm.base.BaseSetup;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;

public class LoginPage extends BaseSetup{

    @FindBy(xpath = "a[contains(text(),'Accept')]")
    WebElement cookiesAlertAccept;

    @FindBy(xpath = "//*[name()='svg' and @class='hmenu']")
    WebElement hamburgerIcon;

    @FindBy(xpath = "//a[contains(text(), 'Sign in with Email')]")
    WebElement emailOption;

    @FindBy(xpath = "//iframe[@title='Popup CTA']")
    WebElement adPopUpFrame;

    @FindBy(xpath = "//iframe[@id=']iframe']")
    WebElement sigInIframe;

    @FindBy(xpath = "//input[@]id='input_email']")
    WebElement emailInput;

    @FindBy(xpath = "//input[@oid='input_password']")
    WebElement passwordInput;

    @FindBy(xpath = "//*[name()='svg']")
    WebElement closeAd;

    @FindBy(xpath = "//div[@class='677656578']/button")
    WebElement signInButton;

    @FindBy(xpath = "//button[@alt='Verify']")
    WebElement verifyOtpButton;


    public LoginPage(WebDriver driver){
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    public void acceptCookiesAlert(){
        wait = explicitWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(cookiesAlertAccept));
        cookiesAlertAccept.click();
    }

    public void closeAdPopUp(){
        driver.switchTo().frame(adPopUpFrame);
        closeAd.click();
        driver.switchTo().defaultContent();
    }

    public void hamburgerClick(){
        wait = explicitWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(hamburgerIcon));
        hamburgerIcon.click();
    }

    public void clickEmailOption(){
        wait = explicitWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(emailOption));
        emailOption.click();
    }

    public void sendEmail(){
        wait = explicitWait(driver, 10);
        driver.switchTo().frame(sigInIframe);
        wait.until(ExpectedConditions.elementToBeClickable(emailInput));
        emailInput.sendKeys(config.getProperty("email"));
    }

    public void sendPassword(){
        wait = explicitWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(passwordInput));
        passwordInput.sendKeys(config.getProperty("password"));
    }

    public void clickSignInButton(){
        wait = explicitWait(driver, 10);
        if (signInButton.isEnabled()){
            wait.until(ExpectedConditions.elementToBeClickable(signInButton));
            signInButton.click();
        }
        javaWait(10);
    }

    public void clickVerifyOtpButton(){
        wait = explicitWait(driver, 10);
        if (verifyOtpButton.isEnabled()){
            wait.until(ExpectedConditions.elementToBeClickable(verifyOtpButton));
            verifyOtpButton.click();
        }
    }
}

CampaignPage.Java

package com.paytm.pages;

import com.paytm.base.BaseSetup;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;

public class CampaignPage extends BaseSetup {

    @FindBy(xpath = "//button[text()='Create a New Campaign']")
    WebElement createCampaignButton;

    public CampaignPage(WebDriver driver){
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    public String getPageTextAfterLogin(){
        wait = explicitWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(createCampaignButton));
        return createCampaignButton.getText();
    }
}

LoginPageTest.Java

package com.paytm;

import org.testng.Assert;
import org.testng.annotations.Test;

public class LoginPageTest extends BaseTest {

    @Test(priority = 1)
    public void acceptCookieAndCloseAdPopUpCTA(){
        loginPage.acceptCookiesAlert();
        javaWait(5);
        loginPage.closeAdPopUp();
    }

    @Test(priority = 2)
    public void clickHamburgerIcon(){
        loginPage.hamburgerClick();
    }

    @Test(priority = 3)
    public void clickEmailOption(){
        loginPage.clickEmailOption();
    }

    @Test(priority = 4)
    public void inputEmailId(){
        loginPage.sendEmail();
    }

    @Test(priority = 5)
    public void inputPassword(){
        loginPage.sendPassword();
    }

    @Test(priority = 6)
    public void clickSignInButton(){
        loginPage.clickSignInButton();
        javaWait(10);
    }

    @Test(priority = 7)
    public void clickVerifyOtpButton(){
        loginPage.clickVerifyOtpButton();
    }
}

CampaignPageTest.Java

package com.paytm;

import org.testng.Assert;
import org.testng.annotations.Test;

public class CampaignPageTest extends BaseTest{

    @Test(priority = 1)
    public void verifyAvailabilityOfCampaignCreateButton(){
        String createCampaignButtonText = campaignPage.getPageTextAfterLogin();
        Assert.assertEquals(createCampaignButtonText, "Create a New Campaign");
    }
}

saniy.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Manager portal" verbose="1" annotations="TestNG">

    <test name="UserTargetin">
        <classes>
            <class name="com.paytm.LoginPageTest"/>
            <class name="com.paytm.CampaignPageTest"/>
        </classes>
    </test>

</suite>

When I added only CampaignPageTest class in xml file, code will work but when I try with both LoginPageTest and CampaignPageTest getting NPE for CampaignPage.java class.

Console logs

java.lang.NullPointerException at com.paytm.CampaignPageTest.verifyAvailabilityOfCampaignCreateButton(CampaignPageTest.java:10) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:141) at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:686) at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:230) at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:63) at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:992) at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:203) at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:154) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:134) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.testng.TestRunner.privateRun(TestRunner.java:739) at org.testng.TestRunner.run(TestRunner.java:614) at org.testng.SuiteRunner.runTest(SuiteRunner.java:421) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:413) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:373) at org.testng.SuiteRunner.run(SuiteRunner.java:312) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1274) at org.testng.TestNG.runSuitesLocally(TestNG.java:1208) at org.testng.TestNG.runSuites(TestNG.java:1112) at org.testng.TestNG.run(TestNG.java:1079) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:65) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105)

1
  • null pointers can sometimes be difficult to track down. There is a case here where your driver will be null. When browser.equals("chrome") is not true. You might have a fallback there just to be sure you don't return null. It is sort of muddying up things to return driver from that initdriver call. (I don't think that's your problem, though, since your login page wouldn't work either...) Commented Oct 18, 2024 at 21:23

1 Answer 1

0

If the code and stacktrace correspond, it they are saying that campaignPage is null.

That implies that BaseTest.initPageObjects was not called. Add some traceprints (or something) to confirm that.

Sign up to request clarification or add additional context in comments.

9 Comments

As I am using @BeforeTest annotation, so BaseTest.initPageObjects will be called before invoking test node in xml file. As I mentioned in description if I call only CampaignPageTest class from xml file then I wont get NPE
Did you CONFIRM that by adding a traceprint? The first lesson of debugging is to validate your assumptions. The second one is to look at the evidence.
Yes, I checked by printing the traces before and after object creation.
And did you confirm that campaignPage is null or not null?
And that the NPE is really occuring on this line: String createCampaignButtonText = campaignPage.getPageTextAfterLogin(); ?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.