diff --git a/.gitignore b/.gitignore
index da632a1..0f73bb8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,34 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
+
+# Compiled class file
+.idea
+
+target
+
+javaselenium.iml
+
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
diff --git a/javaselenium.iml b/javaselenium.iml
index 3b8e9fd..c55f98a 100644
--- a/javaselenium.iml
+++ b/javaselenium.iml
@@ -1,16 +1,47 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -31,9 +62,15 @@
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index d25e454..0c6752c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,22 +7,103 @@
javaselenium
1.0-SNAPSHOT
+
+ 1.5.0
+
+
org.seleniumhq.selenium
selenium-java
3.141.59
-
- org.testng
- testng
- 6.14.3
- test
-
+
log4j
log4j
1.2.17
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+
+
+ org.jetbrains.kotlin
+ kotlin-test
+ ${kotlin.version}
+ test
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+
+
+ org.testng
+ testng
+ RELEASE
+ compile
+
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ test-compile
+ test-compile
+
+ test-compile
+
+
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ testCompile
+ test-compile
+
+ testCompile
+
+
+
+
+ 10
+ 10
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/common/BaseElement.java b/src/main/java/common/BaseElement.java
new file mode 100644
index 0000000..d8021d9
--- /dev/null
+++ b/src/main/java/common/BaseElement.java
@@ -0,0 +1,66 @@
+package common;
+
+import org.apache.log4j.Logger;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import java.util.List;
+import static common.QAMindsExpectedConditions.subElementClickable;
+import static common.QAMindsExpectedConditions.subElementVisibility;
+
+public class BaseElement {
+ private final WebDriver driver;
+ private final WebDriverWait wait;
+ private final int timeout;
+ private final WebElement rootElement;
+ protected final Logger logger = Logger.getLogger(BaseElement.class);
+
+ public BaseElement(WebDriver driver, int timeout) {
+ this(driver, timeout, null);
+ }
+
+ public BaseElement(WebDriver driver, int timeout, WebElement rootElement) {
+ this.driver = driver;
+ this.timeout = timeout;
+ this.wait = new WebDriverWait(this.driver, timeout);
+ this.rootElement = rootElement;
+ }
+
+ public WebElement waitUntilClickable(By locator) {
+ return this.wait.until(ExpectedConditions.elementToBeClickable(locator));
+ }
+
+ public WebElement waitUntilVisible(By locator) {
+ return this.wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
+ }
+
+ public List waitForElements(By locator) {
+ return this.wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator));
+ }
+
+ public WebElement getRootElement() {
+ return this.wait.until(ExpectedConditions.visibilityOf(this.rootElement));
+ }
+
+ public WebElement waitUntilSubElementClickable (final By locator) {
+ return this.wait.until(subElementClickable(this.rootElement, locator));
+ }
+
+ public WebElement waitUntilSubElementVisible (final By locator) {
+ return this.wait.until(subElementVisibility(this.rootElement, locator));
+ }
+
+ public WebDriver getDriver() {
+ return driver;
+ }
+
+ public WebDriverWait getWait() {
+ return wait;
+ }
+
+ public int getTimeout() {
+ return timeout;
+ }
+}
diff --git a/src/main/java/common/BasePage.java b/src/main/java/common/BasePage.java
new file mode 100644
index 0000000..839c9c1
--- /dev/null
+++ b/src/main/java/common/BasePage.java
@@ -0,0 +1,59 @@
+package common;
+
+import org.apache.log4j.Logger;
+import org.openqa.selenium.WebDriver;
+
+
+public class BasePage {
+ private WebDriver driver;
+ private String url;
+ private int timeout;
+ protected final Logger logger = Logger.getLogger(BasePage.class);
+
+ public BasePage() { }
+
+ public BasePage(WebDriver driver, int timeout) {
+ this(driver, timeout, null);
+ }
+
+ public BasePage(WebDriver driver, int timeout, String url) {
+ this.driver = driver;
+ this.url = url;
+ this.timeout =timeout;
+ }
+
+ public void open() {
+ if (this.url != null) {
+ logger.info("Open: " + this.url);
+ this.driver.get(url);
+ } else {
+ logger.warn("Cannot open empty url");
+ }
+ }
+
+ public void close() {
+ logger.info("Close: " + this.url);
+ this.driver.close();
+ }
+
+ public void waitUntilLoaded() {
+ logger.info("Wait until loaded...");
+ }
+
+ public WebDriver getDriver() {
+ return driver;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public int getTimeout() {
+ return timeout;
+ }
+
+ public void navigateToPreviousPage() {
+ driver.navigate().back();
+ }
+
+}
diff --git a/src/main/java/common/BaseTest.java b/src/main/java/common/BaseTest.java
new file mode 100644
index 0000000..bf9f423
--- /dev/null
+++ b/src/main/java/common/BaseTest.java
@@ -0,0 +1,41 @@
+package common;
+
+
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+
+public class BaseTest {
+ private WebDriver driver;
+ private String user;
+ private String password;
+ private WebDriverFactory.BrowserName browser;
+
+ @BeforeClass(alwaysRun = true)
+ //@Parameters({"user", "password", "browser", })
+ public void beforeClass() {
+ //this.user = user;
+ //this.password = password;
+ this.browser = WebDriverFactory.BrowserName.CHROME;
+ this.driver = WebDriverFactory.getDriver(this.browser);
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void afterClass() {
+ if (this.driver != null) {
+ this.driver.quit();
+ }
+ }
+
+ public WebDriver getDriver() {
+ return driver;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public WebDriverFactory.BrowserName getBrowser() {
+ return browser;
+ }
+}
diff --git a/src/main/java/common/BaseTestMultiThread.java b/src/main/java/common/BaseTestMultiThread.java
new file mode 100644
index 0000000..5c17765
--- /dev/null
+++ b/src/main/java/common/BaseTestMultiThread.java
@@ -0,0 +1,64 @@
+package common;
+
+import org.openqa.selenium.WebDriver;
+import org.testng.ITestResult;
+import org.testng.annotations.*;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class BaseTestMultiThread {
+ private Map drivers;
+ protected String user;
+ protected String password;
+ protected WebDriverFactory.BrowserName browser;
+
+ @BeforeClass
+ //@Parameters({"user", "password", "browser", })
+ public synchronized void beforeClass() {
+ this.user = user;
+ this.password = password;
+ this.browser = WebDriverFactory.BrowserName.CHROME;
+ this.drivers = new ConcurrentHashMap<>();
+ }
+
+ @BeforeMethod
+ public synchronized void beforeMethod(Method method, ITestResult testResult) {
+ WebDriver driver = WebDriverFactory.getDriver(this.browser);
+ this.drivers.put(method.getName(), driver);
+ }
+
+ @AfterMethod
+ public synchronized void afterMethod(Method method, ITestResult testResult) {
+ WebDriver driver = this.drivers.getOrDefault(method.getName(), null);
+ if (driver != null) {
+ this.drivers.remove(method.getName());
+ driver.quit();
+ }
+ }
+
+ public synchronized WebDriver getDriver() {
+ Method caller = this.getCallerTestMethod();
+ return this.drivers.getOrDefault(caller.getName(), null);
+ }
+
+ private synchronized Method getCallerTestMethod() {
+ try {
+ for (StackTraceElement stackElement: Thread.currentThread().getStackTrace()) {
+ String mName = stackElement.getMethodName();
+ Class cKls = Class.forName(stackElement.getClassName());
+ Method[] mts = cKls.getMethods();
+ Method method = Arrays.stream(mts).filter(m -> mName.equals(m.getName())).findFirst().orElse(null);
+ if (method != null && method.getAnnotation(Test.class) != null) {
+ return method;
+ }
+ }
+ throw new RuntimeException("MAKE METHOD PUBLIC!!! Get caller was executed outside a test method: %s");
+ } catch(Exception exception) {
+ throw new RuntimeException(String.format("Get caller was executed outside a test method: %s", exception));
+ }
+ }
+
+}
+
diff --git a/src/main/java/common/QAMindsExpectedConditions.java b/src/main/java/common/QAMindsExpectedConditions.java
new file mode 100644
index 0000000..c1296b3
--- /dev/null
+++ b/src/main/java/common/QAMindsExpectedConditions.java
@@ -0,0 +1,28 @@
+package common;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+
+public class QAMindsExpectedConditions {
+ public static ExpectedCondition subElementVisibility(final WebElement element, final By subLocator) {
+ return new ExpectedCondition() {
+ @Override
+ public WebElement apply(WebDriver driver) {
+ WebElement subElement = element.findElement(subLocator);
+ return subElement.isDisplayed() ? subElement : null;
+ }
+ };
+ }
+
+ public static ExpectedCondition subElementClickable(final WebElement element, final By subLocator) {
+ return new ExpectedCondition() {
+ @Override
+ public WebElement apply(WebDriver driver) {
+ WebElement subElement = element.findElement(subLocator);
+ return subElement.isDisplayed() && subElement.isEnabled() ? subElement : null;
+ }
+ };
+ }
+}
diff --git a/src/main/java/common/WebDriverFactory.java b/src/main/java/common/WebDriverFactory.java
index 647f61b..adf2c85 100644
--- a/src/main/java/common/WebDriverFactory.java
+++ b/src/main/java/common/WebDriverFactory.java
@@ -4,9 +4,12 @@
import org.openqa.selenium.InvalidArgumentException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
public class WebDriverFactory {
@@ -20,7 +23,16 @@ public enum BrowserName {
FIREFOX
}
+ private static Map driverMap = new HashMap();
+
+// private static void addDrivers() {
+// driverMap.put()
+//
+// }
+
+
public static WebDriver getDriver(BrowserName name) {
+
WebDriver driver = null;
if (name == BrowserName.CHROME) {
driver = getChromeDriver();
@@ -58,6 +70,16 @@ private static WebDriver getFirefoxDriver() {
}
private static WebDriver getChromeDriver() {
+ logger.debug("Get chrome driver..");
+ File driversDir = getDriversPath();
+ File chromeFile = new File(driversDir, "chromedriver.exe");
+ System.setProperty("webdriver.chrome.driver", chromeFile.getPath());
+ ChromeOptions options = new ChromeOptions();
+// options.addArguments();
+ return new ChromeDriver(options);
+ }
+
+ private static WebDriver getChromeDriverx() {
logger.debug("Get chrome driver..");
File driversDir = getDriversPath();
File chromeFile = new File(driversDir, "chromedriver.exe");
diff --git a/src/main/java/common/toyproblem/MyToyProblem.java b/src/main/java/common/toyproblem/MyToyProblem.java
new file mode 100644
index 0000000..60dfff1
--- /dev/null
+++ b/src/main/java/common/toyproblem/MyToyProblem.java
@@ -0,0 +1,34 @@
+package common.toyproblem;
+
+public class MyToyProblem {
+
+ public static void main(String[] args) {
+
+ String word = "aaabbbbbc";
+ String finalString = "";
+ char[] charList = word.toCharArray();
+// “ax3bx5c”
+
+ for (int k=0; k best )
+ best = count;
+ bestValue = A[i];
+ }
+ int result = best + K;
+
+ return result;
+ }
+}
diff --git a/src/main/java/common/toyproblem/devReady052321/ExcerciseTwo.kt b/src/main/java/common/toyproblem/devReady052321/ExcerciseTwo.kt
new file mode 100644
index 0000000..caf96cb
--- /dev/null
+++ b/src/main/java/common/toyproblem/devReady052321/ExcerciseTwo.kt
@@ -0,0 +1,43 @@
+package common.toyproblem.devReady052321
+
+fun main() {
+// val input = listOf(0, 5, 4, 4, 5, 12).toIntArray()
+// val input = listOf(4,2,2,4,2).toIntArray()
+// val input = listOf(1,2,3,2).toIntArray()
+ val input = listOf(4,4 ).toIntArray()
+
+
+ println(" Excer two")
+ val result = solution(input)
+ println(" $result ")
+}
+
+fun solution(A: IntArray): Int {
+ // write your code in Kotlin
+
+ var longestCounter = 0
+
+ for(k in 0 until A.size-1) {
+ val num1 = A[k]
+ val num2 = A[k+1]
+ var currentIndex = k
+ var counter = 0
+
+ while(currentIndex < A.size) {
+ if (A[currentIndex] == num1 || A[currentIndex] == num2) {
+ counter++
+ } else {
+ break
+ }
+ currentIndex++
+ }
+ if (counter > longestCounter) {
+ longestCounter = counter
+ }
+ }
+ return longestCounter
+}
+
+
+class ExcerciseTwo {
+}
\ No newline at end of file
diff --git a/src/main/java/common/toyproblem/devReady052321/Trial1.kt b/src/main/java/common/toyproblem/devReady052321/Trial1.kt
new file mode 100644
index 0000000..41df8ba
--- /dev/null
+++ b/src/main/java/common/toyproblem/devReady052321/Trial1.kt
@@ -0,0 +1,25 @@
+package common.toyproblem.devReady052321
+
+class Trial1 {
+
+ val listOne = listOf("a", "t")
+}
+
+fun main() {
+
+ val t1 = Trial1()
+ val list1 = t1.listOne
+
+ for (k in 0 until list1.size) {
+ println(" This is k: $k and ${list1[k]} ")
+ }
+
+ for (t in 0..5) {
+ println(" This is k: $t")
+ }
+
+ for (t in 0 until 5) {
+ println(" This is k: $t")
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/google/elements/GoogleElements.java b/src/main/java/google/elements/GoogleElements.java
new file mode 100644
index 0000000..86bb124
--- /dev/null
+++ b/src/main/java/google/elements/GoogleElements.java
@@ -0,0 +1,30 @@
+package google.elements;
+
+ import common.BaseElement;
+ import org.openqa.selenium.By;
+ import org.openqa.selenium.WebDriver;
+ import org.openqa.selenium.WebElement;
+
+public class GoogleElements extends BaseElement {
+ private final static By SEARCH_BOX = By.name("q");
+
+ private final static By SEARCH_BTN = By.xpath("//*[@name='btnK' and not(ancestor::div[@jsname])]");
+
+ private final static By LUCKY_BTN = By.xpath("//*[@name='btnI' and not(ancestor::div[@jsname])]");
+
+ public GoogleElements(WebDriver driver, int timeout) {
+ super(driver, timeout);
+ }
+
+ public WebElement getSearchBox() {
+ return this.waitUntilClickable(SEARCH_BOX);
+ }
+
+ public WebElement getSearchButton() {
+ return this.waitUntilClickable(SEARCH_BTN);
+ }
+
+ public WebElement getFeelingLuckyButton() {
+ return this.waitUntilClickable(LUCKY_BTN);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/google/pages/Google.java b/src/main/java/google/pages/Google.java
new file mode 100644
index 0000000..a4d34d2
--- /dev/null
+++ b/src/main/java/google/pages/Google.java
@@ -0,0 +1,33 @@
+package google.pages;
+
+ import common.BasePage;
+ import google.elements.GoogleElements;
+ import org.openqa.selenium.Keys;
+ import org.openqa.selenium.WebDriver;
+
+public class Google extends BasePage {
+ public GoogleElements elements;
+
+ public Google(WebDriver driver, int timeout, String url) {
+ super(driver, timeout, url);
+ this.elements = new GoogleElements(driver, timeout);
+ }
+
+ public void waitUntilLoaded() {
+ this.elements.getSearchBox();
+ this.elements.getSearchButton();
+ this.elements.getFeelingLuckyButton();
+ }
+
+ public void search(String topic) {
+ this.elements.getSearchBox().sendKeys(topic);
+ this.elements.getSearchBox().sendKeys(Keys.TAB);
+ this.elements.getSearchButton().click();
+ }
+
+ public void searchFeelingLucky(String topic) {
+ this.elements.getFeelingLuckyButton().sendKeys(topic);
+ this.elements.getFeelingLuckyButton().sendKeys(Keys.TAB);
+ this.elements.getFeelingLuckyButton().click();
+ }
+}
diff --git a/src/main/java/saucelabs/components/InventoryItem.java b/src/main/java/saucelabs/components/InventoryItem.java
new file mode 100644
index 0000000..8af63a1
--- /dev/null
+++ b/src/main/java/saucelabs/components/InventoryItem.java
@@ -0,0 +1,58 @@
+package saucelabs.components;
+
+import common.BasePage;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import saucelabs.elements.InventoryItemElements;
+import saucelabs.pages.InventoryItemPage;
+
+public class InventoryItem extends BasePage {
+ private static String ADD_LABEL = "add to cart";
+
+ private static String REMOVE_LABEL = "remove";
+ public InventoryItemElements elements;
+
+ public InventoryItem(WebDriver driver, int timeout, WebElement rootElement) {
+ super(driver, timeout);
+ elements = new InventoryItemElements(driver, timeout, rootElement);
+ }
+
+ public void addToCart() {
+ if (!this.isInCart()) {
+ this.elements.getButton().click();
+ }
+ }
+
+ public void removeFromCart() {
+ if (this.isInCart()) {
+ this.elements.getButton().click();
+ }
+ }
+
+ public Boolean isInCart() {
+ return (this.elements.getButton().getText().toLowerCase().equals(REMOVE_LABEL));
+
+ }
+
+ public String getTitle() {
+ return this.elements.getTitle().getText();
+ }
+
+
+ public String getDescription() {
+ return this.elements.getDescription().getText();
+ }
+
+ public String getPrice() {
+ return this.elements.getPrice().getText();
+ }
+
+ public WebElement getPicture() {
+ return this.elements.getPicture();
+ }
+
+ public InventoryItemPage clickOnPicture() {
+ getPicture().click();
+ return new InventoryItemPage(this.getDriver(), this.getTimeout());
+ }
+}
diff --git a/src/main/java/saucelabs/components/InventoryList.java b/src/main/java/saucelabs/components/InventoryList.java
new file mode 100644
index 0000000..5a3909d
--- /dev/null
+++ b/src/main/java/saucelabs/components/InventoryList.java
@@ -0,0 +1,33 @@
+package saucelabs.components;
+
+import common.BasePage;
+import org.openqa.selenium.WebDriver;
+import saucelabs.elements.InventoryListElements;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class InventoryList extends BasePage implements Iterable {
+ private List items;
+ private InventoryListElements elements;
+
+ public InventoryList(WebDriver driver, int timeout) {
+ super(driver, timeout);
+ elements = new InventoryListElements(driver, timeout);
+ items = new ArrayList<>();
+ }
+
+ @Override
+ public Iterator iterator() {
+ this.refreshResult();
+ return this.items.iterator();
+ }
+
+ private void refreshResult() {
+ this.items.clear();
+ for(var element: this.elements.getItems()) {
+ this.items.add(new InventoryItem(this.getDriver(), this.getTimeout(), element));
+ }
+ }
+}
diff --git a/src/main/java/saucelabs/elements/IndividualInventoryItemElements.kt b/src/main/java/saucelabs/elements/IndividualInventoryItemElements.kt
new file mode 100644
index 0000000..2a02571
--- /dev/null
+++ b/src/main/java/saucelabs/elements/IndividualInventoryItemElements.kt
@@ -0,0 +1,30 @@
+package saucelabs.elements
+
+import common.BaseElement
+import org.openqa.selenium.By
+import org.openqa.selenium.WebDriver
+import org.openqa.selenium.WebElement
+
+class IndividualInventoryItemElements(
+ driver: WebDriver?,
+ timeout: Int
+): BaseElement(driver, timeout) {
+
+ private val DETAILS_NAME = By.xpath(".//*[@class='inventory_details_name large_size']")
+
+ private val DETAILS_DESCRIPTION = By.xpath(".//*[@class='inventory_details_desc large_size']")
+
+ private val DETAILS_PRICE = By.xpath(".//*[@class='inventory_details_price']")
+
+ fun getItemDetailsName(): WebElement? {
+ return this.waitUntilClickable(DETAILS_NAME)
+ }
+
+ fun getItemDetailsDescription(): WebElement? {
+ return this.waitUntilClickable(DETAILS_DESCRIPTION)
+ }
+
+ fun getItemDetailsPrice(): WebElement? {
+ return this.waitUntilClickable(DETAILS_PRICE)
+ }
+}
diff --git a/src/main/java/saucelabs/elements/InventoryItemElements.java b/src/main/java/saucelabs/elements/InventoryItemElements.java
new file mode 100644
index 0000000..a0c20fd
--- /dev/null
+++ b/src/main/java/saucelabs/elements/InventoryItemElements.java
@@ -0,0 +1,44 @@
+package saucelabs.elements;
+
+import common.BaseElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+public class InventoryItemElements extends BaseElement {
+
+ private final static By TITLE= By.xpath(".//*[@class='inventory_item_name']");
+
+ private final static By DESCRIPTION= By.xpath(".//*[@class='inventory_item_desc']");
+
+ private final static By PRICE= By.xpath(".//*[@class='inventory_item_price']");
+
+ private final static By BUTTON = By.xpath(".//*[contains(@class, 'btn_inventory')]");
+
+ private final static By PICTURE = By.xpath(".//img[contains(@class, 'inventory_item_img')]");
+
+
+ public InventoryItemElements(WebDriver driver, int timeout, WebElement rootElement) {
+ super(driver, timeout, rootElement);
+ }
+
+ public WebElement getTitle() {
+ return this.waitUntilSubElementVisible(TITLE);
+ }
+
+ public WebElement getDescription() {
+ return this.waitUntilSubElementVisible(DESCRIPTION);
+ }
+
+ public WebElement getPrice() {
+ return this.waitUntilSubElementVisible(PRICE);
+ }
+
+ public WebElement getButton() {
+ return this.waitUntilSubElementClickable(BUTTON);
+ }
+
+ public WebElement getPicture() {
+ return this.waitUntilSubElementClickable(PICTURE);
+ }
+}
diff --git a/src/main/java/saucelabs/elements/InventoryListElements.java b/src/main/java/saucelabs/elements/InventoryListElements.java
new file mode 100644
index 0000000..3f54730
--- /dev/null
+++ b/src/main/java/saucelabs/elements/InventoryListElements.java
@@ -0,0 +1,20 @@
+package saucelabs.elements;
+
+import common.BaseElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+
+public class InventoryListElements extends BaseElement {
+ private final static By ITEMS = By.className("inventory_item");
+
+ public InventoryListElements(WebDriver driver, int timeout) {
+ super(driver, timeout);
+ }
+
+ public List getItems() {
+ return this.waitForElements(ITEMS);
+ }
+}
diff --git a/src/main/java/saucelabs/elements/LoginElements.java b/src/main/java/saucelabs/elements/LoginElements.java
new file mode 100644
index 0000000..b254ac4
--- /dev/null
+++ b/src/main/java/saucelabs/elements/LoginElements.java
@@ -0,0 +1,43 @@
+package saucelabs.elements;
+
+import common.BaseElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+
+public class LoginElements extends BaseElement {
+ private final static By USER_NAME = By.id("user-name");
+
+ private final static By PASSWORD = By.id("password");
+
+ private final static By LOGIN = By.id("login-button");
+
+ private final static By ERROR = By.xpath("//*[@data-test='error']");
+
+ public LoginElements(WebDriver driver, int timeout) {
+ super(driver, timeout);
+ }
+
+ public WebElement getUserName() {
+ return this.waitUntilClickable(USER_NAME);
+ }
+
+ public WebElement getPassword() {
+ return this.waitUntilClickable(PASSWORD);
+ }
+
+ public WebElement getLogin() {
+ return this.waitUntilClickable(LOGIN);
+ }
+
+ public WebElement getErrorMsg() {
+ List elements = this.getDriver().findElements(ERROR);
+ if (!elements.isEmpty()) {
+ return elements.get(0);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/saucelabs/elements/ProductElements.java b/src/main/java/saucelabs/elements/ProductElements.java
new file mode 100644
index 0000000..d7caabf
--- /dev/null
+++ b/src/main/java/saucelabs/elements/ProductElements.java
@@ -0,0 +1,25 @@
+package saucelabs.elements;
+
+import common.BaseElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+public class ProductElements extends BaseElement {
+
+ private final static By SELECT = By.xpath("//*[@data-test='product_sort_container']");
+
+ private final static By TITLE = By.className("title");
+
+ public ProductElements(WebDriver driver, int timeout) {
+ super(driver, timeout);
+ }
+
+ public WebElement getSelect() {
+ return this.waitUntilClickable(SELECT);
+ }
+
+ public WebElement getTitle() {
+ return this.waitUntilVisible(TITLE);
+ }
+}
diff --git a/src/main/java/saucelabs/elements/ProductElementsKotlin.kt b/src/main/java/saucelabs/elements/ProductElementsKotlin.kt
new file mode 100644
index 0000000..1564656
--- /dev/null
+++ b/src/main/java/saucelabs/elements/ProductElementsKotlin.kt
@@ -0,0 +1,30 @@
+package saucelabs.elements
+
+import common.BaseElement
+import org.openqa.selenium.By
+import org.openqa.selenium.WebDriver
+import org.openqa.selenium.WebElement
+
+class ProductElementsKotlin(driver: WebDriver, timeout: Int): BaseElement(driver, timeout) {
+
+ private val USER_NAME_TEXT = By.id("user-name")
+
+ private val PASSWORD_TEXT = By.id("password")
+
+ private val SORTING_OPTIONS = By.xpath("//*[@class='product_sort_container']/*")
+
+ private val PRODUCT_TITLE = By.xpath("//*[@class='title']")
+
+
+ fun getProductTitle(): WebElement {
+ return this.waitUntilVisible(PRODUCT_TITLE)
+ }
+
+ fun getSortingOptions(): List {
+ return this.waitForElements(SORTING_OPTIONS)
+ }
+
+ fun sortAtoZ(): WebElement? {
+ return this.waitForElements(SORTING_OPTIONS).firstOrNull()
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/saucelabs/elements/SaucelabsElements.java b/src/main/java/saucelabs/elements/SaucelabsElements.java
new file mode 100644
index 0000000..e6c346f
--- /dev/null
+++ b/src/main/java/saucelabs/elements/SaucelabsElements.java
@@ -0,0 +1,43 @@
+package saucelabs.elements;
+
+import common.BaseElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+
+public class SaucelabsElements extends BaseElement {
+ private final static By USER_NAME_TEXT = By.id("user-name");
+
+ private final static By PASSWORD_TEXT = By.id("password");
+
+ private final static By LOGIN_BTN = By.id("login-button");
+
+ private final static By ERROR_MESSAGE = By.xpath("//*[@data-test='error']");
+
+ public SaucelabsElements(WebDriver driver, int timeout) {
+ super(driver, timeout);
+ }
+
+ public WebElement getUserNameEditText() {
+ return this.waitUntilClickable(USER_NAME_TEXT);
+ }
+
+ public WebElement getPasswordEditText() {
+ return this.waitUntilClickable(PASSWORD_TEXT);
+ }
+
+ public WebElement getLoginButton() {
+ return this.waitUntilClickable(LOGIN_BTN);
+ }
+
+ public WebElement getErrorMessage() {
+ List elements = this.getDriver().findElements(ERROR_MESSAGE);
+ if (elements.size() > 0) {
+ return elements.get(0);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/saucelabs/pages/InventoryItemPage.kt b/src/main/java/saucelabs/pages/InventoryItemPage.kt
new file mode 100644
index 0000000..b08fd50
--- /dev/null
+++ b/src/main/java/saucelabs/pages/InventoryItemPage.kt
@@ -0,0 +1,32 @@
+package saucelabs.pages
+
+import common.BasePage
+import org.openqa.selenium.WebDriver
+import saucelabs.elements.IndividualInventoryItemElements
+
+class InventoryItemPage(driver: WebDriver, timeout: Int): BasePage(driver, timeout) {
+
+ val elements = IndividualInventoryItemElements(driver, timeout)
+
+ override fun waitUntilLoaded() {
+ elements.getItemDetailsName()
+ elements.getItemDetailsDescription()
+ elements.getItemDetailsPrice()
+ }
+
+ fun getItemDetailsName(): String? {
+ return elements.getItemDetailsName()?.text
+ }
+
+ fun getItemDetailsDescription(): String? {
+ return elements.getItemDetailsDescription()?.text
+ }
+
+ fun getItemDetailsPrice(): String? {
+ return elements.getItemDetailsPrice()?.text
+ }
+
+ fun navigatePreviousPage() {
+ super.navigateToPreviousPage()
+ }
+}
diff --git a/src/main/java/saucelabs/pages/Login.java b/src/main/java/saucelabs/pages/Login.java
new file mode 100644
index 0000000..f19484f
--- /dev/null
+++ b/src/main/java/saucelabs/pages/Login.java
@@ -0,0 +1,32 @@
+package saucelabs.pages;
+
+import common.BasePage;
+import org.openqa.selenium.WebDriver;
+import saucelabs.elements.LoginElements;
+
+public class Login extends BasePage {
+ public LoginElements elements;
+
+ public Login(WebDriver driver, int timeout, String url) {
+ super(driver, timeout, url);
+ elements = new LoginElements(driver, timeout);
+ }
+
+ @Override
+ public void waitUntilLoaded() {
+ this.elements.getUserName();
+ this.elements.getPassword();
+ this.elements.getLogin();
+ }
+
+ public Product login(String user, String password) {
+ this.elements.getUserName().sendKeys(user);
+ this.elements.getPassword().sendKeys(password);
+ this.elements.getLogin().click();
+ return new Product(this.getDriver(), this.getTimeout());
+ }
+
+ public boolean isValidUser() {
+ return (this.elements.getErrorMsg() == null);
+ }
+}
diff --git a/src/main/java/saucelabs/pages/Product.java b/src/main/java/saucelabs/pages/Product.java
new file mode 100644
index 0000000..8cb8961
--- /dev/null
+++ b/src/main/java/saucelabs/pages/Product.java
@@ -0,0 +1,36 @@
+package saucelabs.pages;
+
+import common.BasePage;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.Select;
+import saucelabs.components.InventoryList;
+import saucelabs.elements.ProductElements;
+
+public class Product extends BasePage {
+ public ProductElements elements;
+ public InventoryList inventoryList;
+
+ public enum SortOption {
+ AZ,
+ ZA,
+ LOHI,
+ HILO,
+ }
+
+ public Product(WebDriver driver, int timeout) {
+ super(driver, timeout);
+ elements = new ProductElements(driver, timeout);
+ inventoryList = new InventoryList(driver, timeout);
+ }
+
+ @Override
+ public void waitUntilLoaded() {
+ this.elements.getSelect();
+ this.elements.getTitle();
+ }
+
+ public void sort(SortOption option) {
+ Select select = new Select(this.elements.getSelect());
+ select.selectByValue(option.name().toLowerCase());
+ }
+}
diff --git a/src/main/java/saucelabs/pages/Saucelabs.java b/src/main/java/saucelabs/pages/Saucelabs.java
new file mode 100644
index 0000000..cdc20b9
--- /dev/null
+++ b/src/main/java/saucelabs/pages/Saucelabs.java
@@ -0,0 +1,34 @@
+package saucelabs.pages;
+
+import common.BasePage;
+import google.elements.GoogleElements;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+
+public class Saucelabs extends BasePage {
+
+ public GoogleElements elements;
+
+ public Saucelabs(WebDriver driver, int timeout, String url) {
+ super(driver, timeout, url);
+ this.elements = new GoogleElements(driver, timeout);
+ }
+
+ public void waitUntilLoaded() {
+ this.elements.getSearchBox();
+ this.elements.getSearchButton();
+ this.elements.getFeelingLuckyButton();
+ }
+
+ public void search(String topic) {
+ this.elements.getSearchBox().sendKeys(topic);
+ this.elements.getSearchBox().sendKeys(Keys.TAB);
+ this.elements.getSearchButton().click();
+ }
+
+ public void searchFeelingLucky(String topic) {
+ this.elements.getFeelingLuckyButton().sendKeys(topic);
+ this.elements.getFeelingLuckyButton().sendKeys(Keys.TAB);
+ this.elements.getFeelingLuckyButton().click();
+ }
+}
diff --git a/src/main/java/saucelabs/pages/SaucelabsKotlin.kt b/src/main/java/saucelabs/pages/SaucelabsKotlin.kt
new file mode 100644
index 0000000..858a446
--- /dev/null
+++ b/src/main/java/saucelabs/pages/SaucelabsKotlin.kt
@@ -0,0 +1,49 @@
+package saucelabs.pages
+
+import common.BasePage
+import google.elements.GoogleElements
+import org.openqa.selenium.Keys
+import org.openqa.selenium.WebDriver
+import saucelabs.elements.SaucelabsElements
+import java.lang.Exception
+
+class SaucelabsKotlin(driver: WebDriver?, timeout: Int, url: String?) : BasePage(driver, timeout, url) {
+
+ var elements: SaucelabsElements = SaucelabsElements(driver, timeout)
+
+
+ override fun waitUntilLoaded() {
+ elements.userNameEditText
+ elements.passwordEditText
+ elements.loginButton
+ }
+
+ fun login(username: String, password: String) {
+ enterUsername(username)
+ enterPassword(password)
+ clickLoginButton()
+ }
+
+ fun loginAndGoToProducts(username: String, password: String): Product {
+ enterUsername(username)
+ enterPassword(password)
+ clickLoginButton()
+ return Product(driver, 5)
+ }
+
+ fun enterUsername(username: String) {
+ elements.userNameEditText.sendKeys(username)
+ }
+
+ fun enterPassword(password: String) {
+ elements.passwordEditText.sendKeys(password)
+ }
+
+ fun clickLoginButton() {
+ elements.loginButton.click()
+ }
+
+ fun isUserValid(): Boolean {
+ return elements.errorMessage?.let { false } ?: true
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/module1/lessons/lesson051021/HandsOnTwo.java b/src/test/java/module1/lessons/lesson051021/HandsOnTwo.java
new file mode 100644
index 0000000..5326817
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson051021/HandsOnTwo.java
@@ -0,0 +1,97 @@
+package module1.lessons.lesson051021;
+
+import common.WebDriverFactory;
+import module1.selenium_basic.SeleniumExercise1;
+import org.apache.log4j.Logger;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+public class HandsOnTwo {
+
+ private final static Logger logger = Logger.getLogger(SeleniumExercise1.class);
+
+
+ public static void main(String[] args) throws InterruptedException {
+
+// handsOnTwoExcercise();
+// handsOnThreeExcercise();
+// handsOnFourExcercise();
+ handsOnSixExcercise();
+ }
+
+ private static void handsOnTwoExcercise() {
+ final String GOOGLE_URL = "https://www.google.com";
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+ driver.get(GOOGLE_URL);
+
+ driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
+ String currentUrl = driver.getCurrentUrl();
+ assert currentUrl.equals(GOOGLE_URL);
+ WebElement searchElement = driver.findElement(By.name("q"));
+ searchElement.sendKeys("Appium");
+ searchElement.sendKeys(Keys.ENTER);
+
+ driver.close();
+ }
+
+ private static void handsOnThreeExcercise() {
+ final String FACEBOOK_URL = "https://www.facebook.com";
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+ driver.get(FACEBOOK_URL);
+
+ WebElement emailElement = driver.findElement(By.id("email"));
+ emailElement.sendKeys("Appium@hotmail.com");
+
+ WebElement passwordElement = driver.findElement(By.id("pass"));
+ passwordElement.sendKeys("12345");
+
+ WebElement loginButtonElement = driver.findElement(By.name("login"));
+ loginButtonElement.click();
+ driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
+// driver.close();
+ }
+
+ private static void handsOnFourExcercise() throws InterruptedException {
+ final String AMAZON_URL = "https://www.amazon.com.mx";
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+ driver.get(AMAZON_URL);
+ driver.manage().timeouts().pageLoadTimeout(120, TimeUnit.SECONDS);
+
+
+ WebElement twoTabSearchTextBoxElement = driver.findElement(By.id("twotabsearchtextbox"));
+ twoTabSearchTextBoxElement.sendKeys("Selenium");
+ twoTabSearchTextBoxElement.sendKeys(Keys.ENTER);
+
+ Thread.sleep(10000);
+// driver.close();
+ }
+
+ private static void handsOnSixExcercise() throws InterruptedException {
+ final String WIKIPEDIA_URL = "https://www.wikipedia.org";
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.CHROME);
+ driver.get(WIKIPEDIA_URL);
+
+ final String searchText = "selenium";
+
+ WebElement searchElement = driver.findElement(By.id("searchInput"));
+ searchElement.sendKeys(searchText);
+ searchElement.sendKeys(Keys.ENTER);
+ List pElements = driver.findElements(By.tagName("p"));
+
+ List pMatches = pElements.stream().filter(t -> t.getText().contains(searchText)).collect(Collectors.toList());
+ logger.debug(" search topic: " + searchText + " pMatches: " + pMatches.size());
+
+ List aElements = driver.findElements(By.tagName("a"));
+ List aMatches = aElements.stream().filter(t -> t.getText().contains(searchText)).collect(Collectors.toList());
+ aMatches.stream().limit(5).forEach(it ->
+ driver.navigate().to(it.getAttribute("href"))
+ );
+
+ }
+}
diff --git a/src/test/java/module1/lessons/lesson051521/Excercises051521.java b/src/test/java/module1/lessons/lesson051521/Excercises051521.java
new file mode 100644
index 0000000..ba22442
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson051521/Excercises051521.java
@@ -0,0 +1,4 @@
+package module1.lessons.lesson051521;
+
+public class Excercises051521 {
+}
diff --git a/src/test/java/module1/lessons/lesson051521/MyExcercise.kt b/src/test/java/module1/lessons/lesson051521/MyExcercise.kt
new file mode 100644
index 0000000..4b66979
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson051521/MyExcercise.kt
@@ -0,0 +1,71 @@
+package module1.lessons.lesson051521
+
+import common.WebDriverFactory
+import org.openqa.selenium.By
+import org.openqa.selenium.WebElement
+import java.lang.Exception
+import java.util.concurrent.TimeUnit
+
+
+fun main() {
+// excerciseTwo()
+// excerciseThree()
+ excerciseFour()
+}
+
+fun excerciseTwo() {
+ val GOOGLE_URL = "https://www.google.com.mx"
+ val driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX)
+ driver.get(GOOGLE_URL)
+ driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS)
+
+
+ try {
+ val twoTabSearchTextBoxElement = driver.findElement(By.id("JustAnInvalidID"))
+ } catch (e: Exception) {
+ e
+ }
+ driver.close()
+}
+
+fun excerciseThree() {
+ val NASA_URL = "https://www.nasa.gov"
+ val driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX)
+ driver.get(NASA_URL)
+
+ val missionLink = driver.findElement(By.linkText("Missions"))
+ println(missionLink.getAttribute("href"))
+
+ val nasaTv = driver.findElement(By.linkText("NASA TV"))
+ println(nasaTv.getAttribute("href"))
+
+ val inputElements = driver.findElements(By.tagName("input"))
+ inputElements.forEach { element ->
+ println(element.getAttribute("value"))
+ }
+ driver.close()
+}
+
+fun excerciseFour() {
+ val WIKIPEDIA_URL = "https://es.wikipedia.org/wiki/Portada"
+ val driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.CHROME)
+ driver.get(WIKIPEDIA_URL)
+
+ val portadaLink = driver.findElement(By.linkText("Portada"))
+ println(portadaLink.getAttribute("href"))
+
+ val paginaLinks: List = driver.findElements(By.linkText("Pagina"))
+ paginaLinks.forEach { element ->
+ println(" ${element.text} ${element.getAttribute("href")} ")
+ }
+
+// val buttonElements = driver.findElements(By.tagName("button"))
+ driver.findElements(By.tagName("button")).forEach {
+ println(it.text)
+ }
+
+// Thread.sleep(5000)
+ driver.close()
+}
+
+
diff --git a/src/test/java/module1/lessons/lesson051721/Excercises051721.java b/src/test/java/module1/lessons/lesson051721/Excercises051721.java
new file mode 100644
index 0000000..dd2c450
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson051721/Excercises051721.java
@@ -0,0 +1,78 @@
+package module1.lessons.lesson051721;
+
+import common.WebDriverFactory;
+import module1.selenium_basic.SeleniumExercise1;
+import org.apache.log4j.Logger;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class Excercises051721 {
+
+ private final static Logger logger = Logger.getLogger(SeleniumExercise1.class);
+
+
+ public static void main(String[] args) throws InterruptedException {
+
+// handsOnTwoExcercise();
+// handsOnThreeExcercise();
+// handsOnFourExcercise();
+ tikTokExcercise();
+ }
+
+ private static void handsOnTwoExcercise() {
+ final String OLYMPICS_URL = "https://olympics.com/tokyo-2020/es/";
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+ driver.get(OLYMPICS_URL);
+
+// driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
+ String currentUrl = driver.getCurrentUrl();
+ assert currentUrl.equals(OLYMPICS_URL);
+ WebElement tokyoLogo = driver.findElement(By.xpath("//a[contains(@class, '-emblem']"));
+
+ WebElement registro =
+ driver.findElement(By.xpath("//a[contains(@class, 'tk-secondary-nav__link']/span[contains(@class,'secondary-nav' )]"));
+
+ WebElement playNowButton =
+ driver.findElement(By.xpath("//div[contains(@class, 'fanzonebanner']/a"));
+
+ driver.close();
+ }
+
+ private static void tikTokExcercise() throws InterruptedException {
+ final String OLYMPICS_URL = "https://www.tiktok.com/?lang=es";
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+ driver.get(OLYMPICS_URL);
+
+ String currentUrl = driver.getCurrentUrl();
+ assert currentUrl.equals(OLYMPICS_URL);
+
+ WebElement searchBox = driver.findElement(By.name("q"));
+ searchBox.sendKeys("selenium");
+ searchBox.sendKeys(Keys.ENTER);
+
+ Thread.sleep(3000);
+ List tiktokList = driver.findElements(By.xpath("//a[contains(@class, 'result-item')]"));
+
+ for (WebElement tiktok: tiktokList) {
+
+ WebElement title = tiktok.findElement(By.xpath(".//*[contains(@class, 'title'))]"));
+ System.out.println(" Title: " + title.getText());
+ WebElement subtitle = tiktok.findElement(By.xpath(".//*[contains(@class, 'sub-title'))]/h2"));
+ System.out.println(" Subtitle: " + title.getText());
+
+ WebElement description = tiktok.findElement(By.xpath(".//*[contains(@class, 'desc'))]"));
+ System.out.println(" Description: " + description.getText());
+
+
+ }
+
+
+
+ driver.close();
+ }
+}
diff --git a/src/test/java/module1/lessons/lesson051921/Excercise051921.java b/src/test/java/module1/lessons/lesson051921/Excercise051921.java
new file mode 100644
index 0000000..4f7d354
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson051921/Excercise051921.java
@@ -0,0 +1,58 @@
+package module1.lessons.lesson051921;
+
+import common.WebDriverFactory;
+import module1.selenium_basic.SeleniumExercise1;
+import org.apache.log4j.Logger;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+
+public class Excercise051921 {
+
+ private final static Logger logger = Logger.getLogger(SeleniumExercise1.class);
+
+
+ public static void main(String[] args) throws InterruptedException {
+
+ amazonNintendoSearch();
+ }
+
+ private static void amazonNintendoSearch() throws InterruptedException {
+ final String AMAZON_URL = "https://www.amazon.com.mx";
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+ driver.get(AMAZON_URL);
+
+ String currentUrl = driver.getCurrentUrl();
+ assert currentUrl.equals(AMAZON_URL);
+
+ WebElement searchBox = driver.findElement(By.id("twotabsearchtextbox"));
+ searchBox.sendKeys("Nintendo Switch");
+
+ WebElement searchButton = driver.findElement(By.id("nav-search-submit-button"));
+ searchButton.click();
+
+
+ Thread.sleep(3000);
+ List brandList = driver.findElements(By.xpath("//ul[contains(@class, 'a-unordered-list a-nostyle a-vertical a-spacing-medium')]/li"));
+
+ for (WebElement tiktok: brandList) {
+
+ WebElement title = tiktok.findElement(By.xpath(".//*[contains(@class, 'title'))]"));
+ System.out.println(" Title: " + title.getText());
+ WebElement subtitle = tiktok.findElement(By.xpath(".//*[contains(@class, 'sub-title'))]/h2"));
+ System.out.println(" Subtitle: " + title.getText());
+
+ WebElement description = tiktok.findElement(By.xpath(".//*[contains(@class, 'desc'))]"));
+ System.out.println(" Description: " + description.getText());
+
+
+ }
+
+
+
+ driver.close();
+ }
+}
diff --git a/src/test/java/module1/lessons/lesson052221/Testing.java b/src/test/java/module1/lessons/lesson052221/Testing.java
new file mode 100644
index 0000000..434cfef
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson052221/Testing.java
@@ -0,0 +1,31 @@
+package module1.lessons.lesson052221;
+
+import common.BaseTest;
+import common.WebDriverFactory;
+import org.openqa.selenium.WebDriver;
+import org.testng.Assert;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+import org.testng.annotations.Test;
+
+
+public class Testing extends BaseTest {
+
+ final String AMAZON_URL = "https://www.amazon.com.mx/";
+// WebDriver driver;
+//
+// @BeforeSuite
+// private void setup() {
+// driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+// }
+
+ @Test ( groups = {"sanity"})
+ private void test2() {
+// this.getDriver().get(AMAZON_URL);
+// String currentUrl = this.getDriver().getCurrentUrl();
+// Assert.assertEquals(currentUrl, AMAZON_URL, "Invalid url");
+// this.getDriver().close();
+ Assert.assertTrue(true);
+ }
+}
diff --git a/src/test/java/module1/lessons/lesson052621/Testing.java b/src/test/java/module1/lessons/lesson052621/Testing.java
new file mode 100644
index 0000000..57436da
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson052621/Testing.java
@@ -0,0 +1,35 @@
+package module1.lessons.lesson052621;
+
+import common.BaseTestMultiThread;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class Testing extends BaseTestMultiThread {
+
+ final String AMAZON_URL = "https://www.amazon.com.mx/";
+// WebDriver driver;
+//
+// @BeforeSuite
+// private void setup() {
+// driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+// }
+
+// @Test
+ @Test(groups = {"sanity"})
+ public void testPage() {
+ this.getDriver().get(AMAZON_URL);
+ String currentUrl = this.getDriver().getCurrentUrl();
+ Assert.assertEquals(currentUrl, AMAZON_URL, "Invalid url");
+ Assert.assertTrue(true);
+
+ this.getDriver().close();
+
+
+ }
+
+ public Object[][] valid() {
+ return new Object [] [] {
+ { "standard_user", "secret_sauce"}
+ };
+ }
+}
diff --git a/src/test/java/module1/lessons/lesson052921/SaucelabsPageTest.kt b/src/test/java/module1/lessons/lesson052921/SaucelabsPageTest.kt
new file mode 100644
index 0000000..3e2e6cd
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson052921/SaucelabsPageTest.kt
@@ -0,0 +1,72 @@
+package module1.lessons.lesson052921
+
+import common.BaseTestMultiThread
+import org.testng.Assert
+import org.testng.annotations.DataProvider
+import org.testng.annotations.Test
+import saucelabs.pages.SaucelabsKotlin
+
+class SaucelabsPageTest: BaseTestMultiThread(){
+
+ lateinit var saucelabsPage: SaucelabsKotlin
+
+ @DataProvider(name = VALID_USER_PROVIDER)
+ fun validUserDataProvider(): Array> {
+ return arrayOf(
+ arrayOf(STANDARD_USER, PASSWORD),
+ arrayOf(PROBLEM_USER, PASSWORD)
+ )
+ }
+
+ @DataProvider(name = INVALID_USER_PROVIDER)
+ fun invalidUserDataProvider(): Array> {
+ return arrayOf(
+ arrayOf(STANDARD_USER, WRONG_PASSWORD)
+ )
+ }
+
+ @Test(groups = ["sanity"], dataProvider = VALID_USER_PROVIDER)
+ fun `when logging in with correct credentials should be able to login`(username: String, password: String) {
+ val saucelabsPage = SaucelabsKotlin(this.driver, 10, SAUCELABS_URL)
+ saucelabsPage.open()
+ saucelabsPage.waitUntilLoaded()
+ saucelabsPage.login(username, password)
+ Assert.assertTrue(saucelabsPage.isUserValid(),"User is invalid")
+ Thread.sleep(1000)
+ saucelabsPage.close()
+ }
+
+ @Test(groups = ["sanity"], dataProvider = INVALID_USER_PROVIDER)
+ fun `when logging in with incorrect credentials should display popup`(username: String, password: String) {
+ val saucelabsPage = SaucelabsKotlin(this.driver, 10, SAUCELABS_URL)
+ saucelabsPage.open()
+ saucelabsPage.waitUntilLoaded()
+ saucelabsPage.login(username, password)
+ Assert.assertFalse(saucelabsPage.isUserValid(), "User is valid")
+ Thread.sleep(2000)
+ saucelabsPage.close()
+ }
+
+ @Test(groups = ["sanity"], dataProvider = INVALID_USER_PROVIDER)
+ fun `after logggin in should be able to sort items A to Z`(username: String, password: String) {
+ val saucelabsPage = SaucelabsKotlin(this.driver, 10, SAUCELABS_URL)
+ saucelabsPage.open()
+ saucelabsPage.waitUntilLoaded()
+ val productPage = saucelabsPage.loginAndGoToProducts(username, password)
+ productPage.waitUntilLoaded()
+// productPage.sortAtoZ()
+ Thread.sleep(2000)
+ saucelabsPage.close()
+ }
+
+ companion object {
+ const val SAUCELABS_URL = "https://www.saucedemo.com/"
+ const val STANDARD_USER = "standard_user"
+ const val PROBLEM_USER = "problem_user"
+ const val PASSWORD = "secret_sauce"
+ const val WRONG_PASSWORD = "secret_sauces"
+ const val VALID_USER_PROVIDER = "validUserDataProvider"
+ const val INVALID_USER_PROVIDER = "invalidUserDataProvider"
+
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/module1/lessons/lesson052921/TestProduct.java b/src/test/java/module1/lessons/lesson052921/TestProduct.java
new file mode 100644
index 0000000..a1ba3b7
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson052921/TestProduct.java
@@ -0,0 +1,34 @@
+package module1.lessons.lesson052921;
+
+import common.BaseTestMultiThread;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+import saucelabs.pages.Login;
+import saucelabs.pages.Product;
+
+
+public class TestProduct extends BaseTestMultiThread {
+ private static final String URL = "https://www.saucedemo.com/";
+
+ private static final int TIME_OUT = 10;
+
+ @Test
+ public void testProductInfo() {
+ Login loginPage = new Login(this.getDriver(), TIME_OUT, URL);
+ loginPage.open();
+ loginPage.waitUntilLoaded();
+ Product productPage = loginPage.login("standard_user", "secret_sauce");
+ Assert.assertTrue(loginPage.isValidUser());
+ productPage.waitUntilLoaded();
+ productPage.sort(Product.SortOption.AZ);
+
+ // Interact with product
+// for(var item: productPage.inventoryList) {
+// System.out.println("--------------------");
+// System.out.println(item.getTitle());
+// System.out.println(item.getDescription());
+// System.out.println(item.getPrice());
+// item.addToCart();
+// }
+ }
+}
diff --git a/src/test/java/module1/lessons/lesson052921/Tester.java b/src/test/java/module1/lessons/lesson052921/Tester.java
new file mode 100644
index 0000000..92acd61
--- /dev/null
+++ b/src/test/java/module1/lessons/lesson052921/Tester.java
@@ -0,0 +1,19 @@
+package module1.lessons.lesson052921;
+
+import common.BasePage;
+import common.BaseTestMultiThread;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class Tester extends BaseTestMultiThread {
+
+ private final String YOUTUBE_URL = "https://www.youtube.com";
+
+ @Test(groups = {"sanity"})
+ public void testPage() {
+ BasePage basePage = new BasePage(this.getDriver(), 10, YOUTUBE_URL);
+ basePage.open();
+ basePage.waitUntilLoaded();
+ basePage.close();
+ }
+}
diff --git a/src/test/java/module1/lessons/saucelabs/TestInventoryItem.java b/src/test/java/module1/lessons/saucelabs/TestInventoryItem.java
new file mode 100644
index 0000000..169422e
--- /dev/null
+++ b/src/test/java/module1/lessons/saucelabs/TestInventoryItem.java
@@ -0,0 +1,38 @@
+package module1.lessons.saucelabs;
+
+import common.BaseTestMultiThread;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+import saucelabs.pages.InventoryItemPage;
+import saucelabs.pages.Login;
+import saucelabs.pages.Product;
+
+public class TestInventoryItem extends BaseTestMultiThread {
+
+ private static final String URL = "https://www.saucedemo.com/";
+
+ private static final int TIME_OUT = 10;
+
+ @Test
+ public void testProductInfo() {
+ Login loginPage = new Login(this.getDriver(), TIME_OUT, URL);
+ loginPage.open();
+ loginPage.waitUntilLoaded();
+ Product productPage = loginPage.login("standard_user", "secret_sauce");
+ Assert.assertTrue(loginPage.isValidUser());
+ productPage.waitUntilLoaded();
+
+ // Interact with product
+ for(var item: productPage.inventoryList) {
+ System.out.println("--------------------");
+ System.out.println(item.getTitle());
+ System.out.println(item.getDescription());
+ System.out.println(item.getPrice());
+ InventoryItemPage inventoryItemPage = item.clickOnPicture();
+ System.out.println(inventoryItemPage.getItemDetailsName());
+ System.out.println(inventoryItemPage.getItemDetailsDescription());
+ System.out.println(inventoryItemPage.getItemDetailsPrice());
+ inventoryItemPage.navigatePreviousPage();
+ }
+ }
+}
diff --git a/src/test/java/module1/lessons/saucelabs/TestLogin.java b/src/test/java/module1/lessons/saucelabs/TestLogin.java
new file mode 100644
index 0000000..5a51195
--- /dev/null
+++ b/src/test/java/module1/lessons/saucelabs/TestLogin.java
@@ -0,0 +1,49 @@
+package module1.lessons.saucelabs;
+
+import common.BaseTestMultiThread;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import saucelabs.pages.Login;
+
+public class TestLogin extends BaseTestMultiThread {
+
+ private static final String URL = "https://www.saucedemo.com/";
+
+ private static final int TIME_OUT = 10;
+
+ @DataProvider(name = "validUsersDataProvider")
+ public Object[][] validUsersDataProvider() {
+ return new Object [][] {
+ {"standard_user", "secret_sauce"},
+ {"problem_user", "secret_sauce"},
+ {"performance_glitch_user", "secret_sauce"}
+ };
+ }
+
+ @Test(dataProvider = "validUsersDataProvider", groups = {"sanity", "login"})
+ public void testValidUser(String user, String password) {
+ Login loginPage = new Login(this.getDriver(), TIME_OUT, URL);
+ loginPage.open();
+ loginPage.waitUntilLoaded();
+ loginPage.login(user, password);
+ Assert.assertTrue(loginPage.isValidUser());
+ }
+
+ @DataProvider(name = "invalidUsersDataProvider")
+ public Object[][] invalidUsersDataProvider() {
+ return new Object [][] {
+ {"invalid 1", "fdsadfsa"},
+ {"invalid 2", "secret_sauce"},
+ };
+ }
+
+ @Test(dataProvider = "invalidUsersDataProvider", groups = {"sanity", "login"})
+ public void testInvalidUser(String user, String password) {
+ Login loginPage = new Login(this.getDriver(), TIME_OUT, URL);
+ loginPage.open();
+ loginPage.waitUntilLoaded();
+ loginPage.login(user, password);
+ Assert.assertFalse(loginPage.isValidUser());
+ }
+}
diff --git a/src/test/java/module1/lessons/saucelabs/TestProduct.java b/src/test/java/module1/lessons/saucelabs/TestProduct.java
new file mode 100644
index 0000000..11f1e04
--- /dev/null
+++ b/src/test/java/module1/lessons/saucelabs/TestProduct.java
@@ -0,0 +1,39 @@
+package module1.lessons.saucelabs;
+
+
+import common.BaseTestMultiThread;
+import org.openqa.selenium.WebElement;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+import saucelabs.elements.InventoryListElements;
+import saucelabs.pages.Login;
+import saucelabs.pages.Product;
+
+import java.util.List;
+
+
+public class TestProduct extends BaseTestMultiThread {
+ private static final String URL = "https://www.saucedemo.com/";
+
+ private static final int TIME_OUT = 10;
+
+ @Test
+ public void testProductInfo() {
+ Login loginPage = new Login(this.getDriver(), TIME_OUT, URL);
+ loginPage.open();
+ loginPage.waitUntilLoaded();
+ Product productPage = loginPage.login("standard_user", "secret_sauce");
+ Assert.assertTrue(loginPage.isValidUser());
+ productPage.waitUntilLoaded();
+ productPage.sort(Product.SortOption.AZ);
+
+ // Interact with product
+ for(var item: productPage.inventoryList) {
+ System.out.println("--------------------");
+ System.out.println(item.getTitle());
+ System.out.println(item.getDescription());
+ System.out.println(item.getPrice());
+ item.addToCart();
+ }
+ }
+}
diff --git a/src/test/java/module1/lessons/saucelabs/TestSortProduct.java b/src/test/java/module1/lessons/saucelabs/TestSortProduct.java
new file mode 100644
index 0000000..ea469f0
--- /dev/null
+++ b/src/test/java/module1/lessons/saucelabs/TestSortProduct.java
@@ -0,0 +1,36 @@
+package module1.lessons.saucelabs;
+
+import common.BaseTestMultiThread;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import saucelabs.pages.Login;
+import saucelabs.pages.Product;
+
+public class TestSortProduct extends BaseTestMultiThread {
+
+ private static final String URL = "https://www.saucedemo.com/";
+
+ private static final int TIME_OUT = 10;
+
+ @DataProvider(name = "sortDataProvider")
+ public Object[][] sortDataProvider() {
+ return new Object [][] {
+ {"standard_user", "secret_sauce", Product.SortOption.HILO},
+ {"standard_user", "secret_sauce", Product.SortOption.AZ},
+ {"standard_user", "secret_sauce", Product.SortOption.ZA},
+ {"standard_user", "secret_sauce", Product.SortOption.LOHI},
+ };
+ }
+
+ @Test(dataProvider = "sortDataProvider", groups = {"product"})
+ public void testSortProducts(String user, String password, Product.SortOption option) {
+ Login loginPage = new Login(this.getDriver(), TIME_OUT, URL);
+ loginPage.open();
+ loginPage.waitUntilLoaded();
+ Product productPage = loginPage.login(user, password);
+ Assert.assertTrue(loginPage.isValidUser());
+ productPage.waitUntilLoaded();
+ productPage.sort(option);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/module1/selenium_basic/SeleniumExercise1.java b/src/test/java/module1/selenium_basic/SeleniumExercise1.java
new file mode 100644
index 0000000..8190f47
--- /dev/null
+++ b/src/test/java/module1/selenium_basic/SeleniumExercise1.java
@@ -0,0 +1,116 @@
+package module1.selenium_basic;
+
+import common.WebDriverFactory;
+import org.apache.log4j.Logger;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+public class SeleniumExercise1 {
+ private final static Logger logger = Logger.getLogger(SeleniumExercise1.class);
+
+
+ public static void main(String[] args) throws InterruptedException {
+
+// String sourceCode = firstExcercise();
+// secondExcercise(sourceCode);
+// thirdExcercise();
+
+ fifthExcercise();
+
+ }
+
+ private static String firstExcercise() {
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+ driver.get("https://www.google.com");
+ String title = driver.getTitle();
+ String url = driver.getCurrentUrl();
+ String sourceCode = driver.getPageSource();
+
+ System.out.println(" Title: " + title);
+ System.out.println(" Url: " + url);
+
+ System.out.println(" Source code: " + sourceCode);
+ logger.debug(" Title: " + title);
+ logger.debug(" url: " + url);
+
+// driver.navigate();
+ return sourceCode;
+ }
+
+ private static void secondExcercise(String sourceCode) {
+
+ }
+
+ private static void thirdExcercise() {
+ final String facebookUrl = "https://www.facebook.com/";
+
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.CHROME);
+ WebDriver.Navigation navigation = driver.navigate();
+ driver.get("https://www.google.com");
+ String firstUrl = driver.getCurrentUrl();
+ System.out.println(" First url: " + firstUrl);
+ logger.debug(" First url: " + firstUrl);
+
+ driver.navigate().to(facebookUrl);
+ String secondUrl = driver.getCurrentUrl();
+ System.out.println(" Second url: " + secondUrl);
+ logger.debug(" Second url: " + secondUrl);
+
+ driver.navigate().to("https://www.espn.com/");
+ String thirdUrl = driver.getCurrentUrl();
+ System.out.println(" Third url: " + thirdUrl);
+ logger.debug(" Third url: " + thirdUrl);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ String fourthUrl = driver.getCurrentUrl();
+ System.out.println(" Fourth url: " + fourthUrl);
+ logger.debug(" Fourth url: " + fourthUrl);
+
+ navigation.forward();
+ String fifthUrl = driver.getCurrentUrl();
+ System.out.println(" Fifth url: " + fifthUrl);
+ logger.debug(" Fifth url: " + fifthUrl);
+
+ assert fifthUrl.equals(facebookUrl) : "Current url is not facebook";
+ navigation.refresh();
+
+ String sixthUrl = driver.getCurrentUrl();
+ System.out.println(" Sixth url: " + sixthUrl);
+ logger.debug(" Sixth url: " + sixthUrl);
+ driver.close();
+
+ }
+
+ private static void fifthExcercise() throws InterruptedException {
+ final String youtubeUrl = "https://www.youtube.com/";
+ final String SEARCH_KEY = "Selenium";
+
+ WebDriver driver = WebDriverFactory.getDriver(WebDriverFactory.BrowserName.FIREFOX);
+
+ navigateTo(driver, youtubeUrl);
+
+ WebElement searchElement = driver.findElement(By.name("search_query"));
+ if (searchElement.isDisplayed() && searchElement.isEnabled()) {
+ System.out.println(" element " + searchElement.getTagName() + " is displayed and enabled.");
+ searchElement.sendKeys(SEARCH_KEY);
+ } else {
+ System.out.println(" element " + searchElement.getTagName() + " is NOT displayed.");
+ }
+
+ WebElement searchElementButton = driver.findElement(By.id("search-icon-legacy"));
+ searchElementButton.click();
+
+ Thread.sleep(5000);
+
+
+ }
+
+ private static void navigateTo(WebDriver driver, String url) {
+ driver.navigate().to(url);
+ String thirdUrl = driver.getCurrentUrl();
+ System.out.println(" url: " + thirdUrl);
+ logger.debug(" url: " + thirdUrl);
+ }
+}
diff --git a/src/test/java/module1/toyroblems/wednesday/FizzBuzz.java b/src/test/java/module1/toyroblems/wednesday/FizzBuzz.java
new file mode 100644
index 0000000..17edfd6
--- /dev/null
+++ b/src/test/java/module1/toyroblems/wednesday/FizzBuzz.java
@@ -0,0 +1,27 @@
+package module1.toyroblems.wednesday;
+
+import org.testng.annotations.Test;
+
+public class FizzBuzz {
+
+ public static void main(String[] args){
+ System.out.println("Hello QA Minds");
+
+ for (int k = 1; k < 100; k++) {
+
+ if (((k%3) == 0) && ((k%5) == 0)) {
+ System.out.println("FizzBuzz");
+ } else if ((k%5) == 0) {
+ System.out.println("Buzz");
+ } else if ((k%3) == 0) {
+ System.out.println("Fizz");
+ } else {
+ System.out.println(k);
+ }
+ }
+ }
+
+ @Test
+ void x() {
+ }
+}
diff --git a/src/test/java/module1/toyroblems/wednesday/Palindrome.java b/src/test/java/module1/toyroblems/wednesday/Palindrome.java
new file mode 100644
index 0000000..62a0f14
--- /dev/null
+++ b/src/test/java/module1/toyroblems/wednesday/Palindrome.java
@@ -0,0 +1,35 @@
+package module1.toyroblems.wednesday;
+
+import java.util.Arrays;
+import java.util.Scanner;
+
+public class Palindrome {
+
+ public static void main(String[] args){
+ System.out.println("Hello QA Minds");
+
+ boolean isPalindrome = true;
+ Scanner scanner = new Scanner(System.in);
+ String word = scanner.nextLine();
+ word = word.replaceAll("\\s+","");
+ char[] wordArray = word.toCharArray();
+ int initialCharacter = 0;
+ int lastCharacter = wordArray.length-1;
+
+ while (initialCharacter < lastCharacter) {
+
+ if (wordArray[initialCharacter] != wordArray[lastCharacter]) {
+ isPalindrome = false;
+ break;
+ }
+ initialCharacter++;
+ lastCharacter--;
+ }
+
+ if (isPalindrome) {
+ System.out.println( word + " is a palindrome.");
+ } else {
+ System.out.println( word + " is Not a palindrome.");
+ }
+ }
+}
diff --git a/src/test/java/module1/toyroblems/wednesday/StockSpan.java b/src/test/java/module1/toyroblems/wednesday/StockSpan.java
new file mode 100644
index 0000000..5952e3f
--- /dev/null
+++ b/src/test/java/module1/toyroblems/wednesday/StockSpan.java
@@ -0,0 +1,29 @@
+package module1.toyroblems.wednesday;
+
+import java.util.ArrayList;
+
+public class StockSpan {
+
+ public static void main(String[] args){
+// ArrayList stockPrices = new ArrayList(100, 80, 60, 70, 60, 75, 85);
+
+ int[] stocks = {100, 80, 60, 70, 60, 75, 85};
+ ArrayList stockValues = new ArrayList<>();
+
+ for (int k=0; k=0; z--) {
+ if (stocks[k] > stocks[z]) {
+ counter++;
+ }
+ }
+ stockValues.add(counter);
+ }
+
+ for (Integer value: stockValues) {
+ System.out.print(value + " ");
+ }
+ }
+
+}
diff --git a/src/test/java/module1/toyroblems/wednesday/WaterTower.java b/src/test/java/module1/toyroblems/wednesday/WaterTower.java
new file mode 100644
index 0000000..cd651f4
--- /dev/null
+++ b/src/test/java/module1/toyroblems/wednesday/WaterTower.java
@@ -0,0 +1,21 @@
+package module1.toyroblems.wednesday;
+
+import java.util.List;
+
+public class WaterTower {
+
+ public static void main(String[] args){
+ System.out.println("Hello QA Minds");
+
+ List towers = List.of(5, 3, 7, 2, 6, 4, 5, 9, 1, 2);
+ int water = 0;
+
+ for (int k=0; k
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file