Здравствуйте! Только начинаю осваивать автоматизацию и java. Уже несколько дней не могу решить проблему
Есть несколько классов с методами
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();
}
}
Есть класс 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");
}
}
Тестовые класы
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();
}
}
Всегда после выполнения первого класса, на втором падает NullPointerException. Вероятно ошибка где то в testng.xml или же в анотация в Main Test, но не могу поянть в чем именно. Пробывал различные вариации анотаций но ничего не помогло, либо никакой класс не раниться либо только первый
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)
Да у меня есть интерфейс в котором я храню все настройки инваеренмента, в этом случае просто урла
Все что вы задаете в BeforeSuite/BeforeTest после выполнения одного тестового класса будет выдавать вам NullPointer на тестак в слкдующем классе.
Решения:
Если вам не нужна паралелизация тестов то сделать static driver, static homePage, static logInPage
Еcли нужна то использовать @BeforeMethod и там задавать все что нужно
НE задавать в бефоре logInPage = new LogInPage(webDriver, webDriverWait)
А делать это именно в тесте.
Спасибо! Помогло добавление static, а для того что бы все тесты ранились в одном потоке помогло добавление к тегу suit настройки parallel=“instances” thread-count=“1”
Тогда все тесты раняться в одном потоке последовательно.
А 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 например смоук или критикал или регрессия, куда включаю уже непосредственно те методы из тестовых классов которые мне нужны. Мне так удобний настраивать сьюты для того или иного случая