diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 9ec7918..f174da7 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -14,15 +14,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: 11 - - name: Run acceptance tests - env: - SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} - SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} - run: | - echo "$TEST_SECRET" - mvn test -X -Dtest=AcceptanceTestDrivenAutomationTest + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Run acceptance tests + env: + SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} + SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} + run: | + echo "$TEST_SECRET" + mvn test -X -Dtest=AcceptanceTestDrivenAutomationTest diff --git a/pom.xml b/pom.xml index 593e4b7..3c73264 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,6 @@ org.ultimateqa selenium.java 1.0-SNAPSHOT - @@ -24,6 +23,12 @@ + + junit + junit + 4.12 + test + org.seleniumhq.selenium selenium-java diff --git a/src/test/java/atda/AcceptanceTestDrivenAutomationTest.java b/src/test/java/atda/AcceptanceTestDrivenAutomationTest.java index d92be23..217cd17 100644 --- a/src/test/java/atda/AcceptanceTestDrivenAutomationTest.java +++ b/src/test/java/atda/AcceptanceTestDrivenAutomationTest.java @@ -1,50 +1,37 @@ package atda; -import org.junit.After; -import org.junit.Before; import org.junit.Test; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.chrome.ChromeDriver; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class AcceptanceTestDrivenAutomationTest { - WebDriver driver; - @Before - public void setup() - { - driver = getDriver(); - } - @After - public void cleanup() - { - driver.quit(); - } - @Test - public void shouldOpen() - { - LoginPage loginPage = new LoginPage(driver); - loginPage.open(); - assertTrue(loginPage.isLoaded()); - } +@RunWith(Parameterized.class) +public class AcceptanceTestDrivenAutomationTest extends BaseTest { @Test - public void shouldLogin() - { + public void shouldLogin() { LoginPage loginPage = new LoginPage(driver); loginPage.open(); - assertTrue(loginPage.isLoaded()); - + //I used to do this, now I learned it's not necessary + //assertTrue("Login page should load successfully", loginPage.isLoaded()); loginPage.login("standard_user", "secret_sauce"); - assertTrue(new ProductsPage(driver).isLoaded()); + assertTrue("Products page should open when we login", new ProductsPage(driver).isLoaded()); } - - private WebDriver getDriver() { - //Telling the system where to find chromedriver on mac - //System.setProperty("webdriver.chrome.driver", "resources/mac/chromedriver"); - - //The path of chromedriver for windows - System.setProperty("webdriver.chrome.driver", "resources/windows/chromedriver.exe"); - return new ChromeDriver(); + @Test + public void shouldAddOneItemToCart() { + ProductsPage productsPage = new ProductsPage(driver); + productsPage.open(); + productsPage.addItemToCart(); + assertEquals("1", productsPage.getCountOfItemsInCart()); + } + @Test + public void shouldAddTwoItemsToCart() { + ProductsPage productsPage = new ProductsPage(driver); + productsPage.open(); + productsPage.addItemToCart(); + productsPage.addItemToCart(); + assertEquals("2", productsPage.getCountOfItemsInCart()); } } diff --git a/src/test/java/atda/BasePage.java b/src/test/java/atda/BasePage.java index eef3e5b..bc24900 100644 --- a/src/test/java/atda/BasePage.java +++ b/src/test/java/atda/BasePage.java @@ -1,15 +1,18 @@ package atda; +import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class BasePage { public final WebDriver driver; - WebDriverWait wait; - public BasePage(WebDriver driver) { this.driver = driver; - wait = new WebDriverWait(driver, 10); + } + public boolean isElementDisplayed(By locator) { + WebDriverWait wait = new WebDriverWait(driver, 10); + return wait.until(ExpectedConditions.visibilityOfElementLocated(locator)).isDisplayed(); } } diff --git a/src/test/java/atda/BaseTest.java b/src/test/java/atda/BaseTest.java new file mode 100644 index 0000000..5891306 --- /dev/null +++ b/src/test/java/atda/BaseTest.java @@ -0,0 +1,78 @@ +package atda; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.rules.TestName; +import org.junit.runners.Parameterized; +import org.openqa.selenium.MutableCapabilities; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.RemoteWebDriver; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Arrays; +import java.util.Collection; + +public class BaseTest { + public WebDriver driver; + + @Rule + public SauceTestWatcher resultReportingTestWatcher = new SauceTestWatcher(); + + @Rule + public TestName testName = new TestName() { + public String getMethodName() { + return String.format("%s", super.getMethodName()); + } + }; + + @Parameterized.Parameters + public static Collection crossBrowserData() { + return Arrays.asList(new Object[][] { + { "Chrome", "macOS 10.14", "latest" }, + { "Chrome", "macOS 10.15", "latest" }, + { "Chrome", "macOS 10.14", "latest-1" }, + { "Chrome", "macOS 10.15", "latest-1" }, + { "Safari", "macOS 10.14", "latest" }, + { "Safari", "macOS 10.15", "latest" }, + }); + } + + @Parameterized.Parameter // first data value (0) is default + public String browser; + + @Parameterized.Parameter(1) + public String platform; + + @Parameterized.Parameter(2) + public String browserVersion; + + @Before + public void setup() throws MalformedURLException { + createDriver(); + resultReportingTestWatcher.setDriver(driver); + } + private void createDriver() throws MalformedURLException { + String sauceUsername = System.getenv("SAUCE_USERNAME"); + String sauceAccessKey = System.getenv("SAUCE_ACCESS_KEY"); + + MutableCapabilities sauceOpts = new MutableCapabilities(); + sauceOpts.setCapability("username", sauceUsername); + sauceOpts.setCapability("accessKey", sauceAccessKey); + sauceOpts.setCapability("name", testName.getMethodName()); + sauceOpts.setCapability("build", "ATDA"); + sauceOpts.setCapability("commandTimeout", "30"); + + + MutableCapabilities browserOptions = new MutableCapabilities(); + browserOptions.setCapability(CapabilityType.PLATFORM_NAME, platform); + browserOptions.setCapability(CapabilityType.BROWSER_VERSION, browserVersion); + browserOptions.setCapability(CapabilityType.BROWSER_NAME, browser); + browserOptions.setCapability("sauce:options", sauceOpts); + + String sauceUrl = "https://ondemand.saucelabs.com/wd/hub"; + URL url = new URL(sauceUrl); + driver = new RemoteWebDriver(url, browserOptions); + } +} diff --git a/src/test/java/atda/LoginPage.java b/src/test/java/atda/LoginPage.java index 3018565..29c0862 100644 --- a/src/test/java/atda/LoginPage.java +++ b/src/test/java/atda/LoginPage.java @@ -9,18 +9,21 @@ public class LoginPage extends BasePage { public LoginPage(WebDriver driver) { super(driver); } - + public By getUserNameLocator() + { + return By.id("user-name"); + } public void open() { - driver.get("http://www.saucedemo.com"); + driver.get("https://www.saucedemo.com/"); } public boolean isLoaded() { - return wait.until(ExpectedConditions.presenceOfElementLocated(By.id("user-name"))).isDisplayed(); + return isElementDisplayed(getUserNameLocator()); } - public void login(String userName, String password) { - driver.findElement(By.id("user-name")).sendKeys(userName); + public void login(String username, String password) { + driver.findElement(getUserNameLocator()).sendKeys(username); driver.findElement(By.id("password")).sendKeys(password); - driver.findElement(By.className("btn_action")).submit(); + driver.findElement(By.className("btn_action")).click(); } } diff --git a/src/test/java/atda/ProductsPage.java b/src/test/java/atda/ProductsPage.java index b8152a6..629faf6 100644 --- a/src/test/java/atda/ProductsPage.java +++ b/src/test/java/atda/ProductsPage.java @@ -6,12 +6,24 @@ import org.openqa.selenium.support.ui.WebDriverWait; public class ProductsPage extends BasePage{ + public ProductsPage(WebDriver driver) { super(driver); } public boolean isLoaded() { - return wait.until( - ExpectedConditions.presenceOfElementLocated(By.id("inventory_filter_container"))).isDisplayed(); + return isElementDisplayed(By.id("inventory_container")); + } + + public void open() { + driver.navigate().to("https://www.saucedemo.com/inventory.html"); + } + + public void addItemToCart() { + WebDriverWait wait = new WebDriverWait(driver, 10); + wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("btn_primary"))).click(); + } + public String getCountOfItemsInCart() { + return driver.findElement(By.className("shopping_cart_badge")).getText(); } } diff --git a/src/test/java/atda/SauceTestWatcher.java b/src/test/java/atda/SauceTestWatcher.java new file mode 100644 index 0000000..8eb9e0a --- /dev/null +++ b/src/test/java/atda/SauceTestWatcher.java @@ -0,0 +1,31 @@ +package atda; + +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; + +public class SauceTestWatcher extends TestWatcher { + private WebDriver driver; + + public void setDriver(WebDriver driver) + { + this.driver = driver; + } + + protected void succeeded(Description description) { + ((JavascriptExecutor) driver).executeScript("sauce:job-result=passed"); + if(driver != null) + { + driver.quit(); + } + } + + protected void failed(Description description) { + ((JavascriptExecutor) driver).executeScript("sauce:job-result=failed"); + if(driver != null) + { + driver.quit(); + } + } +}