1515 */
1616package io .qameta .allure .selenide ;
1717
18+ import com .codeborne .selenide .Selenide ;
1819import com .codeborne .selenide .WebDriverRunner ;
1920import com .codeborne .selenide .logevents .LogEvent ;
2021import com .codeborne .selenide .logevents .LogEventListener ;
2930import org .slf4j .Logger ;
3031import org .slf4j .LoggerFactory ;
3132
33+ import java .util .HashMap ;
34+ import java .util .Map ;
3235import java .util .Optional ;
3336import java .util .UUID ;
37+ import java .util .logging .Level ;
3438
3539import static io .qameta .allure .util .ResultsUtils .getStatus ;
3640import static io .qameta .allure .util .ResultsUtils .getStatusDetails ;
@@ -46,7 +50,7 @@ public class AllureSelenide implements LogEventListener {
4650
4751 private boolean saveScreenshots = true ;
4852 private boolean savePageHtml = true ;
49-
53+ private final Map < LogType , Level > logTypesToSave = new HashMap <>();
5054 private final AllureLifecycle lifecycle ;
5155
5256 public AllureSelenide () {
@@ -67,6 +71,18 @@ public AllureSelenide savePageSource(final boolean savePageHtml) {
6771 return this ;
6872 }
6973
74+ public AllureSelenide enableLogs (final LogType logType , final Level logLevel ) {
75+ logTypesToSave .put (logType , logLevel );
76+
77+ return this ;
78+ }
79+
80+ public AllureSelenide disableLogs (final LogType logType ) {
81+ logTypesToSave .remove (logType );
82+
83+ return this ;
84+ }
85+
7086 private static Optional <byte []> getScreenshotBytes () {
7187 try {
7288 return WebDriverRunner .hasWebDriverStarted ()
@@ -89,6 +105,10 @@ private static Optional<byte[]> getPageSourceBytes() {
89105 }
90106 }
91107
108+ private static String getBrowserLogs (final LogType logType , final Level level ) {
109+ return String .join ("\n \n " , Selenide .getWebDriverLogs (logType .toString (), level ));
110+ }
111+
92112 @ Override
93113 public void beforeEvent (final LogEvent event ) {
94114 lifecycle .getCurrentTestCaseOrStep ().ifPresent (parentUuid -> {
@@ -113,6 +133,13 @@ public void afterEvent(final LogEvent event) {
113133 getPageSourceBytes ()
114134 .ifPresent (bytes -> lifecycle .addAttachment ("Page source" , "text/html" , "html" , bytes ));
115135 }
136+ if (!logTypesToSave .isEmpty ()) {
137+ logTypesToSave
138+ .forEach ((logType , level ) -> {
139+ final byte [] content = getBrowserLogs (logType , level ).getBytes (UTF_8 );
140+ lifecycle .addAttachment ("Logs from: " + logType , "application/json" , ".txt" , content );
141+ });
142+ }
116143 lifecycle .updateStep (stepResult -> {
117144 stepResult .setStatus (getStatus (event .getError ()).orElse (Status .BROKEN ));
118145 stepResult .setStatusDetails (getStatusDetails (event .getError ()).orElse (new StatusDetails ()));
0 commit comments