summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--pom.xml51
-rw-r--r--src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java25
-rw-r--r--src/main/java/com/mavlushechka/a1qa/driverUtils/AlertUtils.java31
-rw-r--r--src/main/java/com/mavlushechka/a1qa/driverUtils/FrameUtils.java20
-rw-r--r--src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverFactory.java66
-rw-r--r--src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverSingleton.java21
-rw-r--r--src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverUtils.java45
-rw-r--r--src/main/java/com/mavlushechka/a1qa/driverUtils/WebDriverWaitFactory.java17
-rw-r--r--src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java86
-rw-r--r--src/main/java/com/mavlushechka/a1qa/elements/Button.java11
-rw-r--r--src/main/java/com/mavlushechka/a1qa/elements/Field.java36
-rw-r--r--src/main/java/com/mavlushechka/a1qa/elements/Label.java11
-rw-r--r--src/main/java/com/mavlushechka/a1qa/elements/Slider.java29
-rw-r--r--src/main/java/com/mavlushechka/a1qa/models/Browser.java8
-rw-r--r--src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java24
-rw-r--r--src/main/java/com/mavlushechka/a1qa/utils/DoubleUtils.java9
-rw-r--r--src/main/java/com/mavlushechka/a1qa/utils/IntegerUtils.java21
-rw-r--r--src/main/java/com/mavlushechka/a1qa/utils/JSONParser.java53
-rw-r--r--src/main/java/com/mavlushechka/a1qa/utils/LoggerUtils.java46
-rw-r--r--src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java43
-rw-r--r--src/main/resources/config.json20
-rw-r--r--src/main/resources/log4j2.xml23
-rw-r--r--src/main/resources/testData.json3
-rw-r--r--src/test/java/com/mavlushechka/a1qa/BaseTest.java24
25 files changed, 724 insertions, 1 deletions
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.mavlushechka.a1qa</groupId>
+ <artifactId>task3</artifactId>
+ <version>1.0-SNAPSHOT</version>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.seleniumhq.selenium</groupId>
+ <artifactId>selenium-java</artifactId>
+ <version>4.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>io.github.bonigarcia</groupId>
+ <artifactId>webdrivermanager</artifactId>
+ <version>5.3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <version>7.6.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.googlecode.json-simple</groupId>
+ <artifactId>json-simple</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>2.18.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.awaitility</groupId>
+ <artifactId>awaitility</artifactId>
+ <version>4.2.0</version>
+ </dependency>
+ </dependencies>
+
+ <properties>
+ <maven.compiler.source>18</maven.compiler.source>
+ <maven.compiler.target>18</maven.compiler.target>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+</project> \ 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..bd7b85b
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java
@@ -0,0 +1,25 @@
+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();
+ }
+
+ public static void scrollTo(WebElement webElement) {
+ new Actions(WebDriverSingleton.getInstance()).moveToElement(webElement);
+ }
+
+}
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<WebElement> 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..a2dc55a
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java
@@ -0,0 +1,86 @@
+package com.mavlushechka.a1qa.elements;
+
+import com.mavlushechka.a1qa.driverUtils.ActionUtils;
+import com.mavlushechka.a1qa.driverUtils.WebDriverUtils;
+import com.mavlushechka.a1qa.driverUtils.WebDriverWaitFactory;
+import com.mavlushechka.a1qa.utils.LoggerUtils;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Dimension;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+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();
+
+ scrollTo();
+ 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() {
+ LoggerUtils.info("Getting visibility of the \"" + name + "\" element.");
+ return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.visibilityOfElementLocated(locator)).isDisplayed();
+ }
+
+ public boolean isInvisible() {
+ LoggerUtils.info("Getting invisibility of the \"" + name + "\" element.");
+ return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.invisibilityOfElementLocated(locator));
+ }
+
+ 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() {
+ isVisible();
+ LoggerUtils.info("Finding the \"" + name + "\" element.");
+ return WebDriverUtils.findElement(locator);
+ }
+
+ protected void scrollTo() {
+ WebElement webElement = find();
+
+ LoggerUtils.info("Scrolling to the \"" + name + "\" element.");
+ ActionUtils.scrollTo(webElement);
+ }
+
+}
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..99cd41d
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/elements/Field.java
@@ -0,0 +1,36 @@
+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 void clear() {
+ WebElement field = find();
+
+ LoggerUtils.info("Clearing the \"" + getName() + "\" field.");
+ field.clear();
+ }
+
+ 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..3ac855a
--- /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 {
+
+ protected final BaseElement uniqueElement;
+ protected 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<String, String> parsedData = new TreeMap<>();
+
+
+ public static String parse(String filename, String key) {
+ Map.Entry<String, String> 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..cbce72f
--- /dev/null
+++ b/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java
@@ -0,0 +1,43 @@
+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 String capitalizeFirstLetter(String text) {
+ return text.substring(0, 1).toUpperCase() + text.substring(1);
+ }
+
+ 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..54b5c23
--- /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": 15
+ },
+ "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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="INFO">
+ <Appenders>
+ <Console name="consoleAppender" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+ </Console>
+ <File name="fileAppender" fileName="target/logFile.log">
+ <PatternLayout>
+ <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
+ </PatternLayout>
+ </File>
+ </Appenders>
+ <Loggers>
+ <Logger name="FILE_APPENDER"
+ level="INFO" additivity="false">
+ <AppenderRef ref="fileAppender" />
+ </Logger>
+ <Root level="TRACE">
+ <AppenderRef ref="consoleAppender"/>
+ <AppenderRef ref="fileAppender"/>
+ </Root>
+ </Loggers>
+</Configuration> \ 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();
+ }
+
+}