TestWatcher API, junit5, Allure: cómo tomar un navegador cuando @AfterEach ocurre antes de testFailed
Solo he comenzado a trabajar con Junit5/Selenium y Allure.
Como todos ustedes y yo sabemos, las API de TestWatcher solo funcionan después de las anotaciones de JUnit, como @AfterAll/Each, por ejemplo.
Pero mi problema es que necesito tomar una captura de pantalla cuando una prueba falla.
Sí, puedo agregar el cierre del navegador a TestWatcher:
@Override
public void testFailed(ExtensionContext extensionContext, Throwable throwable) {
Allure.addAttachment("Attachment",
new ByteArrayInputStream(((TakesScreenshot) browser.getDriver()).getScreenshotAs(OutputType.BYTES)));
if (getBrowser().isBrowserAlive()) {
Browser.getInstance().close();
}
}
pero no me gusta esto, porque necesito agregar el cierre del navegador a cada método de TestWatcher. Y como resultado, se agregará un adjunto al cuerpo de la prueba en allure.
Pero quiero agregar el cierre del navegador a:
@AfterEach
void tearDown() {}
Pregunta: ¿cómo puedo enviar un controlador desde la clase BaseTest a TestWatcher (testFailed)?
Encontré un código como este, pero lamentablemente no tengo idea de cómo usarlo porque en la clase de prueba no tengo un controlador:
Object test = extensionContext.getRequiredTestInstance();
Field field = test.getClass().getDeclaredField("driver");
field.setAccessible(true);
WebDriver driver = (WebDriver) field.get(test);
davy.ai
Para enviar el controlador desde la clase BaseTest al método testFailed de TestWatcher, puedes crear un método protegido en la clase BaseTest que devuelva la instancia del controlador y luego llamarlo desde el método testFailed de TestWatcher.
Aquí está el código actualizado para el método testFailed de TestWatcher:
Y en la clase BaseTest, crea un método protegido llamado
getDriver()
que devuelva la instancia del controlador:Luego, en tu clase de prueba, extiende la clase BaseTest y establece la instancia del
driver
en tu método@BeforeEach
, por ejemplo:Con este enfoque, el método testFailed de TestWatcher puede acceder a la instancia del
driver
en la clase BaseTest sin necesidad de que se pase como parámetro.