Как исправить ошибку NullPointerException при вызове методов из объектов страницы в тестовых случаях селена с помощью TestNG?

Я создал Page Object Model для тестовых сценариев селемия. Я определил метод входа в класс «LoginPage» и некоторые методы в классе «CommonMethods». Теперь, когда я запускаю тест, он показывает ошибку NullPointerException. Я сделал то же самое с JUnit, и он отлично работал с этой настройкой, но не работал с TestNG.

Это мой файл объекта страницы:

package pages;

import org.openqa.selenium.WebDriver;

public class PageObject {

    public WebDriver driver;

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

Файл CommonMethods


package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class CommonMethods extends PageObject {

    public CommonMethods(WebDriver driver) {
        super(driver);
    }

    public By ByLocator(String locator) {
        By result=null;
        if(locator.startsWith("/")||locator.startsWith("//"))
            result=By.xpath(locator);
        else if(locator.startsWith(".")||locator.startsWith("#"))
            result=By.cssSelector(locator);
        return result;
    }

    public void waitForElementPresent(By locator, int time) {
        WebDriverWait wait = new WebDriverWait(driver, time);
        wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
    }
}

Файл LoginPage


package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class LoginPage extends PageObject {

    public LoginPage(WebDriver driver) {
        super(driver);
    }

    CommonMethods cm = new CommonMethods(driver);

    By usernameField = cm.ByLocator("#login");
    By passwordField = cm.ByLocator("#password");
    By submitButton = cm.ByLocator("#signin_submit");

    public void loginWithCustomer() {
        driver.get("https://www.stg.keepcollective.com/signin");
        //cm.waitForElementPresent(usernameField, 3000);
        driver.findElement(usernameField).sendKeys("joshimeghakeep@yopmail.com");
        driver.findElement(passwordField).sendKeys("111111");
    }
}

Тестовый файл

package tests;

import org.testng.annotations.Test;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;

import java.io.*;

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;
import org.testng.ITestResult;
import org.testng.annotations.AfterClass;

import pages.*;

public class LoginCheck {

    public WebDriver driver;

    CommonMethods cm=new CommonMethods(driver);
    LoginPage lp=new LoginPage(driver);

    @BeforeClass
    public void beforeClass() throws Exception {
        System.setProperty("webdriver.chrome.driver", "/home/himanshu/Downloads/chromedriver_linux64/chromedriver");
        driver= new ChromeDriver();  
    }

    @Test
    public void checkLoginFunctionality() {
      lp.loginWithCustomer();
    }

    @AfterMethod
    public void Screenshot(ITestResult result) throws IOException {
       if(result.getStatus()==ITestResult.FAILURE) {
           TakesScreenshot ss= (TakesScreenshot)driver;
           File screenshotfile = ss.getScreenshotAs(OutputType.FILE);
           FileUtils.copyFile(screenshotfile, new File("./Screenshots/"+result.getName()+".png"));
       }
    }

    @AfterClass
    public void afterClass() {
        driver.close();
    }
}

Я получаю эту ошибку:

    FAILED: checkLoginFunctionality
    java.lang.NullPointerException
        at pages.LoginPage.loginWithCustomer(LoginPage.java:19)
        at tests.LoginCheck.checkLoginFunctionality(LoginCheck.java:35)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
        at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
        at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
        at org.testng.TestRunner.privateRun(TestRunner.java:648)
        at org.testng.TestRunner.run(TestRunner.java:505)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
        at org.testng.SuiteRunner.run(SuiteRunner.java:364)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
        at org.testng.TestNG.runSuites(TestNG.java:1049)
        at org.testng.TestNG.run(TestNG.java:1017)
        at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
        at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
        at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

Всего 1 ответ


Переместите инициализацию CommonMethods cm и LoginPage lp в метод beforeClass() и поместите его после создания ChromeDriver . @BeforeClass не означает, что этот метод будет выполняться до инициализации класса LoginCheck . Это означает, что этот метод будет выполнен до выполнения любых других методов в этом классе.

public class LoginCheck {

    public WebDriver driver;
    private CommonMethods cm;
    private LoginPage lp;

    @BeforeClass
    public void beforeClass() throws Exception {
        System.setProperty("webdriver.chrome.driver", "/home/himanshu/Downloads/chromedriver_linux64/chromedriver");
        driver= new ChromeDriver();
        cm = new CommonMethods(driver);
        lp = new LoginPage(driver);
    }

    @Test
    public void checkLoginFunctionality() {
        lp.loginWithCustomer();
    }

    @AfterMethod
    public void Screenshot(ITestResult result) throws IOException {
        if(result.getStatus()==ITestResult.FAILURE) {
             TakesScreenshot ss= (TakesScreenshot)driver;
             File screenshotfile = ss.getScreenshotAs(OutputType.FILE);
             FileUtils.copyFile(screenshotfile, new File("./Screenshots/"+result.getName()+".png"));
        }
    }

      @AfterClass
      public void afterClass() {
          driver.close();
      }
    }

Есть идеи?

10000