0

I have a testcase that will invoke the driver as a non static variable. I also have added screenshot listener in my test case. When the test case fails The control is automatically sent to the screenshot listener, however since my driver is a NON-STATIC variable it could not be accessed in the screenshot listener. So I get nullpointer exception.

To solve this I created a simple base test class with help of stackoverflow like below and extend it in each testclass

public asbtract baseTest() {

    private WebDriver driver;

    public WebDriver getDriver() {
            return driver;
}

    @BeforeMethod
    public void createDriver() {
            Webdriver driver=XXXXDriver();
    }

    @AfterMethod
        public void tearDownDriver() {
        if (driver != null)
        {
                try
                {
                    driver.quit();
                }
                catch (WebDriverException e) {
                    System.out.println("***** CAUGHT EXCEPTION IN DRIVER TEARDOWN *****");
                    System.out.println(e);
                }

        }
    }

In my listener, I access the base class as follows

public class ScreenshotListener extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result)
{
        Object currentClass = result.getInstance();
        WebDriver webDriver = ((baseTest) currentClass).getDriver();

        if (webDriver != null)
        {

           File f = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);

           //etc.
        }
}

My test class looks like this

@Listeners(value = FailureReport.class)
public class LoginTest extends baseTest{

    Login login = new Login(getDriver());
    
    @Test(description = "Verify Expand the Menu", priority = 0)
    public void navigateloginpage() {
        login.expandMenuScreenLogin();
        login.navigateLoginPage();
    }

    @Test(description = "User login Sucessfully", priority = 1)
    public void successLogin() {
        login.login();
    }

When I run this it gives me the error

org.testng.TestNGException: 
Cannot find class in classpath: com.fbf.automation.tests.LoginTest
	at org.testng.xml.XmlClass.loadClass(XmlClass.java:81)
	at org.testng.xml.XmlClass.init(XmlClass.java:73)
	at org.testng.xml.XmlClass.<init>(XmlClass.java:59)
	at org.testng.xml.TestNGContentHandler.startElement(TestNGContentHandler.java:548)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:745)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1359)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)
	at javax.xml.parsers.SAXParser.parse(SAXParser.java:195)
	at org.testng.xml.XMLParser.parse(XMLParser.java:38)
	at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:16)
	at org.testng.xml.SuiteXmlParser.parse(SuiteXmlParser.java:9)
	at org.testng.xml.Parser.parse(Parser.java:172)
	at org.testng.TestNG.initializeSuitesAndJarFile(TestNG.java:302)
	at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:45)
	at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

Process finished with exit code 0

Later when I changed my test class as follows it ran correctly

@Listeners(value = FailureReport.class)
    public class LoginTest extends baseTest{

        Login login;
        
        @Test(description = "Verify Expand the Menu", priority = 0)
        public void navigateloginpage() {
            login = new Login(getDriver());
            login.expandMenuScreenLogin();
            login.navigateLoginPage();
        }

        @Test(description = "User login Sucessfully", priority = 1)
        public void successLogin() {
            login.login();
        }

Isn't it possible to declare the code

login = new Login(getDriver());

outside @test method rather than writing it inside the @test method. Or are there anyother alternative ways I can call the above code

1
  • Is not possible cause it would call this on instantiation of the object but the driver is instantiated on @before method which is called after Commented Jan 11, 2018 at 12:41

1 Answer 1

1

You may create Login object inside @BeforeClass method

@BeforeClass(alwaysRun = true)

public void setUp() throws Exception {
    login = new Login(getDriver());
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.