Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Latest changes from develop with Allure and prperties by Dymitriux · Pull Request #18 · Dymitriux/Java_Selenium · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Latest changes from develop with Allure and prperties by Dymitriux · Pull Request #18 · Dymitriux/Java_Selenium · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Latest changes from develop with Allure and prperties by Dymitriux · Pull Request #18 · Dymitriux/Java_Selenium · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Latest changes from develop with Allure and prperties by Dymitriux · Pull Request #18 · Dymitriux/Java_Selenium · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Latest changes from develop with Allure and prperties by Dymitriux · Pull Request #18 · Dymitriux/Java_Selenium · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Latest changes from develop with Allure and prperties by Dymitriux · Pull Request #18 · Dymitriux/Java_Selenium · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Latest changes from develop with Allure and prperties by Dymitriux · Pull Request #18 · Dymitriux/Java_Selenium · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
.idea
/target
/screenshots
*.iml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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);
}

Expand Down
42 changes: 42 additions & 0 deletions src/main/java/utils/PropertiesReader.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/utils/Utils.java
Original file line numberDiff line numberDiff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion src/main/java/utils/WebDriverUtils.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/helpers/TestStatus.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
3 changes: 1 addition & 2 deletions src/test/java/pages/LogInPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.");
}
}
6 changes: 6 additions & 0 deletions src/test/java/pages/ProductsPage.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -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 {
Expand DownExpand Up@@ -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.");
}
}
18 changes: 12 additions & 6 deletions src/test/java/tests/LoginPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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
Expand All@@ -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
Expand All@@ -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
Expand Down
16 changes: 12 additions & 4 deletions src/test/java/tests/ProductPageTests.java
Original file line numberDiff line numberDiff line change
@@ -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);
}
}
34 changes: 24 additions & 10 deletions src/test/java/tests/_TestsHooks.java
Original file line numberDiff line numberDiff line change
@@ -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();
}
}
2 changes: 2 additions & 0 deletions src/test/resources/TestData.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
baseUrl=https://www.saucedemo.com/
inventoryUrl=https://www.saucedemo.com/inventory.html