Ошибка исключения нулевого указателя TestNG при работе со страницей, открытой предыдущим тестовым случаем

#java #selenium #selenium-webdriver #intellij-idea #testng

Вопрос:

Я использую объектную модель TestNG и Page. Я создал несколько тестовых примеров. Я вижу, что первые два тестовых случая работают. Но третий тестовый случай начинается на новой странице, которая открывается вторым тестовым случаем. Я не могу взаимодействовать с новой страницей и получаю ошибку исключения нулевого указателя. Не знаю, что пошло не так.

У меня здесь три класса Java.

Это мой базовый класс:

 package MYQC_Reusable_Classes;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;

public class MYQC_Base_Class {

    public static WebDriver driver = null;
   // public static ExtentTest Logger = null;
  //  public static ExtentReports report = null;


    @BeforeSuite
    public void initialize() throws IOException {
     //   report = new ExtentReports("C:\Users\fhasan\Desktop\ExtentReport" ".html");
        System.setProperty("webdriver.chrome.driver", "C:\Users\fhasan\Desktop\driver\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();`enter code here`
        // add the precondition arguments
        options.addArguments("start-maximized", "incognito");
        driver = new ChromeDriver(options);
        // To maximize browser
        driver.manage().window().maximize();
        // Implicit wait
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @BeforeMethod
    public void timer(){
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
    @AfterSuite
    // Test cleanup
    public void TeardownTest() throws InterruptedException {
        Thread.sleep(4000);
        MYQC_Base_Class.driver.quit();
    }
}
 

Это мой класс страницы:

 package MYQC_Browser_Pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

public class MYQC_Login_Page {

    WebDriver driver;

    // constructor that will be automatically called as soon as the object of the
    // class is created
    public MYQC_Login_Page(WebDriver driver) {
        this.driver = driver;
    }

    @FindBy(how = How.ID, using = "loginName")
    public static WebElement userNameField;

    @FindBy(how = How.ID, using = "loginPassword")
    public static WebElement passwordField;

    @FindBy(how = How.ID, using = "loginButton")
    public static WebElement clickLogin;


    //Method to enter username
    public void clickUserName() {
        userNameField.click();

    }

    public void enterUserName(String user) {
        userNameField.sendKeys(user);

    }

    public void clickPass() {
        passwordField.click();

    }

    public void enterPassword(String pass) {
        passwordField.sendKeys(pass);

    }

    //Method to click on Login button
    public void clickLoginButton() {
        clickLogin.click();
    }

}
 

This is my first test case which works fine:

 package MYQC_TestCase_Classes;

import MYQC_Browser_Pages.CUST4_MYQC_Login_Selection_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;
import java.util.PriorityQueue;

public class TC001_MYQC_Login_Selection_Button_Text extends MYQC_Base_Class {


    @Test()
    public void MYQC_Login_Button_Text() throws InterruptedException, IOException {
        //creating anb object of the CUST4_MYQC_Login_Selection_Page
        CUST4_MYQC_Login_Selection_Page go_To_MYQC_Page = PageFactory.initElements(driver, CUST4_MYQC_Login_Selection_Page.class);

        // going to the cust4 myqc link
        driver.get("https://mmhcustfour.com");
        Thread.sleep(3000);
        Assert.assertEquals(go_To_MYQC_Page.buttonText(), "Login with Quickcharge Authentication");
        //System.out.print( go_To_MYQC_Page.buttonText());

    }

    }
 

This is my second test case (on the same page) which also works fine:

 package MYQC_TestCase_Classes;

import MYQC_Browser_Pages.CUST4_MYQC_Login_Selection_Page;
import MYQC_Browser_Pages.MYQC_Login_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
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.support.PageFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;

public class TC002_MYQC_Login_Selection_Test extends MYQC_Base_Class {

    @Test
    public void Go_To_MYQC_Login_Page_Test() throws InterruptedException, IOException {
        //creating anb object of the CUST4_MYQC_Login_Selection_Page
        CUST4_MYQC_Login_Selection_Page go_To_MYQC_Page = PageFactory.initElements(driver, CUST4_MYQC_Login_Selection_Page.class);
        //Clicking on the button to go to the MYQC login page
        go_To_MYQC_Page.preClickLogin();
        // waiting few seconds to get a screenshot of the page
        Thread.sleep(2000);
        File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(src, new File("C:\Users\fhasan\Desktop\Selenium Screenshots\MYQCLogin_Page.png"));
        Thread.sleep(2000);
    }

}
 

This is my third test case class: (which creates the error)

 package MYQC_TestCase_Classes;

import MYQC_Browser_Pages.MYQC_Login_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class TC003_MYQC_Prepaid_Login_Test extends MYQC_Base_Class {

    //creating an object of the page

    MYQC_Login_Page login_page = PageFactory.initElements(driver,MYQC_Login_Page.class);


    @Test
    public void MYQC_Login() throws InterruptedException {
        Thread.sleep(2000);
        login_page.clickUserName();
        login_page.enterUserName("***");
        Thread.sleep(2000);
        login_page.clickPass();
        login_page.enterPassword("***");
        login_page.clickLoginButton();


    }
}
 

После запуска кода я получаю следующую ошибку:

 java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy9.click(Unknown Source)
at MYQC_Browser_Pages.MYQC_Login_Page.clickUserName(MYQC_Login_Page.java:30)
at MYQC_TestCase_Classes.TC003_MYQC_Prepaid_Login_Test.MYQC_Login(TC003_MYQC_Prepaid_Login_Test.java:20)
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:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
at org.testng.TestNG.run(TestNG.java:1031)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
    
 

Комментарии:

1. Вы все отладили ? Похоже, драйвер не инициализирован, и вы передаете значение null

2. Спасибо вам за ваш ответ. Я инициализировал драйвер @BeforeSuite, и он отлично работает в первых двух тестовых случаях. Мне интересно, нужно ли мне что-нибудь сделать, прежде чем работать над текущим тестовым примером.

3. Где вы запускаете страницу? драйвер.получить(url)?

4. Почему ваши поля объектов страницы статичны?

5. @NandanA Стартовая страница была создана в предыдущем тестовом примере, который работает нормально. @Test() public void MYQC_Login_Button_Text() вызывает исключение прерывания, исключение ввода-вывода { //создание объекта страницы CUST4_MYQC_Login_Selection_Page Страница CUST4_MYQC_Login_Selection_Page Страница go_To_MYQC_Page = PageFactory.initElements(драйвер, CUST4_MYQC_Login_Selection_Page.class); // переходим по ссылке driver.get(» mmhasan345.com» );

Ответ №1:

ваш элемент имени пользователя не найден в вашем 3-м тесте, пожалуйста, выполните следующие действия

на страницах MYQC_Browser_Pages.MYQC_Login_Page.Имя пользователя(MYQC_Login_Page.java:30)

  1. Пожалуйста, добавьте скриншот непосредственно перед вводом имени пользователя,
  2. Добавьте время ожидания, чтобы полностью загрузить веб-сайт.

все равно бесполезно, лучше вам изолировать все ваши методы тестирования.

  1. отсутствие статических свойств
  2. вход и выход из системы должны быть выполнены до метода и после метода — метод тестирования должен быть независимым
  3. используйте общий метод для утверждений, поэтому всякий раз, когда получить не удалось, автоматически добавляйте скриншот

Комментарии:

1. Спасибо. Я пытался это сделать. Все та же проблема.