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)