From 0870f536dbca58b03209bc7ffa857763670d5f7b Mon Sep 17 00:00:00 2001 From: "marcus.merrell" Date: Mon, 22 Apr 2019 09:57:01 -0500 Subject: [PATCH] Tests running in serial --- saucedemo-parallel/README.md | 2 +- saucedemo-parallel/pom.xml | 15 ++--- .../saucedemo/SauceDemoNavigation.java | 10 --- .../saucedemo/pages/InventoryPage.java | 67 +++++++++---------- .../saucelabs/saucedemo/pages/LoginPage.java | 23 ++++--- .../saucedemo/pages/SauceDemoNavigation.java | 24 +++++++ .../saucedemo/tests/BaseWebDriverTest.java | 4 +- .../saucedemo/tests/InventoryTest.java | 52 +++++++++++--- .../saucelabs/saucedemo/tests/LoginTest.java | 61 ++++++++++++++--- 9 files changed, 170 insertions(+), 88 deletions(-) delete mode 100644 saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/SauceDemoNavigation.java create mode 100644 saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/SauceDemoNavigation.java diff --git a/saucedemo-parallel/README.md b/saucedemo-parallel/README.md index 48b41a6..4eb3f84 100644 --- a/saucedemo-parallel/README.md +++ b/saucedemo-parallel/README.md @@ -20,7 +20,7 @@ This code is provided on an "AS-IS” basis without warranty of any kind, either 3. Project Dependencies * Check that Packages are available ``` - $ cd Java-TestNg-Selenium + $ cd saucedemo-parallel $ mvn test-compile ``` * You may also want to run the command below to check for outdated dependencies. Please be sure to verify and review updates before editing your pom.xml file. The updated packages may or may not be compatible with your code. diff --git a/saucedemo-parallel/pom.xml b/saucedemo-parallel/pom.xml index 768fae3..ef48340 100644 --- a/saucedemo-parallel/pom.xml +++ b/saucedemo-parallel/pom.xml @@ -2,14 +2,12 @@ 4.0.0 - sauce-project - com.yourcompany + saucecon19-parallel-workshop + com.saucelabs 1.0-SNAPSHOT jar sauce_quickstart - A sample Maven project that demonstrates how to integrate Sauce OnDemand with WebDriver tests - that run using TestNG - + A sample Maven project that demonstrates Sauce Labs Selenium tests using TestNG @@ -57,12 +55,7 @@ org.apache.maven.plugins maven-surefire-plugin 2.12.4 - - 40 - methods - false - - + diff --git a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/SauceDemoNavigation.java b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/SauceDemoNavigation.java deleted file mode 100644 index 27a2add..0000000 --- a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/SauceDemoNavigation.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.saucelabs.saucedemo; - -import org.openqa.selenium.WebDriver; - -public class SauceDemoNavigation { - private WebDriver driver; - public SauceDemoNavigation(WebDriver driver) { - this.driver = driver; - } -} diff --git a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/InventoryPage.java b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/InventoryPage.java index fc7dd2b..e24cdb6 100644 --- a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/InventoryPage.java +++ b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/InventoryPage.java @@ -1,58 +1,55 @@ package com.saucelabs.saucedemo.pages; import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; -import org.openqa.selenium.support.PageFactory; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; public class InventoryPage { - private WebDriver driver; + InventoryPage() {} - public InventoryPage(WebDriver driver) { - this.driver = driver; - PageFactory.initElements(driver, this); - } - - @FindBy(className = "header_label") - private WebElement headerLabel; - - @FindBy(className = "product_sort_container") - private WebElement sortList; + @FindBy(className = "inventory_container") + private WebElement inventoryContainer; - @FindBy(className ="add-to-cart-button") - private WebElement addToCart; + @FindBy(className = "inventory_list") + private WebElement inventoryList; - @FindBy(className ="remove-from-cart-button") - private WebElement removeFromCartButton; + @FindBy(className = "header_secondary_container") + private WebElement inventoryHeader; - @FindBy(className = "shopping_cart_badge") - private WebElement shoppingCartBadge; + /** + * Returns the Div containing the item specified (zero-indexed) + * @param itemNumber + * @return + */ + private WebElement getItemNumber(int itemNumber) { + return inventoryList.findElement(By.cssSelector(String.format("div.inventory_item:nth-of-type(%d)", itemNumber))); + } - @FindBy(className = "inventory_container") - private WebElement inventoryContainer; + public String getItemName(int itemNumber) { + WebElement itemName = getItemNumber(itemNumber).findElement(By.className("inventory_item_name")); + return itemName.getText(); + } - public boolean isOnPage() { - WebDriverWait wait = new WebDriverWait(driver, 5); - wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("header_label"))); - return headerLabel.isDisplayed(); + public String getItemDescription(int itemNumber) { + WebElement itemDesc = getItemNumber(itemNumber).findElement(By.className("inventory_item_desc")); + return itemDesc.getText(); } - public void addItemToCart() { - addToCart.click(); + public String getItemPrice(int itemNumber) { + WebElement itemPrice = getItemNumber(itemNumber).findElement(By.className("inventory_item_price")); + return itemPrice.getText(); } - public void removeItemFromCart() { - removeFromCartButton.click(); + public void addItemToCart(int itemNumber) { + WebElement addToCart = getItemNumber(itemNumber).findElement(By.className("btn_primary")); + addToCart.click(); } - public int getNumberOfItemsInCart() { - return Integer.valueOf(shoppingCartBadge.getText()); + public boolean isOnPage() { + return inventoryHeader.isDisplayed(); } - public int getItemsInPage() { - return Integer.valueOf(inventoryContainer.getText()); + public boolean itemAddedToCart(int itemNumber) { + return getItemNumber(itemNumber).findElement(By.className("btn_secondary")).isDisplayed(); } } diff --git a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/LoginPage.java b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/LoginPage.java index 1ba48d6..c6eb0c3 100644 --- a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/LoginPage.java +++ b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/LoginPage.java @@ -1,13 +1,14 @@ package com.saucelabs.saucedemo.pages; -import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; -import org.openqa.selenium.support.PageFactory; public class LoginPage { - private static String url = "https://www.saucedemo.com/"; - private WebDriver driver; + private String url = "https://www.saucedemo.com/"; + + public String getUrl() { + return url; + } @FindBy(id = "user-name") private WebElement usernameInput; @@ -21,14 +22,10 @@ public class LoginPage { @FindBy(id = "login_credentials") private WebElement credentialsInfo; - public LoginPage(WebDriver driver) { - this.driver = driver; - PageFactory.initElements(driver, this); - } + @FindBy(className = "svg-inline--fa") + private WebElement epicSadFace; - public void visitPage() { - driver.get(url); - } + public LoginPage() {} public boolean isOnPage() { return credentialsInfo.isDisplayed(); @@ -39,4 +36,8 @@ public void login(String username, String password) { passwordInput.sendKeys(password); submitButton.click(); } + + public boolean epicSadFaceDisplayed() { + return epicSadFace.isDisplayed(); + } } diff --git a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/SauceDemoNavigation.java b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/SauceDemoNavigation.java new file mode 100644 index 0000000..6a70a58 --- /dev/null +++ b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/pages/SauceDemoNavigation.java @@ -0,0 +1,24 @@ +package com.saucelabs.saucedemo.pages; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; + +public class SauceDemoNavigation { + private WebDriver driver; + public SauceDemoNavigation(WebDriver driver) { + this.driver = driver; + } + + public LoginPage goToLoginPage() { + LoginPage loginPage = new LoginPage(); + PageFactory.initElements(driver, loginPage); + driver.get(loginPage.getUrl()); + return loginPage; + } + + public InventoryPage getInventoryPage() { + InventoryPage inventoryPage = new InventoryPage(); + PageFactory.initElements(driver, inventoryPage); + return inventoryPage; + } +} diff --git a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/BaseWebDriverTest.java b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/BaseWebDriverTest.java index de9452d..c46c64a 100644 --- a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/BaseWebDriverTest.java +++ b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/BaseWebDriverTest.java @@ -74,7 +74,7 @@ private void createLocalDriver(MutableCapabilities capabilities) { * @param beforeMethod * @return TestNG's preferred Object[][] structure, containing browser, version, and platform information */ - @DataProvider(name = "sauceBrowsers", parallel = true) + @DataProvider(name = "sauceBrowsers", parallel = false) public static Object[][] sauceBrowserDataProvider(Method beforeMethod) { RunType runType = RunType.SAUCE; return new Object[][]{ @@ -99,7 +99,7 @@ public static Object[][] sauceBrowserDataProvider(Method beforeMethod) { }; } - @DataProvider(name = "localBrowsers", parallel = true) + @DataProvider(name = "localBrowsers") public static Object[][] localBrowserDataProvider(Method beforeMethod) { RunType runType = RunType.LOCAL; return new Object[][]{ diff --git a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/InventoryTest.java b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/InventoryTest.java index 9cc4cf2..2a4386e 100644 --- a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/InventoryTest.java +++ b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/InventoryTest.java @@ -1,18 +1,50 @@ package com.saucelabs.saucedemo.tests; +import com.saucelabs.saucedemo.pages.SauceDemoNavigation; import com.saucelabs.saucedemo.pages.InventoryPage; +import org.testng.Assert; import org.testng.annotations.Test; -import java.util.stream.IntStream; - public class InventoryTest extends BaseWebDriverTest { - @Test - public void addOneItemToCart() {} - - public void addItemsToCart(int items) { - IntStream.range(0, items).forEach(i -> { - InventoryPage page = new InventoryPage(getWebDriver()); - page.addItemToCart(); - }); + @Test(dataProvider = "sauceBrowsers") + public void testItem3Label(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "testItem3Label", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + + navigation.goToLoginPage().login("standard_user", "secret_sauce"); + InventoryPage inventoryPage = navigation.getInventoryPage(); + Assert.assertEquals("Sauce Labs Bolt T-Shirt", inventoryPage.getItemName(3)); + } + + @Test(dataProvider = "sauceBrowsers") + public void testItem3Price(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "testItem3Price", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + navigation.goToLoginPage().login("standard_user", "secret_sauce"); + InventoryPage inventoryPage = navigation.getInventoryPage(); + Assert.assertEquals("$15.99", inventoryPage.getItemPrice(3)); + } + + @Test(dataProvider = "sauceBrowsers") + public void testItem3Description(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "testItem3Description", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + navigation.goToLoginPage().login("standard_user", "secret_sauce"); + InventoryPage inventoryPage = navigation.getInventoryPage(); + Assert.assertEquals("Get your testing superhero on with the Sauce Labs bolt T-shirt. From American Apparel, 100% ringspun combed cotton, heather gray with red bolt.", inventoryPage.getItemDescription(3)); + } + + @Test(dataProvider = "sauceBrowsers") + public void testAddOneItem(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "testAddOneItem", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + navigation.goToLoginPage().login("standard_user", "secret_sauce"); + InventoryPage inventoryPage = navigation.getInventoryPage(); + inventoryPage.addItemToCart(3); + Assert.assertTrue(inventoryPage.itemAddedToCart(3)); } } diff --git a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/LoginTest.java b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/LoginTest.java index 429a3d6..d48958f 100644 --- a/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/LoginTest.java +++ b/saucedemo-parallel/src/test/java/com/saucelabs/saucedemo/tests/LoginTest.java @@ -1,5 +1,6 @@ package com.saucelabs.saucedemo.tests; +import com.saucelabs.saucedemo.pages.SauceDemoNavigation; import com.saucelabs.saucedemo.pages.InventoryPage; import com.saucelabs.saucedemo.pages.LoginPage; import org.testng.Assert; @@ -8,20 +9,64 @@ public class LoginTest extends BaseWebDriverTest { @Test(dataProvider = "sauceBrowsers") public void loginTestValid(String browser, String browserVersion, String platformName, RunType runType) { - this.createDriver(browser, browserVersion, platformName, "loginTest", runType); - LoginPage loginPage = new LoginPage(getWebDriver()); - InventoryPage inventoryPage = new InventoryPage(getWebDriver()); - loginPage.visitPage(); + this.createDriver(browser, browserVersion, platformName, "loginTestValid", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + LoginPage loginPage = navigation.goToLoginPage(); loginPage.login("standard_user", "secret_sauce"); + InventoryPage inventoryPage = navigation.getInventoryPage(); + Assert.assertTrue(inventoryPage.isOnPage()); + } + + @Test(dataProvider = "sauceBrowsers") + public void loginTestValidPerfGlitch(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "loginTestValidPerfGlitch", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + LoginPage loginPage = navigation.goToLoginPage(); + loginPage.login("performance_glitch_user", "secret_sauce"); + InventoryPage inventoryPage = navigation.getInventoryPage(); Assert.assertTrue(inventoryPage.isOnPage()); } @Test(dataProvider = "sauceBrowsers") - public void loginTestInvalid(String browser, String browserVersion, String platformName, RunType runType) { - this.createDriver(browser, browserVersion, platformName, "loginTest", runType); - LoginPage loginPage = new LoginPage(getWebDriver()); - loginPage.visitPage(); + public void loginTestValidLockedOut(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "loginTestValidLockedOut", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + LoginPage loginPage = navigation.goToLoginPage(); + loginPage.login("locked_out_user", "secret_sauce"); + Assert.assertTrue(loginPage.epicSadFaceDisplayed()); + } + + @Test(dataProvider = "sauceBrowsers") + public void loginTestValidProblem(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "loginTestValidProblem", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + LoginPage loginPage = navigation.goToLoginPage(); + loginPage.login("problem_user", "secret_sauce"); + InventoryPage inventoryPage = navigation.getInventoryPage(); + Assert.assertTrue(inventoryPage.isOnPage()); + } + + @Test(dataProvider = "sauceBrowsers") + public void loginTestInvalidUsername(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "loginTestInvalidUsername", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + LoginPage loginPage = navigation.goToLoginPage(); loginPage.login("invalid_user", "secret_sauce"); Assert.assertTrue(loginPage.isOnPage()); } + + @Test(dataProvider = "sauceBrowsers") + public void loginTestInvalidPassword(String browser, String browserVersion, String platformName, RunType runType) { + this.createDriver(browser, browserVersion, platformName, "loginTestInvalidPassword", runType); + + SauceDemoNavigation navigation = new SauceDemoNavigation(getWebDriver()); + LoginPage loginPage = navigation.goToLoginPage(); + loginPage.login("standard_user", "invalid_password"); + Assert.assertTrue(loginPage.isOnPage()); + } } \ No newline at end of file