[Resolved] Как прикрепить скриншоты проваленных методов в Allure.

Коллеги, добрый день. Возникла у меня такая проблема. Изначально были тесты как тесты на Java. После каждого метода вызывался метод (alwaysRun = true) - где имя скриншота было названием тестового метода. Потом на коротком отрезке случилось следующее:

  1. Обновили Allure c 1.3.9 на 1.4.4

  2. Перешли на использование DataProvider который поставляет тестовые данные их Exel.
    И собственно возникла сама проблема - скриншотер по прежнему снимает скриншот, но всегда с одним именем и перезаписывает более ранние. Кроме того хотелось бы видеть скриншоты с ошибками прикрепленными к Allure. Непродолжительно гугление приводит к следующим результатам: Ashot и

    @Attachment(value = “Page screenshot”, type = “image/png”)
    public byte[] saveScreenshot(byte[] screenShot) {
    return screenShot;
    }
    и следующей теме на форуме
    тема про скриншоты
    Но моего скилла пока не до конца хватает, что бы понять - можно ли как то вызывать скриншоты не принудительно, а автоматом для проваленных тестов.

Можно либо сделать listener, в нем есть вроде метод onTestFailed(если не ошибаюсь). Либо в afterTest смотреть, зафейлен ли тест.
Другой вопрос - надо чтоб при падении не закрывался браузер, иначе будете ошибки получать.
Про имена - поподробнее бы с примерами. А то не понятно

1 лайк

Раньше скриншоты снимались и назывались по имени тестового метода - test1, test2, test2 - например. Сейчас же используется всего один метод - на вход которому передаются разные наборы данных - соответственно тест называется всегда одинаково.

Я бы не полагался только лишь на имя теста для скриншота. Точно такая же проблема у вас возникнет, когда начнете гонять одни и те же тесты параллельно. Я, к примеру, помимо имени метода, еще использую конфигурацию и время запуска: someTest_Win7_FF24_2014-12-03_09-40-35.

Насчет фейлов, как уже выше сказали, можно обрабатывать onTestFailure(ITestResult result) из TestNG ITestListener. Кстати из ITestResult можно вытянуть много всего полезного по ходу дела.

Да я раньше так и снимал.
@AfterMethod(alwaysRun = true)

public void takeScreenshot(ITestResult result) {
  if (! result.isSuccess()) {
    File screenshot1 = new File(result.getMethod().getMethodName() + ".png");
    screenshot1.delete();
    File screenshotTempFile = ((TakesScreenshot) driver)
      .getScreenshotAs(OutputType.FILE);
    Files.copy(screenshotTempFile, screenshot1);
  }
}

И в принципе меня устраивало как он работал…но вот сообразить как его прикрутить к

@Attachment(type = "image/png")
public byte[] makeScreenshot() {
    return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
}

Я что то не могу.

1 лайк

Ну по простому не выйдет, т.к. атрибутам аннотаций можно засетить только константы. Самый простой вариант наверное - изменить логику формирования имени у аспекта, который отвечает за атачменты. Но тогда вам придется пересобрать исходники самостоятельно и использовать модифицированную версию. Или же создайте PR с фиксом и в новой версии увидите свою фичу в случае одобрения разработчиками. :wink:

Хм…а если принудительно снимать скриншот во время выполнения теста? Это наверное проще?

Что значит принудительно?

у Attachment есть параметр name.
можно дслеть примерно так:

@Attachment(value = "Снимок {0}", type = "image/png")
public byte[] saveScreenshot(String name) {
....
}

и тогда файл сохранится с нужным вам именем.
Таким образом в allure можно передавать в step и attachment значения из параметров. Нужно указать индекс в фигурных скобках.

2 лайка

А Ashot может возвращать не объект Screenshot, а byte[]

у screenshot есть getImage(), который вернет BufferedImage, а его можно сконвертить в byte[]. Пример из моего кода:

 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 ImageIO.write(image, "png", baos);
 return baos.toByteArray();
1 лайк

Сделал пока вот так

@Attachment(value = "Снимок {0}", type = "image/png")
public byte[] saveScreenshot(String name) throws IOException {
    Screenshot scr = new AShot().shootingStrategy(new ViewportPastingStrategy(5)).takeScreenshot(driver);
    BufferedImage originalImage = scr.getImage();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write( originalImage, "png", baos );
    return baos.toByteArray();
}

Посмотрим как это отработает

Плохо отработало. Выпала в том числе и такая ошибка

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (default-site) on project webdriver_tests: Error during page generation: Error rendering Maven report: Can't generate allur
e report data: java.lang.reflect.InvocationTargetException: ru.yandex.qatools.allure.data.ReportGenerationException: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 235; column
Number: 38; Invalid byte 2 of 2-byte UTF-8 sequence. -> [Help 1]

Так сложно понять, почему у Вас эта ошибка возникла.
Вы пробовали сделать простейший тест с простым снятием скриншота? для того, чтобы Ваш новый метод потестировать?

Увы нет, сейчас попробую глянуть в дебаггере.

Легче не стало

дек 04, 2014 7:06:17 PM org.openqa.selenium.remote.Augmenter extractRemoteWebDriver
WARNING: Augmenter should be applied to the instances of @Augmentable clases or previously augmented instances only

А откуда эта ошибка? в какой момент она возникает?
Это еще warning, а он обычно не влияет на исполнение тестов.

ну похоже это единственный warning который возникает. Сами тесты вроде отрабатывают. Ошибка

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (default-site) on project webdriver_tests: Error during page generation: Error rendering Maven report: Can't generate allur
e report data: java.lang.reflect.InvocationTargetException: ru.yandex.qatools.allure.data.ReportGenerationException: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 235; column
Number: 38; Invalid byte 2 of 2-byte UTF-8 sequence. -> [Help 1]

Возникает при формировании отчета.

Можете прислать кусок кода, как и откуда Вы вызываете метод скриншота?
А еще можно попробовать сохранить локально bufferedImage, который вам Ashot делает. Чтобы убедиться, что с этой стороны всё нормально.

Давайте для начала исключим все возможные ошибки, а потом если не получится - будем уже подключать ребят из allure.

Смотрю в дебагере IDEA показывает, что в строчке

 return baos.toByteArray();

возвращается, что то странное - даже скопировать не могу. Какие то сплошные кракозябры и странные символы. Эта же мистическая строка отображается и для

ByteArrayOutputStream baos = new ByteArrayOutputStream();