From 9df88c253acb897563e9ff166d8a6dfff5b639fd Mon Sep 17 00:00:00 2001 From: Adam Kaczmarek Date: Sun, 16 Apr 2023 16:35:06 +0200 Subject: [PATCH] Latest changes from develop with Allure and prperties (#18) * Add argument for driver - allow remote * WebDriverUtils optionas arguments update * Add DisplayName and Description annotation to tests * Add severity annotation and disabled one test * Update one test for product page * Add utils class and methods for screenshots making after failed scenario * Add properties file for test data and update PropertiesReader --- .gitignore | 1 + .../webElementsExtensions/PageElement.java | 2 +- src/main/java/utils/PropertiesReader.java | 42 +++++++++++++++++++ src/main/java/utils/Utils.java | 31 ++++++++++++++ src/main/java/utils/WebDriverUtils.java | 2 +- src/test/java/helpers/TestStatus.java | 13 ++++++ src/test/java/pages/LogInPage.java | 3 +- src/test/java/pages/ProductsPage.java | 6 +++ src/test/java/tests/LoginPageTests.java | 18 +++++--- src/test/java/tests/ProductPageTests.java | 16 +++++-- src/test/java/tests/_TestsHooks.java | 34 ++++++++++----- src/test/resources/TestData.properties | 2 + 12 files changed, 146 insertions(+), 24 deletions(-) create mode 100644 src/main/java/utils/PropertiesReader.java create mode 100644 src/main/java/utils/Utils.java create mode 100644 src/test/java/helpers/TestStatus.java create mode 100644 src/test/resources/TestData.properties diff --git a/.gitignore b/.gitignore index 7f1bf5b..dc52fbb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea /target +/screenshots *.iml \ No newline at end of file diff --git a/src/main/java/elements/webElementsExtensions/PageElement.java b/src/main/java/elements/webElementsExtensions/PageElement.java index e0ff45b..6c29c51 100644 --- a/src/main/java/elements/webElementsExtensions/PageElement.java +++ b/src/main/java/elements/webElementsExtensions/PageElement.java @@ -45,7 +45,7 @@ public void submit() { @Override public void sendKeys(CharSequence... charSequences) { - logger.debug("Sending [{}] to [{}] field.", Arrays.toString(charSequences), elementName); + logger.debug("Sending {} to [{}] field.", Arrays.toString(charSequences), elementName); wrappedElement.sendKeys(charSequences); } diff --git a/src/main/java/utils/PropertiesReader.java b/src/main/java/utils/PropertiesReader.java new file mode 100644 index 0000000..c42678e --- /dev/null +++ b/src/main/java/utils/PropertiesReader.java @@ -0,0 +1,42 @@ +package utils; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Properties; + +public class PropertiesReader { + + private Properties properties; + + private String baseUrl; + private String inventoryUrl; + + public PropertiesReader(String fileLocation) { + initProperties(fileLocation); + loadProperties(); + } + + private void loadProperties() { + baseUrl = properties.getProperty("baseUrl"); + inventoryUrl = properties.getProperty("inventoryUrl"); + } + + public void initProperties(String fileLocation) { + properties = new Properties(); + + try { + properties.load(new InputStreamReader(new FileInputStream(fileLocation))); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public String getBaseUrl() { + return baseUrl; + } + + public String getInventoryUrl() { + return inventoryUrl; + } +} diff --git a/src/main/java/utils/Utils.java b/src/main/java/utils/Utils.java new file mode 100644 index 0000000..00f3cac --- /dev/null +++ b/src/main/java/utils/Utils.java @@ -0,0 +1,31 @@ +package utils; + +import org.openqa.selenium.OutputType; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.io.FileHandler; + +import java.io.File; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class Utils { + + public static String takeScreenshot(String name, WebDriver driver) { + File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH.mm.ss"); + File screenshotsDirectory = new File("screenshots/"); + if (!screenshotsDirectory.exists()){ + screenshotsDirectory.mkdirs(); + } + String path = "screenshots/" + name + "_" + formatter.format(LocalDateTime.now()) + ".png"; + try { + FileHandler.copy(screenshot, new File(path)); + } catch (IOException e) { + e.printStackTrace(); + } + return path; + } +} diff --git a/src/main/java/utils/WebDriverUtils.java b/src/main/java/utils/WebDriverUtils.java index 8ac0c42..46b0c60 100644 --- a/src/main/java/utils/WebDriverUtils.java +++ b/src/main/java/utils/WebDriverUtils.java @@ -12,7 +12,7 @@ public class WebDriverUtils { private static WebDriver driver; private static BrowserType browserType = BrowserType.CHROME; - private static final String[] OPTIONS_ARGUMENTS = new String[]{"disable-popup-blocking"}; + private static final String[] OPTIONS_ARGUMENTS = new String[]{"disable-popup-blocking", "--remote-allow-origins=*"}; /** * If setBrowserType method was not called then Chrome browser will be initialized. diff --git a/src/test/java/helpers/TestStatus.java b/src/test/java/helpers/TestStatus.java new file mode 100644 index 0000000..457f27c --- /dev/null +++ b/src/test/java/helpers/TestStatus.java @@ -0,0 +1,13 @@ +package helpers; + +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +public class TestStatus implements AfterTestExecutionCallback { + public boolean isFailed; + + @Override + public void afterTestExecution(ExtensionContext extensionContext) { + isFailed = extensionContext.getExecutionException().isPresent(); + } +} \ No newline at end of file diff --git a/src/test/java/pages/LogInPage.java b/src/test/java/pages/LogInPage.java index 83d3f83..5d1ccc4 100644 --- a/src/test/java/pages/LogInPage.java +++ b/src/test/java/pages/LogInPage.java @@ -39,7 +39,6 @@ public ProductsPage clickOnLoginButton() { public void assertErrorMessage(String expectedErrorMessage) { String actualErrorMessage = WaitUtils.waitForElementToBeVisible(failedLoginMessage).getText(); - assertEquals(expectedErrorMessage, actualErrorMessage, - "Actual error message:" + actualErrorMessage + " is not equal to expected: " + expectedErrorMessage); + assertEquals(expectedErrorMessage, actualErrorMessage, "Actual error message is not equal to expected."); } } diff --git a/src/test/java/pages/ProductsPage.java b/src/test/java/pages/ProductsPage.java index 82e7e7f..9753b39 100644 --- a/src/test/java/pages/ProductsPage.java +++ b/src/test/java/pages/ProductsPage.java @@ -8,6 +8,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; import static utils.WaitUtils.waitForElementToBeVisible; public class ProductsPage extends _PageInit { @@ -36,4 +37,9 @@ public ProductsPage printOutProducts() { } return this; } + + public void assertNumberOfProducts(int expectedNumberOfProducts) { + int actualNumberOfProducts = productPageItemsList.size(); + assertEquals(expectedNumberOfProducts, actualNumberOfProducts, "Actual number of products is not equal to expected."); + } } diff --git a/src/test/java/tests/LoginPageTests.java b/src/test/java/tests/LoginPageTests.java index 0e2c592..c294c36 100644 --- a/src/test/java/tests/LoginPageTests.java +++ b/src/test/java/tests/LoginPageTests.java @@ -1,17 +1,19 @@ package tests; -import org.junit.jupiter.api.BeforeEach; +import io.qameta.allure.Description; +import io.qameta.allure.Severity; +import io.qameta.allure.SeverityLevel; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import pages.LogInPage; +@DisplayName("Login page Tests") public class LoginPageTests extends _TestsHooks { - @BeforeEach - public void beforeTest() { - driver.get(LOG_IN_PAGE_URL); - } - @Test + @DisplayName("Correct data login") + @Description("Log in with correct user") + @Severity(SeverityLevel.BLOCKER) public void correctDataLoginTest() { LogInPage logInPage = new LogInPage(); logInPage @@ -22,6 +24,8 @@ public void correctDataLoginTest() { } @Test + @Description("Try to log in with incorrect user") + @Severity(SeverityLevel.NORMAL) public void incorrectDataLoginTest() { LogInPage logInPage = new LogInPage(); logInPage @@ -32,6 +36,8 @@ public void incorrectDataLoginTest() { } @Test + @Description("Try to log in with locked user") + @Severity(SeverityLevel.NORMAL) public void lockedUserLoginTest() { LogInPage logInPage = new LogInPage(); logInPage diff --git a/src/test/java/tests/ProductPageTests.java b/src/test/java/tests/ProductPageTests.java index e36c970..3397358 100644 --- a/src/test/java/tests/ProductPageTests.java +++ b/src/test/java/tests/ProductPageTests.java @@ -1,24 +1,32 @@ package tests; +import io.qameta.allure.Description; +import io.qameta.allure.Severity; +import io.qameta.allure.SeverityLevel; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.openqa.selenium.Cookie; import pages.ProductsPage; +@DisplayName("Products page Tests") public class ProductPageTests extends _TestsHooks { @BeforeEach public void beforeTest() { - driver.get(LOG_IN_PAGE_URL); driver.manage().addCookie(new Cookie("session-username", "standard_user")); driver.manage().addCookie(new Cookie("session-password", "secret_sauce")); - driver.get(LOG_IN_PAGE_URL + "/inventory.html"); + driver.get(testData.getInventoryUrl()); } @Test - public void printOutProductsTest() { + @Severity(SeverityLevel.CRITICAL) + @DisplayName("Products page products number tests") + @Description("Print out products and confirm number of products ") + public void printOutAndCountProductsTest() { ProductsPage productsPage = new ProductsPage(); productsPage - .printOutProducts(); + .printOutProducts() + .assertNumberOfProducts(6); } } diff --git a/src/test/java/tests/_TestsHooks.java b/src/test/java/tests/_TestsHooks.java index a5e9b7d..25a7bef 100644 --- a/src/test/java/tests/_TestsHooks.java +++ b/src/test/java/tests/_TestsHooks.java @@ -1,34 +1,48 @@ package tests; -import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; +import helpers.TestStatus; +import io.qameta.allure.Allure; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.extension.RegisterExtension; import org.openqa.selenium.WebDriver; import utils.BrowserType; -import utils.LoggingUtils; +import utils.PropertiesReader; +import utils.Utils; import utils.WebDriverUtils; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class _TestsHooks { - public WebDriver driver; - protected static final String LOG_IN_PAGE_URL = "https://www.saucedemo.com"; - protected Logger logger = LoggingUtils.getLogger(this.getClass()); + protected WebDriver driver; + protected PropertiesReader testData; + + @RegisterExtension + TestStatus testStatus = new TestStatus(); @BeforeAll - static void beforeAll() { + public void beforeAll() { /* Available options: CHROME, EDGE, FIREFOX */ WebDriverUtils.setBrowserType(BrowserType.CHROME); + testData = new PropertiesReader("src/test/resources/TestData.properties"); } @BeforeEach public void beforeEach() { driver = WebDriverUtils.getWebDriver(); driver.manage().window().maximize(); + driver.get(testData.getBaseUrl()); } @AfterEach - public void afterEach() { + public void afterEach(TestInfo testInfo) throws IOException { + if (testStatus.isFailed) { + String path = Utils.takeScreenshot(testInfo.getDisplayName(), driver); + Allure.attachment("screenshot", Files.newInputStream(Paths.get(path))); + } WebDriverUtils.quitDriver(); } } diff --git a/src/test/resources/TestData.properties b/src/test/resources/TestData.properties new file mode 100644 index 0000000..77a6d22 --- /dev/null +++ b/src/test/resources/TestData.properties @@ -0,0 +1,2 @@ +baseUrl=https://www.saucedemo.com/ +inventoryUrl=https://www.saucedemo.com/inventory.html \ No newline at end of file