Ошыбка "NullPointerException" при передаче драйвера в другой клас

Проблема (Вопрос) заключается в том, что при передаче драйвера объекту и попытке поиска элемента, появляется ошибка NullPointerException, но если этот элемент искать с теста, тогда все ок.

public class DemoTest {

   private WebDriver driver;

   @Test
   public void userLogin() {
       driver = HelperChromeDriver.setUp("https://javarush.ru");
       new BasePage(driver);
       HelperChromeDriver.closeDown();
   }
public class HelperChromeDriver {

    private static WebDriver driver;

    @Before
    public static WebDriver setUp(String URL) {
        System.setProperty("webdriver.chrome.driver", "/javarushautotest/drivers/chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get(URL);
        return driver;
    }


    @After
    public static void closeDown() {
        driver.quit();
    }

}
public class BasePage {
    private WebDriver driver;

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

    //oll left menu
    private WebElement lMenuCourse = driver.findElement(By.linkText("Курс"));

    public CoursePage goCoursePage(){
        lMenuCourse.click();
        return new CoursePage(driver);
    }
}

Логи и ошибка вот такая:
java.lang.NullPointerException
at ru.javarush.BasePage.(BasePage.java:21)
at ru.javarush.DemoTest.userLogin(DemoTest.java:16)

А вот если иска элемент прямо в тесте, тогда все ок:

public class DemoTest {

    private WebDriver driver;

    @Test
    public void userLogin() {
        driver = HelperChromeDriver.setUp("https://javarush.ru");
        WebElement lMenuCourse = driver.findElement(By.linkText("Курс"));
        HelperChromeDriver.closeDown();
    }


}

//oll left menu
private WebElement lMenuCourse = driver.findElement(By.linkText(“Курс”));

Этот код исполняется до тела конструктора, т.е. в этот момент driver = null, отсюда и NPE.

А вообще, у вас каша в коде и, судя по всему, в голове. Разберитесь с тем, как работает джава и JUnit.

1 лайк

Спасибо большое, забыл про порядок инициализации.
По поводу каши - полностью согласен.
Ничего, со временем все устаканится.

  1. Зачем вашей базовой пейдже знать что-либо о domain specific компонентах? Теряется ведь вся суть подобной абстракции.
  2. Почитайте на досуге последовательность действий, выполняемых при конструировании нового объекта. В частности, о порядке инициализации instance variables. Как выдумаете, значение driver успевает засетится до непосредственного вызова поиска элемента?
  3. Никогда так не пишите. Поищите на форуме тонны примеров правильной структуры Page Objects и локаторов.

П.С. Пока дописал, уже ответили. :slight_smile:

1 лайк

ОК, спасибо, буду изучать мат.часть.