Загрузка данных


public final class LogsUtils {
    private static final Logger LOGGER = LoggerFactory.getLogger(LogsUtils.class);
    private static final String CONSOLE_LOG_FORMAT = "[%tF %tT] %s %s";
    private static final String NETWORK_LOG_FORMAT = "[%tF %tT] %s %s %s";

    private LogsUtils() {
    }

    /**
     * <p>Прикрепляет отчёты к шагу.</p>
     *
     * @param devToolsManager Экземпляр DevToolsManager.
     * @param context Контекст браузера.
     */
    public static void attachReport(DevToolsManager devToolsManager, BrowserContext context) {
        InvocationInfo invocationInfo = actionInvocation("Отчёты");
        runInvocation(invocationInfo, () -> {
            invocationInfo.addAttachmentEntry(
                    TextAttachmentEntry.of("Network Logs", getNetworkLogs(devToolsManager))
            );
            invocationInfo.addAttachmentEntry(
                    TextAttachmentEntry.of("Console Logs", getConsoleLogs(devToolsManager))
            );
            context.pages().forEach(page -> {
                PngScreenshot screenshot = takeScreenshot(page);
                if (screenshot != null) {
                    invocationInfo.addAttachmentEntry(
                            ScreenshotAttachmentEntry.of("Screenshot", screenshot)
                    );
                }
            });
        });
    }

    /**
     * <p>Форматирует лог из консоли.</p>
     *
     * @param event Лог.
     */
    public static String formatLog(ConsoleApiCalledEvent event) {
        String argsStr = event.getArgs().stream()
                .map(RemoteObject::toString)
                .collect(Collectors.joining(",\t"));
        Date date = new Date(event.getTimestamp());

        return String.format(
                CONSOLE_LOG_FORMAT,
                date,
                date,
                event.getType(),
                argsStr
        );
    }

    /**
     * <p>Форматирует сетевой лог.</p>
     *
     * @param log Лог.
     */
    public static String formatLog(LogEntry log) {
        Date date = new Date(log.getTimestamp());
        return String.format(
                NETWORK_LOG_FORMAT,
                date,
                date,
                log.getLevel(),
                log.getText(),
                log.getUrl().orElse("")
        );
    }

    /**
     * <p>Возвращает сетевые логи из вкладки Network.</p>
     *
     * @param devToolsManager Экземпляр DevToolsManager.
     */
    private static String getNetworkLogs(DevToolsManager devToolsManager) {
        try {
            return devToolsManager.getLogEntries().stream()
                    .sorted(Comparator.comparingLong(LogEntry::getTimestamp))
                    .map(LogsUtils::formatLog)
                    .collect(Collectors.joining("\n"));
        } catch (Exception e) {
            LOGGER.warn("Не удалось получить сетевые логи.", e);
            return null;
        }
    }

    /**
     * <p>Возвращает логи из консоли.</p>
     */
    private static String getConsoleLogs(DevToolsManager devToolsManager) {
        try {
            return devToolsManager.getConsoleApiEvents().stream()
                    .sorted(Comparator.comparingLong(ConsoleApiCalledEvent::getTimestamp))
                    .map(LogsUtils::formatLog)
                    .collect(Collectors.joining("\n"));
        } catch (Exception e) {
            LOGGER.warn("Не удалось получить логи из консоли.", e);
            return null;
        }
    }

    /**
     * <p>Создает скриншот текущей страницы.</p>
     *
     * @param page Экземпляр страницы.
     * @return Скриншот.
     */
    private static PngScreenshot takeScreenshot(Page page) {
        try {
            return new PngScreenshot(
                    new ByteArrayInputStream(
                            page.screenshot(new Page.ScreenshotOptions())
                    ).readAllBytes()
            );
        } catch (Exception e) {
            LOGGER.warn("Не удалось сделать скриншот для отчёта.", e);
            return null;
        }
    }
}