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

Не вышло, ровно та же ошибка

Caused by: org.xml.sax.SAXParseException; lineNumber: 235; columnNumber: 38; Invalid byte 2 of 2-byte UTF-8 sequence
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:404)
        ... 42 more

Если вы используете RemoteWebDriver, то запись некорректна. Конечно если вы его где-то до этого не преобразовали к Augmenter’у.

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

Честно говоря - даже не представляю как это сделать. Как сохранить в виде картинки byte[]

Да вроде все локально стартует.
Я использую фабрику Алексея Баранцева

А причем здесь фабрика к способу снятия скриншотов? Из официальной Selenium документации:

        // RemoteWebDriver does not implement the TakesScreenshot class
        // if the driver does have the Capabilities to take a screenshot
        // then Augmenter will add the TakesScreenshot methods to the instance
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File screenshot = ((TakesScreenshot)augmentedDriver).
                            getScreenshotAs(OutputType.FILE);

перегнать byte[] в BufferedImage

и потом

File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);

Может быть можно и попроще

static byte[] getByteArrayFromImage(BufferedImage image, String format) {
	//saveFileToLog(image, testName, screenshotType);
	LOG.debug("Converting screenshot to byte array for report attachment");
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	try {
		ImageIO.write(image, format, baos);
		LOG.info("Successfully wrote screenshot to byte array output stream");
	} catch (IOException e) {
		LOG.error("Cannot write screenshot to ByteArrayOutputStream");
	}
	byte[] imageBytes = baos.toByteArray();

	if (imageBytes.length == 0) {
		String errorMessage = "Converted byte array for screenshot is empty.";
		LOG.error(errorMessage);
		throw new RuntimeException(errorMessage);
	}
	LOG.info("Converted image screenshot to byte array. Byte array size is: "
			+ imageBytes.length);
	return imageBytes;
}

ну вот же метод как перегнать в байт

вот эта проблема это проблема вашего локального env

mvn --version
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T23:58:10+03:00)
Maven home: C:\Program Files\Apache Software Foundation\apache-maven-3.2.3
Java version: 1.7.0_55, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_55\jre
Default locale: ru_RU, platform encoding: Cp1251
OS name: “windows 7”, version: “6.1”, arch: “amd64”, family: “windows”

Вам нужно играться вот с этой строчкой

Default locale: ru_RU, platform encoding: Cp1251

менять на Cp1252 пробовать генерить отчет, если ошибка возникает то пробовать потом на UTF-8 и снова генерить отчет, мне это помогло

я вообще не вижу ни каких проблем с прокриплением картинки в Allure
вот пример как это можно реализовать в TestNG как-то игрался когда изучал возможности отчета

https://github.com/dstoianov/allure-testng-example/blob/master/src/main/java/my/company/steps/OnFailure.java

да и еще я тут скриншот снимаю не driver-ом а Java Robot но заменить на WebDriver нет никакой разници

А что именно менять на Cp1251? Кодировку проекта?

как-то так

Control Panel > Region and Language > Administrative > Change System Locale

или поискать Как в Windows 7 переключить кодовую страницу с 1252 на 1251

кодировка проекта как обычно UTF-8

Заработало после включение метода

.flush();

Каков ваш итоговый, рабочий вариант?

@Attachment(value = "ScreenshotAttachment", type = "image/png")
public byte[] createAttachment() {
    return captureScreenShot();
}


private byte[] captureScreenShot() {
    try {
        BufferedImage image  = new AShot().shootingStrategy(new ViewportPastingStrategy(5)).takeScreenshot(driver).getImage();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", baos);
        baos.flush();
        byte[] imageInByte = baos.toByteArray();
        baos.close();
        return imageInByte;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "Attachment Content Empty, can't create screenshot".getBytes();
}

Правда теперь придется решать новую проблему. Невзирая на Ashot, ff и chrome по разному снимают скриншоты - но это уже тема для нового обсуждения.

Так а как вы данный метод в принципе запускаете?
Я пробовал так:

@AfterMethod(alwaysRun = true)
    public void afterMethod(ITestResult result) {
        if (!result.isSuccess()) {
            screenshoter = new Screenshoter(driver);
            screenshoter.takeFullPageShotForFailedTests();
        }
    }

takeFullPageShotForFailedTests() - ваш метод помещен в класс с другими методами скриншотинга.

Но нифига не выходит.

Вы наверное делали через лиснер. Если да то покажите код лиснера и как его подключаете. Я только соскочил с JUnit и лиснеры для меня в новинку

Нет листинер я еще не делал. И не уверен, что буду, а вот @Taras похоже делал именно, через Listener.

Такой вот еще вопрос о лиснерах:
Согласно этой доке - TestNG подключаю лиснер.
Создаю в проекте файл src/main/resources/META-INF/services/org.testng.ITestNGListener
В файле пишу референс класса который имплементит лиснер - com.me.someframework.core.listeners.OnFailureListener

Вот с таким содержанием работет:

public class OnFailureListener extends TestListenerAdapter {

    @Override
    public void onTestFailure(ITestResult tr) {
        System.out.println("INSIDE onTestFailure");
    }
}

Теперь вопрос - как передать туда драйвер?

Вот базовый класс от которого наследуются все тестовые классы:

public abstract class BaseTest {

    protected WebDriver driver;
    protected PropertyStorage propertyStorage = PropertyStorage.getInstance();
    protected Screenshoter screenshoter;

    DriverProvider driverProvider = new DriverProvider();

    @BeforeClass(alwaysRun = true)
    public void beforeClass() {
        driverProvider.createDriver();
    }

    @BeforeMethod(alwaysRun = true)
    public void beforeMethod() {
        driver = driverProvider.getDriver();
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        driver.manage().deleteAllCookies();
    }

    @AfterMethod(alwaysRun = true)
    public void afterMethod() {
        driver.manage().deleteAllCookies();
    }


    @AfterClass(alwaysRun = true)
    public void afterClass() {
        driver.quit();
    }

}

Есть класс Screenshooter в котором есть метод

@Attachment(value = "ScreenshotAttachment", type = "image/png")
    public byte[] takeFullPageShotForFailedTests() {
        return captureScreenShot();
    }

    private byte[] captureScreenShot() {
        try {
            BufferedImage image  = new AShot().shootingStrategy(new ViewportPastingStrategy(5)).takeScreenshot(driver).getImage();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            baos.flush();
            byte[] imageInByte = baos.toByteArray();
            baos.close();
            return imageInByte;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "Attachment Content Empty, can't create screenshot".getBytes();
    }

Либо дергать static getter ThreadLocal контейнера, либо можно засетить драйвер в контекст TestNG:

@BeforeMethod
public void setUp(final ITestContext context) {
    context.setAttribute("driverKey", driver);
}

public void onTestFailure(final ITestResult result) {
    WebDriver driver = (WebDriver) result.getTestContext().getAttribute("driverKey");
}
2 лайка