t.me/atinfo_chat Telegram группа по автоматизации тестирования

NullPointerException после исполнения первого тестового класса

Теги: #<Tag:0x00007f748a03baf0> #<Tag:0x00007f748a03ba00> #<Tag:0x00007f748a03b910> #<Tag:0x00007f748a03b848> #<Tag:0x00007f748a03b5c8> #<Tag:0x00007f748a03b460>

Здравствуйте! Только начинаю осваивать автоматизацию и java. Уже несколько дней не могу решить проблему

  1. Есть несколько классов с методами
public class HomePage implements Xpath {

    WebDriver webDriver;
    WebDriverWait webDriverWait;

    public HomePage(WebDriver webDriver, WebDriverWait webDriverWait) {
        this.webDriver = webDriver;
        this.webDriverWait = webDriverWait;
    }

    public void NavigateToLandinhPage(String Environment) {
        webDriver.get(Environment);
    }

    public void NavigateCharts() {
        webDriverWait.until(ExpectedConditions.presenceOfElementLocated(chartsButton));
        webDriver.findElement(chartsButton).click();
    }

    public void NavigateJoinFree() {
        webDriverWait.until(ExpectedConditions.presenceOfElementLocated(joinFreeButton));
        webDriver.findElement(joinFreeButton).click();
    }

    public void NavigateToLogIn() {
        webDriverWait.until(ExpectedConditions.presenceOfElementLocated(logInButton));
        webDriver.findElement(loginButton).click();
    }

}
public class LogInPage implements Xpath {

    WebDriver webDriver;
    WebDriverWait webDriverWait;

    public LogInPage(WebDriver webDriver, WebDriverWait webDriverWait) {
        this.webDriver = webDriver;
        this.webDriverWait = webDriverWait;
    }

    public void LogIn(String logIn, String password) {
        webDriver.findElement(loginField).sendKeys(logIn);
        webDriver.findElement(passwordField).sendKeys(password);
        webDriver.findElement(loginButton).click();
    }
}
  1. Есть класс MainTest от которого наследуються все остальные тестовые классы
public class MainTest implements TestsInterface {

    WebDriver webDriver;
    WebDriverWait webDriverWait;

    HomePage homePage;
    TestMethods waitDOM;
    LogInPage logInPage;

    @BeforeSuite
    public void setUp() {
        WebDriverManager.chromedriver().setup();
        webDriver = new ChromeDriver();
        webDriverWait = new WebDriverWait(webDriver, timeOutSeconds);
        System.out.println("WebDriver setup process is completed");
    }
    
    @BeforeTest
    public void profileSetup() {
        waitDOM = new TestMethods(webDriver, webDriverWait);
        homePage = new HomePage(webDriver, webDriverWait);
        logInPage = new LogInPage(webDriver, webDriverWait);

        webDriver.manage().window().maximize();
        System.out.println("The profile setup process is completed");
    }
    
    @AfterSuite
    public void cleanUp() {
        webDriver.quit();
        System.out.println("The close_up process is completed");
    }
}
  1. Тестовые класы
public class HomePageTest extends MainTest {

    @Test
    public void landing() {
        homePage.NavigateToLandinhPage(Environment);
    }

    @Test
    public void navigateToLogIn() {
        waitDOM.waitForPageLoaded();
        homePage.NavigateToLogIn();
    }
}
public class LogInTest extends MainTest {

    @Test
    public void LogIn() {

        logInPage.LogIn(logIn, password);
        waitDOM.waitForPageLoaded();
    }
}
  1. Собственно testng.xml
<suite name="TestSuite">
<test name="Auto Test">
    <classes>
        <class name="HomePageTest">
                <methods>
                    <include name="landing"/>
                    <include name="navigateToLogIn"/>
                </methods>
        </class>
        <class name="LogInTest"/>
    </classes>
</test>
</suite>

Всегда после выполнения первого класса, на втором падает NullPointerException. Вероятно ошибка где то в testng.xml или же в анотация в Main Test, но не могу поянть в чем именно. Пробывал различные вариации анотаций но ничего не помогло, либо никакой класс не раниться либо только первый

Так приведите весь стэктрейс, на какой строчке происходит NullPointerE?
homePage.NavigateToLandinhPage(Environment); - вот откуда берётся Environment?

java.lang.NullPointerException
at LogInTest.LogIn(LogInTest.java:8)
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:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.testng.TestRunner.privateRun(TestRunner.java:770)
at org.testng.TestRunner.run(TestRunner.java:591)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at org.testng.SuiteRunner.run(SuiteRunner.java:304)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at org.testng.TestNG.runSuites(TestNG.java:1032)
at org.testng.TestNG.run(TestNG.java:1000)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

  1. Да у меня есть интерфейс в котором я храню все настройки инваеренмента, в этом случае просто урла

Все что вы задаете в BeforeSuite/BeforeTest после выполнения одного тестового класса будет выдавать вам NullPointer на тестак в слкдующем классе.
Решения:

  1. Если вам не нужна паралелизация тестов то сделать static driver, static homePage, static logInPage
  2. Еcли нужна то использовать @BeforeMethod и там задавать все что нужно
  3. НE задавать в бефоре
    logInPage = new LogInPage(webDriver, webDriverWait)
    А делать это именно в тесте.
1 Симпатия

Спасибо! Помогло добавление static, а для того что бы все тесты ранились в одном потоке помогло добавление к тегу suit настройки parallel=“instances” thread-count=“1”

Теперь testng.xml выглядит так:

<suite name="Test Suite" parallel="instances" thread-count="1">
    <test name="Auto Test">
        <classes>
            <class name="HomePageTest">
                <methods>
                    <include name="Landing"/>
                    <include name="NavigateToLogIn"/>
                </methods>
            </class>
            <class name="LogInTest"/>
        </classes>
    </test>
</suite>

Тогда все тесты раняться в одном потоке последовательно.

А Main Test выглядит так:

public class MainTest implements TestsInterface {

    WebDriver webDriver;
    WebDriverWait webDriverWait;

    static HomePage homePage;
    static TestMethods waitDOM;
    static LogInPage logInPage;

    @BeforeSuite
    public void setUp() {
        WebDriverManager.chromedriver().setup();
        webDriver = new ChromeDriver();
        webDriverWait = new WebDriverWait(webDriver, timeOutSeconds);
        System.out.println("WebDriver setup process is completed");
    }

    @AfterSuite
    public void cleanUp() {
        webDriver.quit();
        System.out.println("The close_up process is completed");
    }
}

Идея всего этогоподхода в том что у меня есть класс, в котором опсанны элементы и дествия с элементами на странице. Есть тестовый класс к этой странице, где всевозможные тесты с элементами этой страницы. А с помощью TestNG я создаю уже не посредственно suit например смоук или критикал или регрессия, куда включаю уже непосредственно те методы из тестовых классов которые мне нужны. Мне так удобний настраивать сьюты для того или иного случая

А что за фреймворк вы используете, атлас?

тут такой ящик Пандоры, проблем вы для себя постороили уже с этими 3-5 классами

  • static переменные, скажи пока параллелизации
  • testng.xml file - сложности с конфигурацией и какждый раз модификауия самого файла
  • передача WebDriverWait в каждую страицу, если его можно сделать из самаого же WebDriver