diff --git a/docs/modules/plugins/pages/plugin-web-app.adoc b/docs/modules/plugins/pages/plugin-web-app.adoc index c833e1b3bb..ef67bf8a7a 100644 --- a/docs/modules/plugins/pages/plugin-web-app.adoc +++ b/docs/modules/plugins/pages/plugin-web-app.adoc @@ -1117,3 +1117,62 @@ xhr.onreadystatechange = function() { xhr.send();` and save result to scenario variable `response` Then `${response}` matcher `.+` ---- + +=== Browser logs steps + +This set of steps allows to validate the https://developer.mozilla.org/en-US/docs/Web/API/console[browser console logging messages]. + +:log-levels: List of the comma-separated messages levels. The supported levels are: ERRORS, WARNINGS. + +==== Validate log entries absence + +Validates the absence of log entries of the desired level in the browser console. + +[source,gherkin] +---- +Then there are no browser console $logLevels +---- +* `$logLevels` - {log-levels} + +.Validate absence of JS errors +[source,gherkin] +---- +Given I am on a page with the URL 'https://vividus-test-site.herokuapp.com/' +Then there are no browser console ERRORS +---- + +==== Validate specific log entries absence + +Validates the absence of specific log entries of the desired level in the browser console. + +[source,gherkin] +---- +Then there are no browser console $logLevels by regex '$pattern' +---- +* `$logLevels` - {log-levels} +* `$pattern` - The regular expression to match log entry messages. + +.Validate absence of JS error referencing user +[source,gherkin] +---- +Given I am on a page with the URL 'https://vividus-test-site.herokuapp.com/' +Then there are no browser console ERRORS by regex '.*user.*' +---- + +==== Validate specific log entries presence + +Validates the presence of specific log entries of the desired level in the browser console. + +[source,gherkin] +---- +Then there are browser console $logLevels by regex '$pattern' +---- +* `$logLevels` - {log-levels} +* `$pattern` - The regular expression to match log entry messages. + +.Validate presence of JS errors referencing user +[source,gherkin] +---- +Given I am on a page with the URL 'https://vividus-test-site.herokuapp.com/' +Then there are browser console ERRORS by regex '.*user.*' +---- diff --git a/vividus-plugin-web-app/src/main/java/org/vividus/selenium/logging/BrowserLogManager.java b/vividus-plugin-web-app/src/main/java/org/vividus/selenium/logging/BrowserLogManager.java index 9f851638d9..066baf98c3 100644 --- a/vividus-plugin-web-app/src/main/java/org/vividus/selenium/logging/BrowserLogManager.java +++ b/vividus-plugin-web-app/src/main/java/org/vividus/selenium/logging/BrowserLogManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2019-2021 the original author or authors. + * Copyright 2019-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,13 +59,14 @@ public static void resetBuffer(WebDriver driver, boolean ignoreUnsupportedDriver private static Optional getLog(WebDriver driver, boolean ignoreUnsupportedDrivers) { // The Selenium log API isn't supported: https://github.com/w3c/webdriver/issues/406 - if (WebDriverManager.isBrowserAnyOf(driver, Browser.FIREFOX, Browser.IE)) + // Safari: https://developer.apple.com/documentation/webkit/macos_webdriver_commands_for_safari_11_1_and_earlier + if (WebDriverManager.isBrowserAnyOf(driver, Browser.FIREFOX, Browser.IE, Browser.SAFARI)) { if (ignoreUnsupportedDrivers) { return Optional.empty(); } - throw new IllegalStateException("Firefox does not support retrieval of browser logs"); + throw new IllegalStateException("Browser does not support retrieval of browser logs"); } return Optional.of(driver.manage().logs().get(LogType.BROWSER)); } @@ -73,10 +74,6 @@ private static Optional getLog(WebDriver driver, boolean ignoreUnsup private static Stream filter(LogEntries log, Level level) { int levelValue = level.intValue(); - return log.getAll().stream().filter(logEntry -> - { - int logEntryLevel = logEntry.getLevel().intValue(); - return logEntryLevel >= levelValue && logEntryLevel <= levelValue; - }); + return log.getAll().stream().filter(logEntry -> levelValue == logEntry.getLevel().intValue()); } } diff --git a/vividus-plugin-web-app/src/main/java/org/vividus/steps/ui/web/JsValidationSteps.java b/vividus-plugin-web-app/src/main/java/org/vividus/steps/ui/web/JsValidationSteps.java index c2f350d9de..f84fdfd8a9 100644 --- a/vividus-plugin-web-app/src/main/java/org/vividus/steps/ui/web/JsValidationSteps.java +++ b/vividus-plugin-web-app/src/main/java/org/vividus/steps/ui/web/JsValidationSteps.java @@ -1,5 +1,5 @@ /* - * Copyright 2019-2021 the original author or authors. + * Copyright 2019-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; +import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.inject.Inject; @@ -52,14 +53,9 @@ public class JsValidationSteps * @param regex Regular expression to filter log entries */ @Then("there are browser console $logEntries by regex `$regex`") - public void checkThereAreLogEntriesOnOpenedPageFiltredByRegExp(List logEntries, String regex) + public void checkThereAreLogEntriesOnOpenedPageFilteredByRegExp(List logEntries, Pattern regex) { - WebDriver webDriver = webDriverProvider.get(); - Set filteredLogEntries = BrowserLogManager.getFilteredLog(webDriver, logEntries).stream() - .filter(logEntry -> logEntry.getMessage().matches(regex)) - .collect(Collectors.toSet()); - - publishAttachment(Map.of(webDriver.getCurrentUrl(), filteredLogEntries)); + Set filteredLogEntries = getLogEntries(logEntries, regex); softAssert.assertFalse(String.format("Current page contains JavaScript %s by regex '%s'", toString(logEntries), regex), filteredLogEntries.isEmpty()); } @@ -77,8 +73,8 @@ public void checkThereAreLogEntriesOnOpenedPageFiltredByRegExp(List logEntries) { - checkFilteredJsEntries(logEntries, - e -> includeBrowserExtensionLogEntries || !e.getMessage().contains("extension")); + checkLogMessagesAbsence(getLogEntries(logEntries, + e -> includeBrowserExtensionLogEntries || !e.getMessage().contains("extension")), logEntries); } /** @@ -93,21 +89,31 @@ public void checkJsLogEntriesOnOpenedPage(List logEntries) * @param regex Regular expression to filter log entries */ @Then(value = "there are no browser console $logEntries by regex '$regex'", priority = 1) - public void checkJsLogEntriesOnOpenedPageFiltredByRegExp(List logEntries, String regex) + public void checkJsLogEntriesOnOpenedPageFilteredByRegExp(List logEntries, Pattern regex) + { + checkLogMessagesAbsence(getLogEntries(logEntries, regex), logEntries); + } + + private void checkLogMessagesAbsence(Set logEntries, List logLevels) { - checkFilteredJsEntries(logEntries, logEntry -> logEntry.getMessage().matches(regex)); + softAssert.assertEquals("Current page contains no JavaScript " + toString(logLevels), 0, + logEntries.size()); } - private void checkFilteredJsEntries(List logLevels, Predicate filter) + private Set getLogEntries(List logEntries, Predicate filter) { WebDriver webDriver = webDriverProvider.get(); - Set filteredLogEntries = BrowserLogManager.getFilteredLog(webDriver, logLevels).stream() - .filter(filter) + Set filteredLogEntries = BrowserLogManager.getFilteredLog(webDriver, logEntries).stream() + .filter(filter::test) .collect(Collectors.toSet()); publishAttachment(Map.of(webDriver.getCurrentUrl(), filteredLogEntries)); - softAssert.assertEquals("Current page contains no JavaScript " + toString(logLevels), 0, - filteredLogEntries.size()); + return filteredLogEntries; + } + + private Set getLogEntries(List logEntries, Pattern regex) + { + return getLogEntries(logEntries, message -> regex.matcher(message.getMessage()).matches()); } private void publishAttachment(Map> results) diff --git a/vividus-plugin-web-app/src/test/java/org/vividus/selenium/logging/BrowserLogManagerTests.java b/vividus-plugin-web-app/src/test/java/org/vividus/selenium/logging/BrowserLogManagerTests.java index 69aff6ddba..3c0b7be06d 100644 --- a/vividus-plugin-web-app/src/test/java/org/vividus/selenium/logging/BrowserLogManagerTests.java +++ b/vividus-plugin-web-app/src/test/java/org/vividus/selenium/logging/BrowserLogManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019-2021 the original author or authors. + * Copyright 2019-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,8 +29,12 @@ import java.util.Arrays; import java.util.Set; import java.util.logging.Level; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.openqa.selenium.Capabilities; import org.openqa.selenium.HasCapabilities; import org.openqa.selenium.WebDriver; @@ -71,13 +75,21 @@ void shouldReturnFilteredLogContainingNoEntries() assertEquals(emptySet(), filteredLog); } - @Test - void shouldNotReturnLogsForFirefox() + static Stream notSupportedBrowsers() { - WebDriver webDriver = mockBrowserName(Browser.FIREFOX.browserName()); + return Stream.of(Arguments.of(Browser.IE), + Arguments.of(Browser.SAFARI), + Arguments.of(Browser.FIREFOX)); + } + + @ParameterizedTest + @MethodSource("notSupportedBrowsers") + void shouldFailWhenBrowserDoesntSupportsLogs(Browser browser) + { + WebDriver webDriver = mockBrowserName(browser.browserName()); IllegalStateException exception = assertThrows(IllegalStateException.class, () -> BrowserLogManager.getLog(webDriver)); - assertEquals("Firefox does not support retrieval of browser logs", exception.getMessage()); + assertEquals("Browser does not support retrieval of browser logs", exception.getMessage()); } @Test diff --git a/vividus-plugin-web-app/src/test/java/org/vividus/steps/ui/web/JsValidationStepsTests.java b/vividus-plugin-web-app/src/test/java/org/vividus/steps/ui/web/JsValidationStepsTests.java index d4129a320e..06da943b88 100644 --- a/vividus-plugin-web-app/src/test/java/org/vividus/steps/ui/web/JsValidationStepsTests.java +++ b/vividus-plugin-web-app/src/test/java/org/vividus/steps/ui/web/JsValidationStepsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019-2021 the original author or authors. + * Copyright 2019-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; +import java.util.regex.Pattern; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -52,7 +53,9 @@ class JsValidationStepsTests { private static final String URL = "url"; private static final String ERROR_MESSAGE = "error message"; + private static final Pattern ERROR_MESSAGE_PATTERN = Pattern.compile(ERROR_MESSAGE); private static final String EXTENSION = "extension "; + private static final Pattern EXTENSION_PATTERN = Pattern.compile(EXTENSION); private static final String ERRORS_ASSERTION_DESCRIPTION = "Current page contains no JavaScript errors"; @Mock @@ -68,11 +71,11 @@ class JsValidationStepsTests private JsValidationSteps jsValidationSteps; @Test - void testCheckThereAreLogEntriesOnOpenedPageFiltredByRegExp() + void testCheckThereAreLogEntriesOnOpenedPageFilteredByRegExp() { Map> expectedResults = testCheckJsErrors(ERROR_MESSAGE, () -> jsValidationSteps - .checkThereAreLogEntriesOnOpenedPageFiltredByRegExp(singletonList(BrowserLogLevel.ERRORS), - ERROR_MESSAGE)); + .checkThereAreLogEntriesOnOpenedPageFilteredByRegExp(singletonList(BrowserLogLevel.ERRORS), + ERROR_MESSAGE_PATTERN)); InOrder inOrder = inOrder(attachmentPublisher, softAssert); verifyAttachmentPublisher(expectedResults, inOrder); inOrder.verify(softAssert).assertFalse(String.format("Current page contains JavaScript %s by regex '%s'", @@ -91,7 +94,8 @@ void testCheckJsErrorsOnPage() void testCheckJsErrorsOnPageByRegExpNoMatch() { testCheckJsErrors(ERROR_MESSAGE, () -> jsValidationSteps - .checkJsLogEntriesOnOpenedPageFiltredByRegExp(singletonList(BrowserLogLevel.ERRORS), EXTENSION)); + .checkJsLogEntriesOnOpenedPageFilteredByRegExp(singletonList(BrowserLogLevel.ERRORS), + EXTENSION_PATTERN)); verifyTestActions(Map.of(URL, Collections.emptySet()), ERRORS_ASSERTION_DESCRIPTION); }