【问题标题】:screenshot listener in selenium with TestNG使用 TestNG 在 selenium 中的屏幕截图监听器
【发布时间】:2018-06-20 17:42:59
【问题描述】:

我有一个测试用例,它将作为非静态变量调用驱动程序。我还在我的测试用例中添加了截图监听器。当测试用例失败时,控件会自动发送到屏幕截图侦听器,但是由于我的驱动程序是一个非静态变量,因此无法在屏幕截图侦听器中访问它。所以我得到空指针异常。

为了解决这个问题,我在 stackoverflow 的帮助下创建了一个简单的基础测试类,如下所示,并在每个测试类中扩展它

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);
                }

        }
    }

在我的监听器中,我按如下方式访问基类

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.
        }
}

我的测试类是这样的

@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();
    }

当我运行它时,它给了我错误

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

后来当我如下更改测试类时,它运行正确

@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();
        }

不可以声明代码吗

login = new Login(getDriver());

在@test 方法之外而不是在@test 方法中编写它。或者有没有其他替代方法我可以调用上面的代码

【问题讨论】:

  • 不可能,因为它会在对象实例化时调用它,但驱动程序是在 @before 方法上实例化的,该方法在之后调用

标签: selenium selenium-webdriver automation testng


【解决方案1】:

您可以在@BeforeClass 方法中创建登录对象

@BeforeClass(alwaysRun = true)

public void setUp() throws Exception {
    login = new Login(getDriver());
}

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2019-07-01
    • 2021-04-11
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多