Listener Code
Learn how to implement the listener class to capture screenshots, save exceptions info, and stack trace info and the names of the executed methods to logs.
The code of the Listener
class is given below:
Press + to interact
package Tests;import java.lang.reflect.Field;import org.testng.ITestContext;import org.testng.ITestListener;import org.testng.ITestResult;import framework.LogWriter;import framework.ScreenshotWriter;import org.openqa.selenium.OutputType;import org.openqa.selenium.TakesScreenshot;import org.openqa.selenium.WebDriver;public class Listener implements ITestListener {private LogWriter traceWriter;private LogWriter exceptionsWriter;public Listener(){this.exceptionsWriter = new LogWriter("./target/logs", "exceptions.log");this.traceWriter = new LogWriter("./target/logs", "trace.log");}@Overridepublic void onTestStart(ITestResult testResult){this.traceWriter.writeToLog("\n Test Name: " + testResult.getName());}@Overridepublic void onTestSuccess(ITestResult testResult){byte[] screenshotInfo = getScreenshot(testResult);saveScreenshot(screenshotInfo, "passed_" + testResult.getName());}@Overridepublic void onTestFailure(ITestResult testResult){byte[] screenshotInfo = getScreenshot(testResult);saveScreenshot(screenshotInfo, "failed_" + testResult.getName());saveExceptionInfo(testResult);}private byte[] getScreenshot(ITestResult testResult){TakesScreenshot driver = (TakesScreenshot)driver(testResult);byte[] screenshotInfo = driver.getScreenshotAs(OutputType.BYTES);return screenshotInfo;}private void saveScreenshot(byte[] screenshotInfo,String testName){ScreenshotWriter writer = new ScreenshotWriter();writer.writeToFile(screenshotInfo, testName);}private void saveExceptionInfo(ITestResult testResult){String testName = testResult.getName();String exceptionName = testResult.getThrowable().getMessage();String stackTrace = "";StackTraceElement[] stackElements =testResult.getThrowable().getStackTrace();for (int i = 0; i < stackElements.length - 1; i++)stackTrace = stackTrace + stackElements[i].toString() + "\n";this.exceptionsWriter.writeToLog(String.format("test = %s\n exception = %s\n stack trace = %s\n",testName,exceptionName,stackTrace));}@SuppressWarnings("unchecked")private WebDriver driver(ITestResult result){try {Class<?extends ITestResult> testClass =(Class<? extends ITestResult>)result.getInstance().getClass();Class<?extends ITestResult> baseClass =(Class<? extends ITestResult>)testClass.getSuperclass();Field field = baseClass.getDeclaredField("driver");WebDriver driver = (WebDriver)field.get(result.getInstance());return driver;}catch (SecurityException | NoSuchFieldException | IllegalAccessException | IllegalArgumentException e){throw new IllegalStateException("could not get the driver!", e);}}@Overridepublic void onTestSkipped(ITestResult result){}@Overridepublic void onTestFailedButWithinSuccessPercentage(ITestResult r){}@Overridepublic void onStart(ITestContext context){}@Overridepublic void onFinish(ITestContext c){}}
This is probably the most complex class of the solution, so ...