summaryrefslogtreecommitdiff
path: root/src/main/java/com/mavlushechka/a1qa
diff options
context:
space:
mode:
authorMavlushechka <mavlushechka@gmail.com>2022-09-27 21:51:53 +0500
committerMavlushechka <mavlushechka@gmail.com>2022-09-27 21:51:53 +0500
commitc0469440d567349cdf20d6296b9949e05348d1f4 (patch)
tree733fc3d58647f12db7bd34a786edfcb37595f46d /src/main/java/com/mavlushechka/a1qa
parente7c380c64056a004a1d61f04df7afb2a1c1c3675 (diff)
parent441d7a21494f3cb9a16ae6095540326938af536b (diff)
Merge branch 'testing-framework' into task-3
Diffstat (limited to 'src/main/java/com/mavlushechka/a1qa')
-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
19 files changed, 602 insertions, 0 deletions
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());
+ }
+
+}