Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从TestNG IInvokedMethodListener获取测试字段?_Java_Webdriver_Integration Testing_Screenshot_Testng - Fatal编程技术网

Java 如何从TestNG IInvokedMethodListener获取测试字段?

Java 如何从TestNG IInvokedMethodListener获取测试字段?,java,webdriver,integration-testing,screenshot,testng,Java,Webdriver,Integration Testing,Screenshot,Testng,我正在使用TestNG 6.8+Selenium WebDriver 2.32测试web应用程序的GUI。在测试失败的情况下,我想做一个应用程序GUI的屏幕截图 我所拥有的: 我可以通过实现testng的IInvokedMethodListener 我还知道如何使用网络驱动程序拍摄屏幕截图 我需要的是: 获取在AbstractGuiTest类中声明的WebDriver实例,以获取屏幕截图 以下是我的代码框架: import org.testng.annotations.Listeners

我正在使用TestNG 6.8+Selenium WebDriver 2.32测试web应用程序的GUI。在测试失败的情况下,我想做一个应用程序GUI的屏幕截图

我所拥有的:

  • 我可以通过实现testng的
    IInvokedMethodListener
  • 我还知道如何使用网络驱动程序拍摄屏幕截图
我需要的是:

  • 获取在AbstractGuiTest类中声明的WebDriver实例,以获取屏幕截图
以下是我的代码框架:

import org.testng.annotations.Listeners;
...
@Listeners(GuiTestListener.class)
public abstract class AbstractGuiTest {
    protected WebDriver driver; //Used by all tests
    ...
}
这是我的测试侦听器类,它对失败的测试作出反应:

public class GuiTestListener implements IInvokedMethodListener {
    @Override
    public void afterInvocation(IInvokedMethod method, ITestResult itr) {
        if (method.isTestMethod() && !itr.isSuccess()) {
            //Take a screenshot here. But how do I get at the intance of WebDriver declared in the AbstractGuiTest?
        }
    }
}

您能否建议一种方法,如何获取AbstractGuitTest中声明的WebDriver实例,以便我可以使用它在GuiTestListener类中截图?

您可能的解决方案很好地抓住了这个想法-应该有一个地方,测试和listener之间共享
WebDriver
实例。我想到了另外两种解决方案,它们是我参与的项目中使用的,或者我在互联网上读到的

  • 通过Singleton“holder”类共享,如下所示。它是关于Groovy和Geb的,但它给出了想法

  • 使用依赖注入(例如)在所有需要的地方注入
    WebDriver
    。guiceberry中有一个例子


  • 您可能的解决方案很好地抓住了这个想法-应该在测试和侦听器之间共享
    WebDriver
    实例。我想到了另外两种解决方案,它们是我参与的项目中使用的,或者我在互联网上读到的

  • 通过Singleton“holder”类共享,如下所示。它是关于Groovy和Geb的,但它给出了想法

  • 使用依赖注入(例如)在所有需要的地方注入
    WebDriver
    。guiceberry中有一个例子


  • 您可以从ITestResult获得它:

    Object x = itr.getInstance();
    AbstractGuiTest currentCase = (AbstractGuiTest)x;
    WebDriver driver  = currentCase.getDriver();
    

    您可以从ITestResult获得它:

    Object x = itr.getInstance();
    AbstractGuiTest currentCase = (AbstractGuiTest)x;
    WebDriver driver  = currentCase.getDriver();
    

    我有一些相似的东西,当硒测试失败时,我需要截图。我所有的测试类都扩展了AbstractTestNGSpringContextTests,实现了TestWithEleniumDriver,它们有注释@Listeners(ScreenshotForFailedTestListener.class)


    代码必须根据您的需要进行一些调整

    我有一些类似的东西,当selenium测试失败时,我需要截图。我所有的测试类都扩展了AbstractTestNGSpringContextTests,实现了TestWithEleniumDriver,它们有注释@Listeners(ScreenshotForFailedTestListener.class)


    代码必须根据您的需要进行一些调整

    我想到的一个可能的解决方案是在GuiTestListener中创建一个静态WebDriver字段,我将从AbstractGuiTest@BeforeClass设置方法设置该字段。但我想知道是否有更系统的解决方案……我想到的一个可能的解决方案是在GuiTestListener中创建一个静态WebDriver字段,我将从AbstractGuiTest@BeforeClass设置方法设置该字段。但我想知道是否有更系统的解决方案……这就是我一直在寻找的答案。谢谢你,贾斯汀!这就是我一直在寻找的答案。谢谢你,贾斯汀!该接口的解决方案非常干净,至少为我节省了一些反射调用。谢谢你的想法。这个界面的解决方案非常干净,并且至少为我节省了一些反射调用。谢谢你的主意。