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