Загрузка данных
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;
}
}
}