Вы смешали прослушиватели TestNG и аннотации, связанные с Testclass, и это является причиной NullPointerException
Я предполагаю, что у вас есть тестовый класс, который также расширяет BaseTest
. Для примера давайте назовем этот класс RegressionTest
.
TestNG теперь создает два экземпляра:
- 1 экземпляр для
RegressionTest
класс
- 1 экземпляр для
testNgListners
класса.
Но суть в том, что при создании экземпляра testNgListners
аннотации @BeforeMethod
и @AfterMethod
вообще не вызываются, потому что эти аннотации не имеют никакого отношения к контексту слушателя.
Чтобы это исправить, вам нужно сделать следующее:
- Refactor
testNgListners
, чтобы он не расширялся BaseTest
- Теперь в
BaseTest
уберите из него логику и очистку браузера.
- Вы должны управлять созданием вашего браузера через прослушиватель TestNG, потому что ваш драйвер также будет использовать объект драйвера для создания снимков экрана в случае сбоя.
Вот как будет выглядеть модифицированный слушатель:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.PageLoadStrategy;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.Reporter;
public class BrowserManagementListener implements ITestListener {
private static final String BROWSER = "browser";
private File file =
new File("\\\\192.168.70.39\\IT Share\\Automation\\ERP Automation\\credential.properties");
private Properties prop = new Properties();
public static RemoteWebDriver getDriver() {
ITestResult result = Reporter.getCurrentTestResult();
if (result == null) {
throw new IllegalStateException("could not detect a valid test result");
}
Object object = result.getAttribute(BROWSER);
if (object == null) {
throw new IllegalStateException("could not find a browser");
}
return (RemoteWebDriver)object;
}
@Override
public void onTestStart(ITestResult result) {
// This line retrieves the value of
// <parameter name="browser" value="chrome"/> from your testng suite xml
String browser = result.getTestContext().getCurrentXmlTest().getParameter("browser");
if ("chrome".equalsIgnoreCase(browser)) {
FileInputStream fileInput = null;
try {
fileInput = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
prop.load(fileInput);
} catch (Exception e) {
e.printStackTrace();
}
}
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
RemoteWebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
result.setAttribute(BROWSER, driver);
}
@Override
public void onTestSuccess(ITestResult result) {
cleanUpBrowser(result);
}
@Override
public void onTestFailure(ITestResult result) {
Object object = result.getAttribute(BROWSER);
if (object == null) {
return;
}
RemoteWebDriver driver = (RemoteWebDriver) object;
File srcFile = driver.getScreenshotAs(OutputType.FILE);
File destFile = new File("test-output/" + result.getName() + ".png");
try {
FileUtils.copyFile(srcFile, destFile);
System.out.println("Screenshot is been taken for failed test case: " + result.getName());
System.err.println("Screenshot below" + destFile.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
} finally {
cleanUpBrowser(result);
}
}
private void cleanUpBrowser(ITestResult result) {
Object driver = result.getAttribute(BROWSER);
if (driver != null) {
((RemoteWebDriver) driver).quit();
result.setAttribute(BROWSER, null);
}
}
}
А вот как будет выглядеть тестовый класс
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(BrowserManagementListener.class)
public class SampleTestClass {
@Test
public void testMethod() {
BrowserManagementListener.getDriver().get("http://www.google.com");
throw new RuntimeException("Simulating an error");
}
}