TestWatcher with Selenium



我已经实现了TestWatcher根据测试输出做某些事情,但是我需要调用的函数是testFailed中的createScreenShot需要一个驱动程序作为传入属性,遗憾的是驱动程序是受保护的,而不是静态的,因为我所有的测试同时运行。

尝试实现:每个失败测试的屏幕截图。

我尝试了什么:我尝试添加一个额外的实例属性到类,并将其传递给构造函数,但我得到一个失败与以下异常

TestResultLoggerExtension.<init>()
java.lang.NoSuchMethodException: com.opngo.nowos.utils.TestResultLoggerExtension.<init>()

WebSettings

@ExtendWith(TestResultLoggerExtension.class)
public class WebDriverSettings {
protected WebDriver driver;
protected String TARGET_URL;

@BeforeEach
public void setUp() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver(new ChromeOptions()
.addArguments("--headless")
.addArguments("window-size=1920x1480"));
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
loginToEnvironment();
}
public class TestResultLoggerExtension implements TestWatcher, AfterAllCallback {

@Override
public void testFailed(ExtensionContext context, Throwable cause) {
ScreenShotCreator.takeScreenShot(); <- driver needs to get here somehow since on any failed test i need to snap a screenshot
}

您可以使用ExtensionContext和Reflection来检索TestWatcher中的WebDriver实例:

Object test = extensionContext.getRequiredTestInstance();
Field field = test.getClass().getDeclaredField("driver");
field.setAccessible(true);
WebDriver driver = (WebDriver) field.get(test);

如果WebDriver没有在测试类中声明,而是继承了,则使用例如test.getClass().getSuperclass()或遍历所有超类。

TestWatcher中的方法在带有@AfterAll/Each注释的方法之后被调用。如果你退出了你的WebDriver,把它移到你的TestWatcher.

最新更新