t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

infrastructure
reporting
junit
selenide
java
allure
Теги: #<Tag:0x00007f21e3203a30> #<Tag:0x00007f21e32038f0> #<Tag:0x00007f21e32037b0> #<Tag:0x00007f21e3203670> #<Tag:0x00007f21e3203530> #<Tag:0x00007f21e32033f0>

(Андрей Елфимов) #1

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

Варианты:
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 и данный ресурс, однако все кейсы несколько отличаются и как я не пытался их адаптировать для меня не сработали.


(Андрей Елфимов) #2

В общем сделал через лисенер. Проблема была в том, что аннотация @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);
}

};