Скриншот при фейле тестов(Selenide+junit+allure)

Что хочу сделать:
Хочу чтобы при фейле теста в отчете показывался скрин момента, на котором тест упал.

Варианты:
1)Selenide уже делает скрины при падении и складывает их в /target/allure-results, но я не могу понять как указать Allure использовать эти скрины.

2)Так же пробовал использовать лисенер и через аннотацию @Attachment делать скрин в момент падения, но тоже не взлетело и этот вариант не особо мне нравится.

Вот пример кода для такого варианта:

@Rule
public TestWatcher screenshotOnFailure = new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
makeScreenshotOnFailure();
}
@Attachment(“Screenshot on failure”)
public byte[] makeScreenshotOnFailure() {
return ((TakesScreenshot) WebDriverRunner.getWebDriver()).getScreenshotAs(OutputType.BYTES);
}

В итоге получаю

org.openqa.selenium.NoSuchSessionException:
invalid session id

Драйвер вырубается раньше чем делается скрин.

Прочитал уже весь stackoverflow и данный ресурс, однако все кейсы несколько отличаются и как я не пытался их адаптировать для меня не сработали.

1 лайк

В общем сделал через лисенер. Проблема была в том, что аннотация @After отрабатывает быстрее чем делается скрин. Пофиксил переопределением метода закрытия браузера:

@Rule
public TestWatcher screenshotOnFailure = new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
makeScreenshotOnFailure();
}

@Override
protected void finished(Description description) {
WebDriverRunner.getWebDriver().close();
}

@Attachment(“Screenshot on failure”)
public byte[] makeScreenshotOnFailure() {
return ((TakesScreenshot) WebDriverRunner.getWebDriver()).getScreenshotAs(OutputType.BYTES);
}

};
4 лайка

спасибо