From 3b1af3333d687e354ab9fa0a475ae7ef74b740f9 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Tue, 20 Sep 2022 21:13:24 +0500 Subject: Add testing framework --- .../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 + 22 files changed, 618 insertions(+) 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 (limited to 'src/main') 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 -- cgit v1.2.3 From ebac988292f86e5c636b50034db7a9496c63bf0a Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Wed, 21 Sep 2022 01:26:59 +0500 Subject: Add capitalizeFirstLetter() method to StringUtils class --- src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java b/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java index 1739068..cbce72f 100644 --- a/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java +++ b/src/main/java/com/mavlushechka/a1qa/utils/StringUtils.java @@ -21,6 +21,10 @@ public class StringUtils { 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]+", "")); } -- cgit v1.2.3 From 7aa745ca6f86c307e871dd908b79bc296393d476 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Wed, 21 Sep 2022 01:29:12 +0500 Subject: Add clear() method to Field class --- src/main/java/com/mavlushechka/a1qa/elements/Field.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/elements/Field.java b/src/main/java/com/mavlushechka/a1qa/elements/Field.java index bf573db..99cd41d 100644 --- a/src/main/java/com/mavlushechka/a1qa/elements/Field.java +++ b/src/main/java/com/mavlushechka/a1qa/elements/Field.java @@ -22,6 +22,13 @@ public class Field extends BaseElement { field.sendKeys(keys); } + public void clear() { + WebElement field = find(); + + LoggerUtils.info("Clearing the \"" + getName() + "\" field."); + field.clear(); + } + public String getValue() { return find().getAttribute("value"); } -- cgit v1.2.3 From f7e46c34a5334b4dca7e21cfc1bb06de9d42fa25 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Thu, 22 Sep 2022 00:50:07 +0500 Subject: Set 'uniqueElement' and 'name' private fields protected in BaseForm class --- src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java b/src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java index d6a1577..3ac855a 100644 --- a/src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java +++ b/src/main/java/com/mavlushechka/a1qa/pages/BaseForm.java @@ -4,8 +4,8 @@ import com.mavlushechka.a1qa.elements.BaseElement; public abstract class BaseForm { - private final BaseElement uniqueElement; - private final String name; + protected final BaseElement uniqueElement; + protected final String name; public BaseForm(BaseElement uniqueElement, String name) { -- cgit v1.2.3 From a42f52ec68000f9aedad7196a9bf66d4bf3ed8d2 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Thu, 22 Sep 2022 00:50:45 +0500 Subject: Change webDriverWait.durationOfSeconds config value from 3 to 15 --- src/main/resources/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main') diff --git a/src/main/resources/config.json b/src/main/resources/config.json index 2ede7ad..54b5c23 100644 --- a/src/main/resources/config.json +++ b/src/main/resources/config.json @@ -6,7 +6,7 @@ "url": "https://userinyerface.com/" }, "webDriverWait": { - "durationOfSeconds": 3 + "durationOfSeconds": 15 }, "randomTextGenerator": { "lettersLowerBound": 97, -- cgit v1.2.3 From 4d09a3fe0610acdac4d65ba858e771afc6fc062c Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Thu, 22 Sep 2022 00:51:58 +0500 Subject: Add the isInvisible() method to the BaseElement class --- src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java index edcf1e7..8a7408d 100644 --- a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java +++ b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java @@ -1,10 +1,12 @@ package com.mavlushechka.a1qa.elements; 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 { @@ -42,7 +44,14 @@ public abstract class BaseElement { WebElement webElement = find(); LoggerUtils.info("Getting visibility of the \"" + name + "\" element."); - return webElement.isDisplayed(); + return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.visibilityOf(webElement)).isDisplayed(); + } + + public boolean isInvisible() { + WebElement webElement = find(); + + LoggerUtils.info("Getting invisibility of the \"" + name + "\" element."); + return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.invisibilityOf(webElement)); } public String getName() { -- cgit v1.2.3 From 28c1d2972e31012a8040d6b42a81ee21d988a476 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Thu, 22 Sep 2022 00:55:08 +0500 Subject: Add checking visibility of an element before finding the element in the BaseElement class --- src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java index 8a7408d..29666be 100644 --- a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java +++ b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java @@ -41,17 +41,13 @@ public abstract class BaseElement { } public boolean isVisible() { - WebElement webElement = find(); - LoggerUtils.info("Getting visibility of the \"" + name + "\" element."); - return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.visibilityOf(webElement)).isDisplayed(); + return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.visibilityOfElementLocated(locator)).isDisplayed(); } public boolean isInvisible() { - WebElement webElement = find(); - LoggerUtils.info("Getting invisibility of the \"" + name + "\" element."); - return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.invisibilityOf(webElement)); + return WebDriverWaitFactory.createWebDriverWait().until(ExpectedConditions.invisibilityOfElementLocated(locator)); } public String getName() { @@ -73,6 +69,7 @@ public abstract class BaseElement { } protected WebElement find() { + isVisible(); LoggerUtils.info("Finding the \"" + name + "\" element."); return WebDriverUtils.findElement(locator); } -- cgit v1.2.3 From d96a704db96135ecf49937f8f49e7a8f98cdedf8 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Thu, 22 Sep 2022 00:55:51 +0500 Subject: Add the scrollTo(WebElement) method to the ActionUtils class --- src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java b/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java index 88caf46..bd7b85b 100644 --- a/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java +++ b/src/main/java/com/mavlushechka/a1qa/driverUtils/ActionUtils.java @@ -18,4 +18,8 @@ public class ActionUtils { .perform(); } + public static void scrollTo(WebElement webElement) { + new Actions(WebDriverSingleton.getInstance()).moveToElement(webElement); + } + } -- cgit v1.2.3 From cb46f3d30cb8e85a18d91a8d86a3a9164e0c6af3 Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Thu, 22 Sep 2022 00:56:27 +0500 Subject: Add the scrollTo() protected method to the BaseElement class --- src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java index 29666be..6cb10e5 100644 --- a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java +++ b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java @@ -1,5 +1,6 @@ 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; @@ -74,4 +75,11 @@ public abstract class BaseElement { return WebDriverUtils.findElement(locator); } + protected void scrollTo() { + WebElement webElement = find(); + + LoggerUtils.info("Scrolling to the \"" + name + "\" element."); + ActionUtils.scrollTo(webElement); + } + } -- cgit v1.2.3 From 441d7a21494f3cb9a16ae6095540326938af536b Mon Sep 17 00:00:00 2001 From: Mavlushechka Date: Thu, 22 Sep 2022 00:57:18 +0500 Subject: Use the scrollTo() method in the click() method before clicking on the element in BaseElement class --- src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java | 1 + 1 file changed, 1 insertion(+) (limited to 'src/main') diff --git a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java index 6cb10e5..a2dc55a 100644 --- a/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java +++ b/src/main/java/com/mavlushechka/a1qa/elements/BaseElement.java @@ -23,6 +23,7 @@ public abstract class BaseElement { public void click() { WebElement webElement = find(); + scrollTo(); LoggerUtils.info("Clicking on the \"" + name + "\" element."); webElement.click(); } -- cgit v1.2.3