From 3b1af3333d687e354ab9fa0a475ae7ef74b740f9 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Tue, 20 Sep 2022 21:13:24 +0500 Subject: Add testing framework --- README.md | 2 +- pom.xml | 51 ++++++++++++++++ .../mavlushechka/a1qa/driverUtils/ActionUtils.java | 21 +++++++ .../mavlushechka/a1qa/driverUtils/AlertUtils.java | 31 ++++++++++ .../mavlushechka/a1qa/driverUtils/FrameUtils.java | 20 ++++++ .../a1qa/driverUtils/WebDriverFactory.java | 66 ++++++++++++++++++++ .../a1qa/driverUtils/WebDriverSingleton.java | 21 +++++++ .../a1qa/driverUtils/WebDriverUtils.java | 45 ++++++++++++++ .../a1qa/driverUtils/WebDriverWaitFactory.java | 17 ++++++ .../mavlushechka/a1qa/elements/BaseElement.java | 71 ++++++++++++++++++++++ .../com/mavlushechka/a1qa/elements/Button.java | 11 ++++ .../java/com/mavlushechka/a1qa/elements/Field.java | 29 +++++++++ .../java/com/mavlushechka/a1qa/elements/Label.java | 11 ++++ .../com/mavlushechka/a1qa/elements/Slider.java | 29 +++++++++ .../java/com/mavlushechka/a1qa/models/Browser.java | 8 +++ .../java/com/mavlushechka/a1qa/pages/BaseForm.java | 24 ++++++++ .../com/mavlushechka/a1qa/utils/DoubleUtils.java | 9 +++ .../com/mavlushechka/a1qa/utils/IntegerUtils.java | 21 +++++++ .../com/mavlushechka/a1qa/utils/JSONParser.java | 53 ++++++++++++++++ .../com/mavlushechka/a1qa/utils/LoggerUtils.java | 46 ++++++++++++++ .../com/mavlushechka/a1qa/utils/StringUtils.java | 39 ++++++++++++ src/main/resources/config.json | 20 ++++++ src/main/resources/log4j2.xml | 23 +++++++ src/main/resources/testData.json | 3 + src/test/java/com/mavlushechka/a1qa/BaseTest.java | 24 ++++++++ 25 files changed, 694 insertions(+), 1 deletion(-) create mode 100644 pom.xml create mode 100644 src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java create mode 100644 src/main/java/com/mavlushechka/a1qa/driverUtils/AlertUtils.java create mode 100644 src/main/java/com/mavlushechka/a1qa/driverUtils/FrameUtils.java create mode 100644 src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverFactory.java create mode 100644 src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverSingleton.java create mode 100644 src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverUtils.java create mode 100644 src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverWaitFactory.java create mode 100644 src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java create mode 100644 src/main/java/com/mavlushechka/a1qa/elements/Button.java create mode 100644 src/main/java/com/mavlushechka/a1qa/elements/Field.java create mode 100644 src/main/java/com/mavlushechka/a1qa/elements/Label.java create mode 100644 src/main/java/com/mavlushechka/a1qa/elements/Slider.java create mode 100644 src/main/java/com/mavlushechka/a1qa/models/Browser.java create mode 100644 src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java create mode 100644 src/main/java/com/mavlushechka/a1qa/utils/DoubleUtils.java create mode 100644 src/main/java/com/mavlushechka/a1qa/utils/IntegerUtils.java create mode 100644 src/main/java/com/mavlushechka/a1qa/utils/JSONParser.java create mode 100644 src/main/java/com/mavlushechka/a1qa/utils/LoggerUtils.java create mode 100644 src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java create mode 100644 src/main/resources/config.json create mode 100644 src/main/resources/log4j2.xml create mode 100644 src/main/resources/testData.json create mode 100644 src/test/java/com/mavlushechka/a1qa/BaseTest.java diff --git a/README.md b/README.md index c231eac..522ca43 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# m.erkinboev \ No newline at end of file +# Testing Framework \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fa4dc88 --- /dev/null +++ b/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + com.mavlushechka.a1qa + task3 + 1.0-SNAPSHOT + + + + org.seleniumhq.selenium + selenium-java + 4.4.0 + + + io.github.bonigarcia + webdrivermanager + 5.3.0 + + + org.testng + testng + 7.6.1 + test + + + com.googlecode.json-simple + json-simple + 1.1.1 + + + org.apache.logging.log4j + log4j-core + 2.18.0 + + + org.awaitility + awaitility + 4.2.0 + + + + + 18 + 18 + UTF-8 + + + \ No newline at end of file diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java new file mode 100644 index 0000000..88caf46 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java @@ -0,0 +1,21 @@ +package com.mavlushechka.a1qa.driverUtils; + +import org.openqa.selenium.Point; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; + +public class ActionUtils { + + private ActionUtils() { + } + + public static void dragAndDrop(WebElement element, Point currentPoint, Point expectedPoint) { + new Actions(WebDriverSingleton.getInstance()) + .moveToElement(element, currentPoint.x, currentPoint.y) + .click() + .dragAndDropBy(element, expectedPoint.x, expectedPoint.y) + .build() + .perform(); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/AlertUtils.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/AlertUtils.java new file mode 100644 index 0000000..8095365 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/AlertUtils.java @@ -0,0 +1,31 @@ +package com.mavlushechka.a1qa.driverUtils; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.support.ui.ExpectedConditions; + +public class AlertUtils { + + private AlertUtils() { + } + + public static boolean isAlertPresent() { + return ExpectedConditions.alertIsPresent().apply(WebDriverSingleton.getInstance()) != null; + } + + public static String getAlertText() { + return findAlert().getText(); + } + + public static void sendKeysToAlert(String keysToSend) { + findAlert().sendKeys(keysToSend); + } + + public static void acceptAlert() { + findAlert().accept(); + } + + private static Alert findAlert() { + return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.alertIsPresent()); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/FrameUtils.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/FrameUtils.java new file mode 100644 index 0000000..d270cae --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/FrameUtils.java @@ -0,0 +1,20 @@ +package com.mavlushechka.a1qa.driverUtils; + +public class FrameUtils { + + private FrameUtils() { + } + + public static void switchToFrame(String nameOrId) { + WebDriverSingleton.getInstance().switchTo().frame(nameOrId); + } + + public static void switchToFrame(int index) { + WebDriverSingleton.getInstance().switchTo().frame(index); + } + + public static void switchToDefaultContent() { + WebDriverSingleton.getInstance().switchTo().defaultContent(); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverFactory.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverFactory.java new file mode 100644 index 0000000..e52a9cf --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverFactory.java @@ -0,0 +1,66 @@ +package com.mavlushechka.a1qa.driverUtils; + +import com.mavlushechka.a1qa.models.Browser; +import com.mavlushechka.a1qa.utils.JSONParser; +import com.mavlushechka.a1qa.utils.LoggerUtils; +import com.mavlushechka.a1qa.utils.StringUtils; +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxOptions; + +public class WebDriverFactory { + + private WebDriverFactory() { + } + + protected static WebDriver createWebDriver() { + switch (Browser.valueOf(StringUtils.convertToConstantCase(JSONParser.parse("config", "browser.name")))) { + case CHROME -> { + LoggerUtils.info("Creating ChromeDriver."); + return createChromeDriver(); + } + case FIREFOX -> { + LoggerUtils.info("Creating FirefoxDriver."); + return createFirefoxDriver(); + } + default -> { + LoggerUtils.error("Incorrect browser name."); + throw new IllegalStateException("Incorrect browser name."); + } + } + } + + private static ChromeDriver createChromeDriver() { + ChromeOptions chromeOptions = new ChromeOptions(); + + WebDriverManager.chromedriver().setup(); + if (Boolean.parseBoolean(JSONParser.parse("config", "browser.isIncognito"))) { + LoggerUtils.info("Turning on Chrome incognito mode."); + chromeOptions.addArguments("--incognito"); + } + if (Boolean.parseBoolean(JSONParser.parse("config", "browser.isKiosk"))) { + LoggerUtils.info("Turning on Chrome kiosk mode."); + chromeOptions.addArguments("--kiosk"); + } + return new ChromeDriver(chromeOptions); + } + + private static FirefoxDriver createFirefoxDriver() { + FirefoxOptions firefoxOptions = new FirefoxOptions(); + + WebDriverManager.firefoxdriver().setup(); + if (Boolean.parseBoolean(JSONParser.parse("config", "browser.isIncognito"))) { + LoggerUtils.info("Turning on Firefox incognito mode."); + firefoxOptions.addArguments("--private"); + } + if (Boolean.parseBoolean(JSONParser.parse("config", "browser.isKiosk"))) { + LoggerUtils.info("Turning on Firefox kiosk mode."); + firefoxOptions.addArguments("--kiosk"); + } + return new FirefoxDriver(firefoxOptions); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverSingleton.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverSingleton.java new file mode 100644 index 0000000..ba6f91c --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverSingleton.java @@ -0,0 +1,21 @@ +package com.mavlushechka.a1qa.driverUtils; + +import org.openqa.selenium.WebDriver; + +public class WebDriverSingleton { + + private static WebDriver instance; + + + private WebDriverSingleton() { + } + + protected static WebDriver getInstance() { + if (instance == null) { + instance = WebDriverFactory.createWebDriver(); + } + + return instance; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverUtils.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverUtils.java new file mode 100644 index 0000000..f4c5ec3 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverUtils.java @@ -0,0 +1,45 @@ +package com.mavlushechka.a1qa.driverUtils; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import java.util.List; + +public class WebDriverUtils { + + private final static WebDriver webDriver = WebDriverSingleton.getInstance(); + + + private WebDriverUtils() { + } + + public static void goToAddress(String address) { + webDriver.get(address); + } + + public static WebElement findElement(By locator) { + return webDriver.findElement(locator); + } + + public static List findElements(By locator) { + return webDriver.findElements(locator); + } + + public static int getWindowHandlesCount() { + return webDriver.getWindowHandles().size(); + } + + public static void switchToWindowHandle(int index) { + webDriver.switchTo().window(webDriver.getWindowHandles().toArray()[index].toString()); + } + + public static void close() { + webDriver.close(); + } + + public static void quit() { + webDriver.quit(); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverWaitFactory.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverWaitFactory.java new file mode 100644 index 0000000..81e50a7 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverWaitFactory.java @@ -0,0 +1,17 @@ +package com.mavlushechka.a1qa.driverUtils; + +import com.mavlushechka.a1qa.utils.JSONParser; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.time.Duration; + +public class WebDriverWaitFactory { + + private WebDriverWaitFactory() { + } + + public static WebDriverWait createWebDriverWait() { + return new WebDriverWait(WebDriverSingleton.getInstance(), Duration.ofSeconds(Integer.parseInt(JSONParser.parse("config", "webDriverWait.durationOfSeconds")))); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java new file mode 100644 index 0000000..edcf1e7 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java @@ -0,0 +1,71 @@ +package com.mavlushechka.a1qa.elements; + +import com.mavlushechka.a1qa.driverUtils.WebDriverUtils; +import com.mavlushechka.a1qa.utils.LoggerUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; + +public abstract class BaseElement { + + private final By locator; + private final String name; + + + public BaseElement(By locator, String name) { + this.locator = locator; + this.name = name; + } + + public void click() { + WebElement webElement = find(); + + LoggerUtils.info("Clicking on the \"" + name + "\" element."); + webElement.click(); + } + + public String getText() { + WebElement webElement = find(); + + LoggerUtils.info("Getting text of the \"" + name + "\" element."); + return webElement.getText(); + } + + public boolean isEnabled() { + WebElement webElement = find(); + + LoggerUtils.info("Getting state of the \"" + name + "\" element."); + return webElement.isEnabled(); + } + + public boolean isVisible() { + WebElement webElement = find(); + + LoggerUtils.info("Getting visibility of the \"" + name + "\" element."); + return webElement.isDisplayed(); + } + + public String getName() { + return name; + } + + public Dimension getDimension() { + WebElement webElement = find(); + + LoggerUtils.info("Getting dimension of the \"" + name + "\" element."); + return webElement.getSize(); + } + + public String getAttributeValue(String attribute) { + WebElement webElement = find(); + + LoggerUtils.info("Getting \"" + attribute + "\" attribute of the \"" + name + "\" element."); + return webElement.getAttribute(attribute); + } + + protected WebElement find() { + LoggerUtils.info("Finding the \"" + name + "\" element."); + return WebDriverUtils.findElement(locator); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/elements/Button.java b/src/main/java/com/mavlushechka/a1qa/elements/Button.java new file mode 100644 index 0000000..d68b5f6 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/elements/Button.java @@ -0,0 +1,11 @@ +package com.mavlushechka.a1qa.elements; + +import org.openqa.selenium.By; + +public class Button extends BaseElement { + + public Button(By locator, String name) { + super(locator, name); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/elements/Field.java b/src/main/java/com/mavlushechka/a1qa/elements/Field.java new file mode 100644 index 0000000..bf573db --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/elements/Field.java @@ -0,0 +1,29 @@ +package com.mavlushechka.a1qa.elements; + +import com.mavlushechka.a1qa.utils.LoggerUtils; +import com.mavlushechka.a1qa.utils.StringUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +public class Field extends BaseElement { + + public Field(By locator, String name) { + super(locator, name); + } + + public void sendKeys(String keys) { + sendKeys(keys, false); + } + + public void sendKeys(String keys, boolean isSecret) { + WebElement field = find(); + + LoggerUtils.info("Entering \"" + (isSecret ? StringUtils.replaceByStars(keys) : keys) + "\" keys to the \"" + getName() + "\" field."); + field.sendKeys(keys); + } + + public String getValue() { + return find().getAttribute("value"); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/elements/Label.java b/src/main/java/com/mavlushechka/a1qa/elements/Label.java new file mode 100644 index 0000000..a822f63 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/elements/Label.java @@ -0,0 +1,11 @@ +package com.mavlushechka.a1qa.elements; + +import org.openqa.selenium.By; + +public class Label extends BaseElement { + + public Label(By locator, String name) { + super(locator, name); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/elements/Slider.java b/src/main/java/com/mavlushechka/a1qa/elements/Slider.java new file mode 100644 index 0000000..45c1e69 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/elements/Slider.java @@ -0,0 +1,29 @@ +package com.mavlushechka.a1qa.elements; + +import com.mavlushechka.a1qa.driverUtils.ActionUtils; +import com.mavlushechka.a1qa.utils.DoubleUtils; +import com.mavlushechka.a1qa.utils.LoggerUtils; +import org.openqa.selenium.By; +import org.openqa.selenium.Point; +import org.openqa.selenium.WebElement; + +public class Slider extends BaseElement { + + public Slider(By locator, String name) { + super(locator, name); + } + + public void slideTo(int percentage) { + WebElement slider = find(); + Point currentPoint = new Point((int) Math.round(DoubleUtils.getPercentageOf(slider.getSize().getWidth(), getValue())-getDimension().width/2.0), 0); + Point expectedPoint = new Point((int) Math.round(DoubleUtils.getPercentageOf(slider.getSize().getWidth(), percentage)-getDimension().width/2.0), 0); + + LoggerUtils.info("Sliding on the \"" + getName() + "\" element."); + ActionUtils.dragAndDrop(slider, currentPoint, expectedPoint); + } + + public int getValue() { + return Integer.parseInt(find().getAttribute("value")); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/models/Browser.java b/src/main/java/com/mavlushechka/a1qa/models/Browser.java new file mode 100644 index 0000000..013236b --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/models/Browser.java @@ -0,0 +1,8 @@ +package com.mavlushechka.a1qa.models; + + +public enum Browser { + + CHROME, FIREFOX + +} diff --git a/src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java b/src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java new file mode 100644 index 0000000..d6a1577 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java @@ -0,0 +1,24 @@ +package com.mavlushechka.a1qa.pages; + +import com.mavlushechka.a1qa.elements.BaseElement; + +public abstract class BaseForm { + + private final BaseElement uniqueElement; + private final String name; + + + public BaseForm(BaseElement uniqueElement, String name) { + this.uniqueElement = uniqueElement; + this.name = name; + } + + public boolean isOpened() { + return uniqueElement.isVisible(); + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/utils/DoubleUtils.java b/src/main/java/com/mavlushechka/a1qa/utils/DoubleUtils.java new file mode 100644 index 0000000..d68b18c --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/utils/DoubleUtils.java @@ -0,0 +1,9 @@ +package com.mavlushechka.a1qa.utils; + +public class DoubleUtils { + + public static double getPercentageOf(double number, double percentage) { + return number / 100 * percentage; + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/utils/IntegerUtils.java b/src/main/java/com/mavlushechka/a1qa/utils/IntegerUtils.java new file mode 100644 index 0000000..37f3eb8 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/utils/IntegerUtils.java @@ -0,0 +1,21 @@ +package com.mavlushechka.a1qa.utils; + +import java.util.OptionalInt; +import java.util.Random; + +public class IntegerUtils { + + private IntegerUtils() { + } + + public static int getRandomNumber(int min, int max) { + OptionalInt randomNumber = new Random().ints(min, max).findFirst(); + + if (randomNumber.isPresent()) { + return randomNumber.getAsInt(); + } + LoggerUtils.error("Incorrect min and max arguments."); + throw new IllegalArgumentException("Incorrect min and max arguments."); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/utils/JSONParser.java b/src/main/java/com/mavlushechka/a1qa/utils/JSONParser.java new file mode 100644 index 0000000..b98fcec --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/utils/JSONParser.java @@ -0,0 +1,53 @@ +package com.mavlushechka.a1qa.utils; + +import org.json.simple.JSONObject; +import org.json.simple.parser.ParseException; + +import java.io.FileReader; +import java.io.IOException; +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; + +public class JSONParser { + + private final static org.json.simple.parser.JSONParser jsonParser = new org.json.simple.parser.JSONParser(); + private final static TreeMap parsedData = new TreeMap<>(); + + + public static String parse(String filename, String key) { + Map.Entry ceilingEntry = parsedData.ceilingEntry(filename + "."); + String requiredData; + + if (ceilingEntry == null || !ceilingEntry.getKey().startsWith(filename + ".")) { + parseFile(filename); + } + requiredData = parsedData.get(filename + "." + key); + + return Optional.ofNullable(requiredData).orElseThrow(() -> new IllegalArgumentException("Cannot find required data.")); + } + + private static void parseFile(String filename) { + JSONObject jsonObject; + + try (FileReader fileReader = new FileReader("src/main/resources/" + filename + ".json")) { + jsonObject = (JSONObject) jsonParser.parse(fileReader); + } catch (ParseException | IOException e) { + throw new IllegalArgumentException("Cannot find required file."); + } + putToParsedData(jsonObject, filename); + } + + private static void putToParsedData(JSONObject jsonObject, String filename) { + for (int i = 0; i < jsonObject.keySet().size(); i++) { + String[] keyValues = jsonObject.values().toArray()[i].toString().replaceAll("[{}\"\\\\]", "").split(","); + + for (String keyValue : keyValues) { + String[] splitKeyValue = keyValue.split(":", 2); + + parsedData.put(filename + "." + jsonObject.keySet().toArray()[i] + "." + splitKeyValue[0], splitKeyValue[1]); + } + } + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/utils/LoggerUtils.java b/src/main/java/com/mavlushechka/a1qa/utils/LoggerUtils.java new file mode 100644 index 0000000..51d49ae --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/utils/LoggerUtils.java @@ -0,0 +1,46 @@ +package com.mavlushechka.a1qa.utils; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.core.config.xml.XmlConfiguration; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class LoggerUtils { + + private final static File CONFIGURATION_FILE = new File("src/main/resources/log4j2.xml"); + private static Logger logger; + private static int step = 0; + + + private LoggerUtils() { + } + + public static void initialize() { + try { + Configurator.initialize(new XmlConfiguration(null, new ConfigurationSource(new FileInputStream(CONFIGURATION_FILE)))); + } catch (IOException ioException) { + throw new RuntimeException(ioException); + } + logger = LogManager.getLogger(); + } + + public static void info(String text) { + logger.log(Level.INFO, text); + } + + public static void error(String text) { + logger.log(Level.ERROR, text); + } + + public static void step(String text) { + step++; + logger.log(Level.INFO, "Step %d: %s".formatted(step, text)); + } + +} diff --git a/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java b/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java new file mode 100644 index 0000000..1739068 --- /dev/null +++ b/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java @@ -0,0 +1,39 @@ +package com.mavlushechka.a1qa.utils; + +import java.util.Random; + +public class StringUtils { + + private StringUtils() { + } + + public static String convertToConstantCase(String text) { + StringBuilder stringBuilder = new StringBuilder(); + String[] words = text.split(" "); + + for (int i = 0; i < words.length; i++) { + stringBuilder.append(words[i].toUpperCase()); + if (i != words.length-1) { + stringBuilder.append("_"); + } + } + + return stringBuilder.toString(); + } + + public static int removeNonDigits(String text) { + return Integer.parseInt(text.replaceAll("[^0-9]+", "")); + } + + public static String generateRandomText(int lettersLowerBound, int lettersUpperBound, int length) { + return new Random().ints(lettersLowerBound, lettersUpperBound + 1) + .limit(length) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + } + + public static String replaceByStars(String text) { + return "*".repeat(text.length()); + } + +} diff --git a/src/main/resources/config.json b/src/main/resources/config.json new file mode 100644 index 0000000..2ede7ad --- /dev/null +++ b/src/main/resources/config.json @@ -0,0 +1,20 @@ +{ + "browser": { + "name": "Firefox", + "isIncognito": true, + "isKiosk": true, + "url": "https://userinyerface.com/" + }, + "webDriverWait": { + "durationOfSeconds": 3 + }, + "randomTextGenerator": { + "lettersLowerBound": 97, + "lettersUpperBound": 122, + "length": 10 + }, + "integerUtils": { + "randomNumberMin": 0, + "randomNumberMax": 101 + } +} \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 0000000..756a521 --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,23 @@ + + + + + + + + + %d %p %c{1.} [%t] %m%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/testData.json b/src/main/resources/testData.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/src/main/resources/testData.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/src/test/java/com/mavlushechka/a1qa/BaseTest.java b/src/test/java/com/mavlushechka/a1qa/BaseTest.java new file mode 100644 index 0000000..e6a354c --- /dev/null +++ b/src/test/java/com/mavlushechka/a1qa/BaseTest.java @@ -0,0 +1,24 @@ +package com.mavlushechka.a1qa; + +import com.mavlushechka.a1qa.driverUtils.WebDriverUtils; +import com.mavlushechka.a1qa.utils.JSONParser; +import com.mavlushechka.a1qa.utils.LoggerUtils; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeSuite; + +public class BaseTest { + + @BeforeSuite + public void setUp() { + LoggerUtils.initialize(); + LoggerUtils.step("Go to home page."); + WebDriverUtils.goToAddress(JSONParser.parse("config", "browser.url")); + } + + @AfterTest + public void tearDown() { + LoggerUtils.info("Quiting the webdriver."); + WebDriverUtils.quit(); + } + +} -- cgit v1.2.3