I keep getting NullPointerException for my Listener's WebDriver. is this because I used ThreadLocal on my WebDriver in base class? if so how do I get the test case's driver for my listener's onTestSuccess method?
This is my Listener Class:
@Override
public void onTestSuccess(ITestResult result) {
extentTest.get().log(Status.PASS,"Test Passed");
WebDriver driver = null;
Object testObject = result.getInstance();
Class clazz = result.getTestClass().getRealClass();
try {
driver = (WebDriver)clazz.getField("webdriver").get(testObject);
} catch (Exception e) {
}
try {
extentTest.get().addScreenCaptureFromPath(getScreenShotPath(result.getMethod().getMethodName(), driver), result.getMethod().getMethodName());
} catch (IOException e) {
e.printStackTrace();
}
}
BaseClass:
public ThreadLocal<WebDriver> webdriver = new ThreadLocal<WebDriver>();
@BeforeClass
public void setup() {
Reporter.log("@@@@@ Setup @@@@@",true);
ExtentReports extent = ExtentReport.extentReportGenerator();
}
@BeforeMethod
public void startBrowser() {
WebDriverFactory webDriverFactory = new WebDriverFactory();
webDriverFactory.setDriver();
webdriver.set(webDriverFactory.getDriver());
webdriver.get().get(baseURL);
TestCase Class:
@Test(dataProvider = "jsonData", dataProviderClass = TestData.class)
public void testAggregator(String jSon) throws ParseException {
extent.createTest("Test The Welcome Page");
welcomePageImpl = new WelcomePageImpl(webdriver.get());
welcomePageImpl.getAggregatorRequest(webdriver.get(),jSon);
}
Exception:
java.lang.NullPointerException
at main.java.com.shoppingCart.testCases.BaseClass.getScreenShotPath(BaseClass.java:71)
at main.java.com.shoppingCart.utilities.Listeners.onTestSuccess(Listeners.java:37)
at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:70)
at org.testng.internal.TestInvoker.runTestResultListener(TestInvoker.java:219)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:651)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
The problem is in your test code.
onSuccess
is NOT guaranteed by TestNG to run in the same thread as your test method.
To fix this, please refactor your listener to use beforeInvocation
and afterInvocation
via the TestNG listener interface org.testng.IInvokedMethodListener
because that is guaranteed to run on the same thread (as far as I can remember).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.