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。
您可以尝试以下两种方法。
- 尝试删除 @Scope(这将使 bean 单例在这里不应该成为问题,您可以使用“原型”范围)
- 调试 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 报告的人有所帮助。
我正在使用带有 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。 您可以尝试以下两种方法。
- 尝试删除 @Scope(这将使 bean 单例在这里不应该成为问题,您可以使用“原型”范围)
- 调试 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 报告的人有所帮助。