@MrDSLow давай так, завтра спишемся, я подготовлю рабочий пример, будем сравнивать что не так.
у вашего onTestFailure есть аннотация @Override ?
В общем то, что вчера запустилось - было каким-то “багом”.
Я пытался забилидить еще раз и уже пошел стак ошибок.
Сегодня,
С советом выше убрал лишнее из Listener.
Выглядит на д.м. так:
package listeners;
import io.qameta.allure.Attachment;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.internal.IResultListener2;
import org.testng.log4testng.Logger;
public class Listener implements IResultListener2 {
final static Logger logger = Logger.getLogger(Listener.class);
WebDriver driver;
@Override
public void beforeConfiguration(ITestResult iTestResult) {
}
@Override
public void onConfigurationSuccess(ITestResult iTestResult) {
}
@Override
public void onConfigurationFailure(ITestResult iTestResult) {
}
@Override
public void onConfigurationSkip(ITestResult iTestResult) {
}
@Override
public void onTestStart(ITestResult iTestResult) {
}
@Override
public void onTestSuccess(ITestResult iTestResult) {
makeScreenshot ("Fail");
}
@Override
public void onTestFailure(ITestResult iTestResult) {
makeScreenshot ("Success");
}
@Override
public void onTestSkipped(ITestResult iTestResult) {
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) {
}
@Override
public void onStart(ITestContext iTestContext) {
}
@Override
public void onFinish(ITestContext iTestContext) {
}
@Attachment(value = "{0}", type = "image/png")
public byte[] makeScreenshot(String name) {
return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
}
}
Запускается и создает отчеты, attach’и в том числе.
Но я в процессе инвестигации, что за сопутствующие ошибки появляются:
java.lang.NullPointerException
at listeners.Listener.makeScreenshot(Listener.java:75)
at listeners.Listener.onTestSuccess(Listener.java:45)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1735)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1714)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:744)
at org.testng.TestRunner.run(TestRunner.java:602)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
at org.testng.TestNG.runSuites(TestNG.java:1144)
at org.testng.TestNG.run(TestNG.java:1115)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
^Ссылается на метод и вызов screenshot maker’а.
Как у вас в этот листенер и в частности, в метод взятия скриншота, драйвер попадает? вот он пустой - вот и ошибка
Пункты в порядке приоритета.
- Если говорить только по сути:
Запустил. Выходные файлы выглядят следу. образом (скришот ниже):
Описание метода:
@Attachment(value = "{0}", type = "image/png")
public byte[] makeScreenshot(ITestResult iTestResult) {
Object currentClass = iTestResult.getInstance();
WebDriver driver = ((Unity) currentClass).getDriver();
return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
}
Вызов:
@Override
public void onTestSuccess(ITestResult iTestResult) {
makeScreenshot (iTestResult);
}
-
Выглядит все пока так:
Что странно, это дубли скриншота. Учитывая, что метод вызывается только на TestFailure и TestSuccess.
Я, конечно же, сам посмотрю, но есть какие-то варианты “приличного” оформления документов? Я видел как подобное сделать, когда выводится через File, не уверен на счет маски для скриншота используя метод выше. И раннее я спрашивал, но хотел бы еще раз узнать в чем отличие метода, который я использую сейчас, и через output File методы? Как это соединяется в один репорт потом в процессе? -
Почему так долго:
Думал вызова WebDriver driver в классе должно быть достаточно для того, чтобы метод аттача его применил. Еще эксперементировал с extends. В итоге были какие-то странные ошибки на запуск драйвера, узнал что 2.31 версия для chrome есть, решил поставить (с мыслью вдруг пофиксится само, хэхмда), антивирус не позволил, вернул обратно 2.30. Еще обнаружил, что у меня в POM несколько chrome драйверов описаноНе знаю как все работало до этого.
.
В общем да, путем сотни экспериментов какой-то результат получился.
Оффтопиком:
Небольшая проблема, но в ходе собирания появляется странное сообщение, еще не увязал причину.
2017-07-25 17:47:26 ERROR NamingUtils:54 - Could not find parameter 0
2017-07-25 17:47:26 ERROR NamingUtils:54 - Could not find parameter 0
Я ваш второй вопрос не понял. По поводу дублей - ищите по коду где ещё используется makeScreenshot, возможно, вы где-то пропустили это использование и от этого дубль снимается. Аттачер ( @Attachment
) хочет стринг для имени аттачиваемого файла, но вы вместо стринга в метод передаёте объект ТестРезульт ( makeScreenshot(ITestResult iTestResult)
) - вот он и ругается вам в лог, можете подправить метод, давать в него первым параметром имя в стринге, а вторым параметром ITestResult.
Что-то вроде:
File imageFile = new File(defaultImage.toURI());
Но это вырезка офк.
У меня был где-то пример с цельным описанием метода. Может быть завтра найду - напишу.
Ну или
@Attachment(value = "Screenshot on failure", type = "image/png")
private byte[] writeScreenshotToFile(WebDriver driver, File screenshot) {
try {
FileOutputStream screenshotStream = new FileOutputStream(screenshot);
byte[] bytes = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.BYTES);
screenshotStream.write(bytes);
screenshotStream.close();
return bytes;
} catch (IOException unableToWriteScreenshot) {
System.err.println("Unable to write "
+ screenshot.getAbsolutePath());
unableToWriteScreenshot.printStackTrace();
}
return null;
}
Но это тоже не совсем то. Тут не определяется наименование.
И да, спасибо за помощь. И @eroshenkoam за предложенную тоже.
Я же вам написал как изменить код для задания имени скриншота. Еще раз полностью прочитайте моё предыдущее сообщение и сделайте последнее предложение для того что у вас уже работает и проверено.
Доделал сегодня.
Правда маловато информативности пока что. Для “Отчета моей мечты”.
Смотрел что можно сделать (типа идеальный вариант оформления в качестве PR акции с заполненными Laucher и behavior).
Про launcher пока забыл, а построение взятие инфы для behavior мне не понравилось. Может быть я ошибаюсь, но оно какое-то “примитивное” и не гибкое, нет?
Еще раз посмотрел плагины, поскольку появилось больше осмысленности того, что происходит. Но по-моему там что-то невероятное написано.
Может быть кто-то может дополнить/поправить меня?
@MrDSLow задача отчета отображать информацию, которую ты собрал. Возможно тебе нужно предоставить больше информации. Сейчас сказать сложно.
Лично я пользуюсь следующими табами: suite, behaviors, timeline. Я их настроил под себя и для команды они довольно информативны.
А чего тебе не хватает в получившемся у тебя отчете?
Мне кажется проще показать, что у меня есть, поскольку я не знаю насколько глубоко тут можно копать.
[details=Summary]
[/details]
Кейс, конечно же, пока один (другой проект-комплект я еще не оптимизировал. Решил Allure прикрутить к новому, чистому проекту).
Выглядит бедновато. Не уверен насколько сильно будет наполненность информацией при множестве кейсов/билдов.
Но может быть так все и должно быть? Тут я не сведую.
По поводу предоставления информации. Может быть я сейчас не прав, но в доке на qameta.io не много информации по этому поводу. Было бы неплохо туда добавить, нет?
Тут я имею ввиду про “Настройка suite, behaviors, timeline etc под себя и они довольно информативны”.
P.S. в ближайшем будущем я разберусь с плагинами и там уже посмотрю.
поддерживаю оратора в этом вопросе.
Да, на документацию как всегда не хватает времени
Если есть желание помочь, то можно присылать PR в этот репозиторий:
Мы так или работаем над документацией, но может не с такой хорошей скоростью как хотелось бы.