getScreenshotAs 在 webDriver 上给出空异常

getScreenshotAs is giving null exception on webDriver

我正在使用带有 selenium 和 testNG 的 spring 框架,然后我决定与 allure 报告集成,报告工作正常。

我的问题是在失败时附加屏幕截图。 @Autowired 驱动程序 在调用 getScreenshotAs 时返回 null。

我会 post 一些代码,如果需要更多请告诉我。

@Component
public class ScreenshotUtil {
    
    @Autowired
    private WebDriver driver;
    
    @Attachment(value = "Screenshot", type = "image/png")
    public byte[] saveScreenshotOnFailure() {
        return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES); //this is where im getting error
    }
}

然后我有监听器class..

public class AllureListener implements ITestListener {

    @Autowired
    private ScreenshotUtil screenshotUtil;
    
    @Override
    public void onTestFailure(ITestResult result) {
        screenshotUtil.saveScreenshotOnFailure();
    }
}

我的测试 classes with @Test 一切正常..我也会添加 WebDriverConfig 组件(不知道这是否有用)。

@Configuration
public class WebDriverConfig {
    
    @Bean
    @Scope("browserscope") //This is for parallel run
    public WebDriver driver() {
        if(System.getProperty("browser").equals("firefox") {
            .. return firefox driver //let me know if this code might be necessary
        } else {
            .. return chrome driver //let me know if this code might be necessary
        }
    }
    
    @Bean
    public WebDriverWait webDriverWait(WebDriver driver) {
        return new WebDriverWait(driver, timeout);
    }
}

提前致谢,如有任何帮助,我们将不胜感激..

看看 @Component 注释是否能解决您的问题,因为您在 属性.

上使用 @Autowired

用@Component("driver")修饰WebDriverConfig中的driver()方法;看看它是否有效。 此处有更多详细信息 - https://www.baeldung.com/spring-autowire

如果能把整个堆栈轨迹放上去就更好了。 看来配置 class 无法提供驱动程序 bean。 您可以尝试以下两种方法。

  1. 尝试删除 @Scope(这将使 bean 单例在这里不应该成为问题,您可以使用“原型”范围)
  2. 调试 Bean 中的代码放置调试点并查看是否返回了 bean。

我想回答我自己的问题,因为在大量帮助和一些研究之后我能够解决这个问题。

发生的情况是,spring 上下文与 testNG 上下文不同。 当我们实现 ITestListener class 时,TestNG 上下文无法访问 spring 上下文。这 class 是在测试失败时截取屏幕截图所必需的。

所以解决方案是(我从这里得到的:https://dzone.com/articles/autowiring-spring-beans-into-classes-not-managed-by-spring

首先创建此服务以从 spring:

检索 bean
@Service
public class BeanUtil implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    public static <T> T getBean(Class<T> beanClass) {
        return context.getBean(beanClass);
    }
}

然后在我的 AllureListener class 上,我将像这样检索 ScreenshotUtil bean:

public class AllureListener implements ITestListener {
    
    @Override
    public void onTestFailure(ITestResult result) {
        ScreenshotUtil screenshotUtil = BeanUtil.getBean(ScreenshotUtil.class);
        screenshotUtil.saveScreenshotOnFailure();
    }
}

希望这对将来使用 spring 框架、spring 和 allure 报告的人有所帮助。