diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 125c5d3..4da621d 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,7 +21,7 @@ jobs: with: java-version: 1.8 - name: Run Selenium Test - run: mvn test -Dtestplan=todoTestPlan.xml + run: mvn test - name: Publish Test Report uses: scacap/action-surefire-report@v1 with: diff --git a/README.md b/README.md index dce492b..4a31eae 100644 --- a/README.md +++ b/README.md @@ -67,10 +67,10 @@ Repo này chứa những bài tập và phần cấu hình sẵn cơ bản để 2. [Check to a box](https://cuhavp.github.io/checkboxes/) * Open browser * Navigate to https://the-internet.herokuapp.com/checkboxes -* Check on "checkbox1" -* Verify "checkbox1" is checked -* Check on "checkbox2" -* Verify "checkbox2" is checked +* Check on **checkbox1** +* Verify **checkbox1** is `checked` +* Check on **checkbox2** +* Verify **checkbox2** is `checked` --- 3. [Select option](https://cuhavp.github.io/drop-down/) * Open browser @@ -104,12 +104,16 @@ Repo này chứa những bài tập và phần cấu hình sẵn cơ bản để * Open browser * Navigate to https://the-internet.herokuapp.com/nested_frames * Verify Text present: - ``` - LEFT - RIGHT - MIDDLE - BOTTOM - ``` + +``` + LEFT + + RIGHT + + MIDDLE + + BOTTOM +``` --- 7. JavaScript Alerts * Open browser @@ -141,4 +145,28 @@ Repo này chứa những bài tập và phần cấu hình sẵn cơ bản để * Navigate to https://todomvc.com/examples/vanillajs/ * Enter a new todo name * Verify a todo added ---- \ No newline at end of file +--- +12. Ecommerce sample test +* Open Browser +* Navigator to [Ebay item's page](https://www.ebay.com/p/5034224981?iid=153638834105&var=453955077516) +* Validate the price +* Click **Buy It Now** button +* On the SigIn page, click **Continue as a guest** +* Fill Shipping info +* Validate **Subtotal** price +* Click **Continue** button +* Validate **Total** price +---- +13. Basic authentication +---- +14. Broken images +---- +16. Drag & drop +---- +18. Horizontal slider +---- +19. Dynamic content +---- +20. Dynamic loading +---- +21. Input (from keyboard) \ No newline at end of file diff --git a/form-authentication-testplan.xml b/form-authentication-testplan.xml new file mode 100644 index 0000000..39392ab --- /dev/null +++ b/form-authentication-testplan.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8cadf6b..0e40eae 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,11 @@ 7.0.0 test + + org.projectlombok + lombok + 1.18.20 + @@ -37,6 +42,16 @@ 1.8 + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + + form-authentication-testplan.xml + + + \ No newline at end of file diff --git a/src/test/java/bases/BasePage.java b/src/test/java/bases/BasePage.java new file mode 100644 index 0000000..b0d727f --- /dev/null +++ b/src/test/java/bases/BasePage.java @@ -0,0 +1,5 @@ +package bases; + +public abstract class BasePage { + public abstract void open() ; +} diff --git a/src/test/java/bases/BaseTest.java b/src/test/java/bases/BaseTest.java new file mode 100644 index 0000000..7d63f0b --- /dev/null +++ b/src/test/java/bases/BaseTest.java @@ -0,0 +1,43 @@ +package bases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.apache.commons.io.FileUtils; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.ITestResult; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Parameters; + +import java.io.File; +import java.io.IOException; + +public class BaseTest { + + @Parameters({"browser"}) + @BeforeClass(alwaysRun = true) + public void setUp(String name) { + Browser.launch(name); + } + + @AfterMethod(alwaysRun = true) + public void captureScreen(ITestResult testResult) throws IOException { + if(!testResult.isSuccess()){ + File file = ((TakesScreenshot) Browser.getDriver()).getScreenshotAs(OutputType.FILE); + File DestFile=new File("./target/screenshot/" + +testResult.getMethod().getMethodName() + + "-" + +System.currentTimeMillis()+".png"); + + FileUtils.copyFile(file, DestFile); + } + } + + @AfterClass(alwaysRun = true) + public void tearDown(){ + Browser.getDriver().quit(); + } +} diff --git a/src/test/java/bases/Browser.java b/src/test/java/bases/Browser.java new file mode 100644 index 0000000..39aedc8 --- /dev/null +++ b/src/test/java/bases/Browser.java @@ -0,0 +1,91 @@ +package bases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import java.util.List; + +public class Browser { + private static WebDriver driver; + public static Actions mouse; + public static WebDriverWait wait; + + public static void launch(String name) { + if (name.equalsIgnoreCase("chrome")) { + WebDriverManager.chromedriver().setup(); + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.setHeadless(true); + driver = new ChromeDriver(chromeOptions); + } else if (name.equalsIgnoreCase("firefox")) { + WebDriverManager.firefoxdriver().setup(); + driver = new FirefoxDriver(); + } else if (name.equalsIgnoreCase("ie")) { + WebDriverManager.iedriver().setup(); + driver = new InternetExplorerDriver(); + } + mouse = new Actions(getDriver()); + wait = new WebDriverWait(getDriver(), 30); + } + + public static WebDriver getDriver() { + return driver; + } + + public static void visit(String url) { + driver.get(url); + } + + public static void fill(By locator, String withText) { + driver.findElement(locator).clear(); + driver.findElement(locator).sendKeys(withText); + } + + public static WebElement find(By locator) { + return driver.findElement(locator); + } + + public static void click(By locator) { + driver.findElement(locator).click(); + } + + public static String getText(By locator) { + return driver.findElement(locator).getText(); + } + + public static boolean isDisplayed(By locator) { + return driver.findElement(locator).isDisplayed(); + } + + public static void hover(By locator) { + mouse.moveToElement(find(locator)).perform(); + } + + public static List all(By locator) { + return driver.findElements(locator); + } + + public static int count(By locator) { + return all(locator).size(); + } + + void check(By checkbox) { + if (!find(checkbox).isSelected()) { + click(checkbox); + } + } + + void uncheck(By checkbox) { + if (find(checkbox).isSelected()) { + click(checkbox); + } + } + +} diff --git a/src/test/java/helper/DateUtils.java b/src/test/java/helper/DateUtils.java new file mode 100644 index 0000000..332e4f5 --- /dev/null +++ b/src/test/java/helper/DateUtils.java @@ -0,0 +1,55 @@ +package helper; + +import org.openqa.selenium.WebElement; + +import java.time.LocalDate; +import java.util.Calendar; +import java.util.List; +import java.util.TimeZone; + +public class DateUtils { + //Get The Current Day + public static String getCurrentDay() { + //Create a Calendar Object + Calendar calendar = Calendar.getInstance(TimeZone.getDefault()); + + //Get Current Day as a number + int todayInt = calendar.get(Calendar.DAY_OF_MONTH); + System.out.println("Today Int: " + todayInt + "\n"); + + //Integer to String Conversion + String todayStr = Integer.toString(todayInt); + System.out.println("Today Str: " + todayStr + "\n"); + + return todayStr; + } + + //Get The Current Day plus days. You can change this method based on your needs. + public static String getCurrentDayPlus(int days) { + LocalDate currentDate = LocalDate.now(); + + int dayOfWeekPlus = currentDate.getDayOfWeek().plus(days).getValue(); + return Integer.toString(dayOfWeekPlus); + } + + //Click to given day + public static void clickGivenDay(List elementList, String day) { + //DatePicker is a table. Thus we can navigate to each cell + //and if a cell matches with the current date then we will click it. + /**Functional JAVA version of this method.*/ + elementList.stream() + .filter(element -> element.getText().contains(day)) + .findFirst() + .ifPresent(WebElement::click); + + /**Non-functional JAVA version of this method.*/ + //for ( + // WebElement cell : elementList) { + // String cellText = cell.getText(); + // if (cellText.contains(day)) { + // cell.click(); + // break; + // } + //} + } +} diff --git a/src/test/java/model/Person.java b/src/test/java/model/Person.java new file mode 100644 index 0000000..20fb804 --- /dev/null +++ b/src/test/java/model/Person.java @@ -0,0 +1,16 @@ +package model; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +@Getter @AllArgsConstructor +@Data +public class Person { + private final String lastName; + private final String firstName; + private final String email; + private final String website; + private final float due; +} \ No newline at end of file diff --git a/src/test/java/openBrowser/ChromeHeadlessTest.java b/src/test/java/openBrowser/ChromeHeadlessTest.java new file mode 100644 index 0000000..419ae76 --- /dev/null +++ b/src/test/java/openBrowser/ChromeHeadlessTest.java @@ -0,0 +1,17 @@ +package openBrowser; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +public class ChromeHeadlessTest { + public static void main(String[] args) { + WebDriverManager.chromedriver().setup(); + + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.setHeadless(true); + + WebDriver driver = new ChromeDriver(chromeOptions); + } +} diff --git a/src/test/java/openBrowser/ChromeMobileViewPortTest.java b/src/test/java/openBrowser/ChromeMobileViewPortTest.java new file mode 100644 index 0000000..adf0a5e --- /dev/null +++ b/src/test/java/openBrowser/ChromeMobileViewPortTest.java @@ -0,0 +1,19 @@ +package openBrowser; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +import java.util.HashMap; +import java.util.Map; + +public class ChromeMobileViewPortTest { + public static void main(String[] args) { + WebDriverManager.chromedriver().setup(); + Map mobileEmulation = new HashMap<>(); + mobileEmulation.put("deviceName", "iPhone X"); + ChromeOptions opts = new ChromeOptions(); + opts.setExperimentalOption("mobileEmulation", mobileEmulation); + new ChromeDriver(opts); + } +} diff --git a/src/test/java/openBrowser/ChromeTest.java b/src/test/java/openBrowser/ChromeTest.java new file mode 100644 index 0000000..ecf3332 --- /dev/null +++ b/src/test/java/openBrowser/ChromeTest.java @@ -0,0 +1,26 @@ +package openBrowser; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; + +public class ChromeTest { + + public static void main(String[] args) { + WebDriverManager.chromedriver().setup(); + WebDriver driver = new ChromeDriver();// open browser + driver.manage().window().maximize(); // maximize browser window +// driver.navigate().to("https://google.com.vn"); // navigate to a url + driver.get("https://google.com.vn"); + driver.get("https://www.selenium.dev"); + driver.navigate().back(); + driver.navigate().refresh(); + driver.navigate().forward(); + + driver.close();// close session +// driver.quit(); + + } + +} diff --git a/src/test/java/openBrowser/FirefoxHeadlessMode.java b/src/test/java/openBrowser/FirefoxHeadlessMode.java new file mode 100644 index 0000000..9af90c4 --- /dev/null +++ b/src/test/java/openBrowser/FirefoxHeadlessMode.java @@ -0,0 +1,20 @@ +package openBrowser; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxBinary; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxOptions; + +public class FirefoxHeadlessMode { + public static void main(String[] args) { + WebDriverManager.firefoxdriver().setup(); + + FirefoxBinary firefoxBinary = new FirefoxBinary(); + firefoxBinary.addCommandLineOptions("--headless"); + FirefoxOptions firefoxOptions = new FirefoxOptions(); + firefoxOptions.setBinary(firefoxBinary); + + new FirefoxDriver(firefoxOptions); + } +} diff --git a/src/test/java/openBrowser/FirefoxTest.java b/src/test/java/openBrowser/FirefoxTest.java new file mode 100644 index 0000000..a6c655a --- /dev/null +++ b/src/test/java/openBrowser/FirefoxTest.java @@ -0,0 +1,12 @@ +package openBrowser; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +public class FirefoxTest { + public static void main(String[] args) { + WebDriverManager.firefoxdriver().setup(); + WebDriver driver = new FirefoxDriver(); + } +} diff --git a/src/test/java/openBrowser/IETest.java b/src/test/java/openBrowser/IETest.java new file mode 100644 index 0000000..4d13e0e --- /dev/null +++ b/src/test/java/openBrowser/IETest.java @@ -0,0 +1,11 @@ +package openBrowser; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.ie.InternetExplorerDriver; + +public class IETest { + public static void main(String[] args) { + WebDriverManager.iedriver().setup(); + new InternetExplorerDriver(); + } +} diff --git a/src/test/java/pages/BmiPage.java b/src/test/java/pages/BmiPage.java new file mode 100644 index 0000000..93ed115 --- /dev/null +++ b/src/test/java/pages/BmiPage.java @@ -0,0 +1,47 @@ +package pages; + +import bases.BasePage; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +import static bases.Browser.*; + +public class BmiPage extends BasePage { + By metricTab = By.xpath("//a[.='Metric Units']"); + By ageTxt = By.id("cage"); + By maleRad = By.id("csex1"); + By femaleRad = By.id("csex2"); + By heightTxt = By.id("cheightmeter"); + By weightTxt = By.id("ckg"); + By calculateBtn = By.xpath("//input[@value='Calculate']"); + By clearBtn = By.className("clearbtn"); + By resultLbl = By.className("rightresult"); + + + public void open(){ + visit("https://www.calculator.net/bmi-calculator.html"); + } + + public void selectMetricTab(){ + click(metricTab); + } + public void calculate(String age,String gender,String height,String weight){ + fill(ageTxt,age); + if (gender.equalsIgnoreCase("male")){ + click(maleRad); + }else click(femaleRad); + + fill(heightTxt,height); + fill(weightTxt,weight); + click(calculateBtn); + + } + + public void clear(){ + click(clearBtn); + } + + public String getResult(){ + return getText(resultLbl); + } +} diff --git a/src/test/java/pages/FormAuthenticationPage.java b/src/test/java/pages/FormAuthenticationPage.java new file mode 100644 index 0000000..bc76fec --- /dev/null +++ b/src/test/java/pages/FormAuthenticationPage.java @@ -0,0 +1,34 @@ +package pages; + +import bases.BasePage; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; + +import static bases.Browser.*; + +public class FormAuthenticationPage extends BasePage { + + /** + * Suffix: + * txt --> text box + * btn --> button + * lbl --> label + * rad --> radio Button + * chk --> checkbox + * ..... + */ + By usernameTxt = By.id("username"); + By passwordTxt = By.id("password"); + By submitBtn = By.xpath("//*[@type='submit']"); + + public void open(){ + visit("https://the-internet.herokuapp.com/login"); + } + + public void login(String username, String password){ + fill(usernameTxt,username); + fill(passwordTxt,password); + click(submitBtn); + } +} diff --git a/src/test/java/testcases/BmiTest.java b/src/test/java/testcases/BmiTest.java new file mode 100644 index 0000000..ab13a76 --- /dev/null +++ b/src/test/java/testcases/BmiTest.java @@ -0,0 +1,50 @@ +package testcases; + +import bases.BaseTest; +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.Assert; +import org.testng.annotations.*; +import pages.BmiPage; + +public class BmiTest extends BaseTest { + BmiPage bmiPage; + @BeforeMethod + void cleanUpForm() { + bmiPage = new BmiPage(); + bmiPage.open(); + bmiPage.selectMetricTab(); + bmiPage.clear(); + } + + @DataProvider + Object[][] testdata(){ + return new Object[][]{ + new Object[]{"25" ,"male", "180" ,"65", "BMI = 20.1 kg/m2 (Normal)"}, + new Object[]{"25" ,"male", "180" ,"30", "BMI = 9.3 kg/m2 (Severe thinness)"}, + new Object[]{"25" ,"male", "180" ,"55", "BMI = 17 kg/m2 (Moderate thinness)"}, + new Object[]{"25" ,"male", "180" ,"60", "BMI = 18.5 kg/m2 (Mild thinness)"}, + new Object[]{"25" ,"male", "180" ,"85", "BMI = 26.2 kg/m2 (Overweight)"}, + new Object[]{"25" ,"male", "180" ,"100", "BMI = 30.9 kg/m2 (Obese Class I)"}, + new Object[]{"25" ,"male", "180" ,"120", "BMI = 37 kg/m2 (Obese Class II)"}, + new Object[]{"25" ,"male", "180" ,"140", "BMI = 43.2 kg/m2 (Obese Class III)"}, + new Object[]{"25" ,"female", "180" ,"65", "BMI = 20.1 kg/m2 (Normal)"}, + new Object[]{"25" ,"female", "180" ,"30", "BMI = 9.3 kg/m2 (Severe thinness)"}, + new Object[]{"25" ,"female", "180" ,"55", "BMI = 17 kg/m2 (Moderate thinness)"}, + new Object[]{"25" ,"female", "180" ,"60", "BMI = 18.5 kg/m2 (Mild thinness)"}, + new Object[]{"25" ,"female", "180" ,"85", "BMI = 26.2 kg/m2 (Overweight)"}, + new Object[]{"25" ,"female", "180" ,"100", "BMI = 30.9 kg/m2 (Obese Class I)"}, + new Object[]{"25" ,"female", "180" ,"120", "BMI = 37 kg/m2 (Obese Class II)"}, + new Object[]{"25" ,"female", "180" ,"140", "BMI = 43.2 kg/m2 (Obese Class III)"} + }; + } + + @Test(dataProvider ="testdata" ) + void tc01(String age,String gender,String height,String weight,String expected) { + bmiPage.calculate(age, gender, height, weight); + Assert.assertTrue(bmiPage.getResult().contains(expected)); + } + +} diff --git a/src/test/java/testcases/BrokenImagesTest.java b/src/test/java/testcases/BrokenImagesTest.java new file mode 100644 index 0000000..af13006 --- /dev/null +++ b/src/test/java/testcases/BrokenImagesTest.java @@ -0,0 +1,44 @@ +package testcases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.util.List; + +public class BrokenImagesTest { + WebDriver driver; + + @BeforeClass + void setUp() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + } + + @BeforeMethod + void reloadPage() { + driver.get("http://the-internet.herokuapp.com/broken_images"); + } + + @Test + void tc01() { + List images = driver.findElements(By.cssSelector("img")); + for (WebElement image : images) { + if (image.getAttribute("naturalWidth").equals("0")) { + System.out.println(image.getAttribute("outerHTML") + " is broken."); + } + } + } + + + @AfterClass + void tearDown() { + driver.quit(); + } +} diff --git a/src/test/java/testcases/CheckboxesTest.java b/src/test/java/testcases/CheckboxesTest.java new file mode 100644 index 0000000..e99faf4 --- /dev/null +++ b/src/test/java/testcases/CheckboxesTest.java @@ -0,0 +1,63 @@ +package testcases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.Assert; +import org.testng.annotations.*; + +public class CheckboxesTest { + WebDriver driver; + + @BeforeClass + void setUp() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + } + + @BeforeMethod + void reloadPage() { + driver.get("https://the-internet.herokuapp.com/checkboxes"); + } + + @Test + void theCheckboxesShouldSelected() { + WebElement checkbox1 = driver.findElement(By.xpath("//form[@id='checkboxes']/input[1]")); + check(checkbox1); + Assert.assertTrue(driver.findElement(By.xpath("//form[@id='checkboxes']/input[1]")).isSelected()); + + WebElement checkbox2 = driver.findElement(By.xpath("//form[@id='checkboxes']/input[2]")); + check(checkbox2); + Assert.assertTrue(driver.findElement(By.xpath("//form[@id='checkboxes']/input[2]")).isSelected()); + } + + @Test + void theCheckboxesShouldDeSelected() { + WebElement checkbox1 = driver.findElement(By.xpath("//form[@id='checkboxes']/input[1]")); + uncheck(checkbox1); + Assert.assertFalse(driver.findElement(By.xpath("//form[@id='checkboxes']/input[1]")).isSelected()); + + WebElement checkbox2 = driver.findElement(By.xpath("//form[@id='checkboxes']/input[2]")); + uncheck(checkbox2); + Assert.assertFalse(driver.findElement(By.xpath("//form[@id='checkboxes']/input[2]")).isSelected()); + } + + @AfterClass + void tearDown() { + driver.quit(); + } + + void check(WebElement checkbox) { + if (!checkbox.isSelected()) { + checkbox.click(); + } + } + + void uncheck(WebElement checkbox) { + if (checkbox.isSelected()) { + checkbox.click(); + } + } +} diff --git a/src/test/java/testcases/ContextMenuTest.java b/src/test/java/testcases/ContextMenuTest.java new file mode 100644 index 0000000..d046a3a --- /dev/null +++ b/src/test/java/testcases/ContextMenuTest.java @@ -0,0 +1,43 @@ +package testcases; + +import bases.BaseTest; +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static bases.Browser.getDriver; + +public class ContextMenuTest extends BaseTest { + Actions mouse; + WebDriverWait wait; + + @BeforeMethod + void load() { + WebDriverManager.chromedriver().setup(); + mouse = new Actions(getDriver()); + wait = new WebDriverWait(getDriver(), 10); + } + + @Test + void shouldJSAlertPopupAppear(){ + WebElement rectangle = getDriver().findElement(By.id("hot-spot")); + mouse.contextClick(rectangle).perform(); + + Alert alert = wait.until(ExpectedConditions.alertIsPresent()); + Assert.assertEquals(alert.getText(),"You selected a context menu"); + alert.accept(); + } + + +} diff --git a/src/test/java/testcases/DatePicker.java b/src/test/java/testcases/DatePicker.java new file mode 100644 index 0000000..913f5f6 --- /dev/null +++ b/src/test/java/testcases/DatePicker.java @@ -0,0 +1,52 @@ +package testcases; + +import helper.DateUtils; +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.util.List; + +public class DatePicker { + WebDriver driver; + WebDriverWait wait; + + + @BeforeClass + void setUp() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + wait = new WebDriverWait(driver, 10); + } + + @Test + void ticketPage(){ + driver.get("https://www.vietnamairlines.com/vn/en/home"); + //Accept cookie footer pop up + wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.id("cookie-agree"))).get(0).click(); + // select depart date + driver.findElement(By.id("roundtrip-date-depart")).click(); + WebElement dateWidgetFrom = wait.until( + ExpectedConditions.visibilityOfAllElementsLocatedBy(By.className("ui-datepicker-calendar"))).get(0); + + // This are the columns of the from date picker table + List columns = dateWidgetFrom.findElements(By.tagName("td")); + DateUtils.clickGivenDay(columns, DateUtils.getCurrentDay()); + //close date pickper + driver.findElement(By.className("ui-datepicker-close")).click(); + + } + + @AfterClass + void tearDown() { + driver.quit(); + } + +} diff --git a/src/test/java/testcases/DragDropTest.java b/src/test/java/testcases/DragDropTest.java new file mode 100644 index 0000000..9981457 --- /dev/null +++ b/src/test/java/testcases/DragDropTest.java @@ -0,0 +1,24 @@ +package testcases; + +import bases.BaseTest; +import bases.Browser; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class DragDropTest extends BaseTest { + @BeforeMethod + void init(){ + Browser.visit("https://the-internet.herokuapp.com/drag_and_drop"); + } + + @Test + void action(){ + WebElement rectangleA = Browser.find(By.id("column-a")); + WebElement rectangleB = Browser.find(By.id("column-b")); + Browser.mouse.clickAndHold(rectangleA) + .moveToElement(rectangleB).perform(); + }; +} diff --git a/src/test/java/testcases/DropDownTest.java b/src/test/java/testcases/DropDownTest.java new file mode 100644 index 0000000..991b3cd --- /dev/null +++ b/src/test/java/testcases/DropDownTest.java @@ -0,0 +1,30 @@ +package testcases; + +import bases.BaseTest; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.Select; +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static bases.Browser.getDriver; + +public class DropDownTest extends BaseTest { + + @BeforeMethod + void load(){ + getDriver().get("https://the-internet.herokuapp.com/dropdown"); + } + @Test + void option1ShouldSelected(){ + WebElement select = getDriver().findElement(By.id("dropdown")); + Select dropdown = new Select(select); + + dropdown.selectByVisibleText("Option 1"); // text() + + Assert.assertTrue(getDriver().findElement(By.xpath("//select[@id='dropdown']/option[.='Option 1']")).isSelected());// text() + Assert.assertTrue(getDriver().findElement(By.xpath("//select[@id='dropdown']/option[text()='Option 1']")).isSelected());// text() + } + +} diff --git a/src/test/java/testcases/FormAuthenticationTest.java b/src/test/java/testcases/FormAuthenticationTest.java new file mode 100644 index 0000000..e49ad3e --- /dev/null +++ b/src/test/java/testcases/FormAuthenticationTest.java @@ -0,0 +1,43 @@ +package testcases; + +import bases.BaseTest; +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import pages.FormAuthenticationPage; + +import static bases.Browser.getDriver; + +public class FormAuthenticationTest extends BaseTest { + + FormAuthenticationPage formAuthenticationPage; + + + @BeforeMethod(alwaysRun = true) + void load() { + formAuthenticationPage = new FormAuthenticationPage(); + formAuthenticationPage.open(); + } + + + @Test(groups = {"smoke"}) + void validCredential() { + formAuthenticationPage.login("tomsmith", "SuperSecretPassword!"); + Assert.assertEquals(getDriver().getCurrentUrl(), "https://the-internet.herokuapp.com/secure"); + Assert.assertTrue(getDriver().findElement(By.id("flash-messages")).isDisplayed()); //You logged into a secure area! + } + + @Test + void invalidCredential() { + formAuthenticationPage.login("tomsmith", "SuperSecretPassword"); + Assert.assertEquals(getDriver().getCurrentUrl(), "https://the-internet.herokuapp.com/login"); + Assert.assertTrue(getDriver().findElement(By.className("error")).isDisplayed()); + } + +} diff --git a/src/test/java/testcases/HoverTest.java b/src/test/java/testcases/HoverTest.java new file mode 100644 index 0000000..14dd4b9 --- /dev/null +++ b/src/test/java/testcases/HoverTest.java @@ -0,0 +1,45 @@ +package testcases; + +import bases.BaseTest; +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.interactions.Actions; +import org.testng.Assert; +import org.testng.annotations.*; + +import static bases.Browser.getDriver; + +public class HoverTest extends BaseTest { + Actions mouse; + + @BeforeMethod + void load() { + getDriver().get("https://the-internet.herokuapp.com/hovers"); + mouse = new Actions(getDriver()); + } + + @DataProvider + Object[][] avatar() { + return new Object[][]{ + new Object[]{0, "name: user1"}, + new Object[]{1, "name: user2"}, + new Object[]{2, "name: user3"}, + }; + } + + @Test(dataProvider = "avatar") + void avatarCaption(int personIndex, String caption) { + WebElement person1 = getDriver().findElements(By.className("figure")).get(personIndex); + mouse.moveToElement(person1).perform(); // --> hover + + WebElement person1Caption = person1 + .findElement(By.className("figcaption")) + .findElement(By.tagName("h5")); + + Assert.assertEquals(person1Caption.getText(), caption); + } + +} diff --git a/src/test/java/testcases/HyperLinkTest.java b/src/test/java/testcases/HyperLinkTest.java new file mode 100644 index 0000000..61df5ac --- /dev/null +++ b/src/test/java/testcases/HyperLinkTest.java @@ -0,0 +1,41 @@ +package testcases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class HyperLinkTest { + + @Test + void redirector(){ + WebDriverManager.chromedriver().setup(); + WebDriver driver = new ChromeDriver(); + driver.get("https://the-internet.herokuapp.com/redirector"); + + driver.findElement(By.linkText("here")).click();// <---- + Assert.assertEquals(driver.getCurrentUrl(),"https://the-internet.herokuapp.com/status_codes"); + + driver.findElement(By.linkText("200")).click(); + Assert.assertEquals(driver.getCurrentUrl(),"https://the-internet.herokuapp.com/status_codes/200"); + String content = driver.findElement(By.id("content")).getText(); + Assert.assertTrue(content.contains("This page returned a 200 status code.")); + driver.findElement(By.linkText("here")).click(); + + driver.findElement(By.linkText("301")).click(); + Assert.assertEquals(driver.getCurrentUrl(),"https://the-internet.herokuapp.com/status_codes/301"); + driver.findElement(By.linkText("here")).click(); + + driver.findElement(By.linkText("404")).click(); + Assert.assertEquals(driver.getCurrentUrl(),"https://the-internet.herokuapp.com/status_codes/404"); + driver.findElement(By.linkText("here")).click(); + + driver.findElement(By.linkText("500")).click(); + Assert.assertEquals(driver.getCurrentUrl(),"https://the-internet.herokuapp.com/status_codes/500"); + driver.findElement(By.linkText("here")).click(); + + driver.quit(); + } +} diff --git a/src/test/java/testcases/JavaScriptAlertTest.java b/src/test/java/testcases/JavaScriptAlertTest.java new file mode 100644 index 0000000..447a328 --- /dev/null +++ b/src/test/java/testcases/JavaScriptAlertTest.java @@ -0,0 +1,64 @@ +package testcases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class JavaScriptAlertTest { + WebDriver driver; + + @BeforeClass(alwaysRun = true) + void setUp() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + driver.get("https://the-internet.herokuapp.com/javascript_alerts"); + } + + @Test + void clickForJSAlert(){ + driver.findElement(By.xpath("//button[.='Click for JS Alert']")).click(); + driver.switchTo().alert().accept(); // ~ click on OK button on alert popup + + String result = driver.findElement(By.id("result")).getText(); + Assert.assertEquals(result,"You successfully clicked an alert"); + } + + @Test(groups = {"smoke"}) + void dismissForJsConfirm(){ + driver.findElement(By.xpath("//button[.='Click for JS Confirm']")).click(); + driver.switchTo().alert().dismiss(); // ~ click on Cancel button on alert popup + + String result = driver.findElement(By.id("result")).getText(); + Assert.assertEquals(result,"You clicked: Cancel"); + } + + @Test + void acceptForJsConfirm(){ + driver.findElement(By.xpath("//button[.='Click for JS Confirm']")).click(); + driver.switchTo().alert().accept(); // ~ click on Cancel button on alert popup + + String result = driver.findElement(By.id("result")).getText(); + Assert.assertEquals(result,"You clicked: Ok"); + } + + @Test + void clickForJsPrompt(){ + driver.findElement(By.xpath("//button[.='Click for JS Prompt']")).click(); + + driver.switchTo().alert().sendKeys("hello"); + driver.switchTo().alert().accept(); + + String result = driver.findElement(By.id("result")).getText(); + Assert.assertEquals(result,"You entered: hello"); + } + + @AfterClass + void tearDown(){ + driver.quit(); + } +} diff --git a/src/test/java/testcases/NestFramesTest.java b/src/test/java/testcases/NestFramesTest.java new file mode 100644 index 0000000..5598912 --- /dev/null +++ b/src/test/java/testcases/NestFramesTest.java @@ -0,0 +1,51 @@ +package testcases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class NestFramesTest { + WebDriver driver; + + @BeforeClass + void setUp() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + driver.get("https://the-internet.herokuapp.com/nested_frames"); //original page + } + + @Test + void listAllFrames(){ + driver.switchTo().frame("frame-top"); // is frame-top + + driver.switchTo().frame("frame-left"); // is frame-left + String leftFrame = driver.findElement(By.xpath("html/body")).getText(); + Assert.assertEquals(leftFrame,"LEFT"); + driver.switchTo().parentFrame();// back to parent is frame-top + + driver.switchTo().frame("frame-middle"); + String middleFrame = driver.findElement(By.id("content")).getText(); + Assert.assertEquals(middleFrame,"MIDDLE"); + driver.switchTo().parentFrame(); // back to parent is frame-top + + driver.switchTo().frame("frame-right"); + String rightFrame = driver.findElement(By.xpath("html/body")).getText(); + Assert.assertEquals(rightFrame,"RIGHT"); + driver.switchTo().parentFrame();// back to parent is frame-top + + driver.switchTo().parentFrame();// back to parent is original page + driver.switchTo().frame("frame-bottom"); + String bottomFrame = driver.findElement(By.xpath("html/body")).getText(); + Assert.assertEquals(bottomFrame,"BOTTOM"); + } + + @AfterClass + void tearDown(){ + driver.quit(); + } +} \ No newline at end of file diff --git a/src/test/java/testcases/TableTest.java b/src/test/java/testcases/TableTest.java new file mode 100644 index 0000000..9d9814f --- /dev/null +++ b/src/test/java/testcases/TableTest.java @@ -0,0 +1,72 @@ +package testcases; + +import io.github.bonigarcia.wdm.WebDriverManager; +import model.Person; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.util.Comparator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; + +public class TableTest { + WebDriver driver; + List persons; + @BeforeClass + void setup(){ + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + driver.get("https://the-internet.herokuapp.com/tables"); + List rows = driver.findElements(By.xpath("//table[@id='table1']/tbody/tr")); + + persons = rows.stream() + .map(this::toPerson).collect(Collectors.toList()); + + } + + @Test + void largestDuePerson(){ + Person largestDuePerson = persons + .stream() + .max(Comparator.comparing(Person::getDue)) + .orElseThrow(NoSuchElementException::new); + + Assert.assertEquals(String.format("%s %s", largestDuePerson.getLastName(), largestDuePerson.getFirstName()), "Jason Doe"); + } + + @Test + void smallestDuePerson(){ + Person smallestDuePerson = persons + .stream() + .min(Comparator.comparing(Person::getDue)) + .orElseThrow(NoSuchElementException::new); + + Assert.assertEquals(String.format("%s %s", smallestDuePerson.getLastName(), smallestDuePerson.getFirstName()), "Jason Doe"); + } + + /** + * element is a row in table + * @param element + * @return + */ + private Person toPerson(WebElement element) { + String lastName = element.findElements(By.tagName("td")).get(0).getText(); + String firstname = element.findElements(By.tagName("td")).get(1).getText(); + String email = element.findElements(By.tagName("td")).get(2).getText(); + float due = Float.parseFloat(element.findElements(By.tagName("td")).get(3).getText().trim().replace("$", "")); + String website = element.findElements(By.tagName("td")).get(4).getText(); + return new Person(firstname, lastName, email, website, due); + } + + @AfterClass + void tearDown(){ + driver.quit(); + } +} diff --git a/src/test/java/testcases/TodoTest.java b/src/test/java/testcases/TodoTest.java new file mode 100644 index 0000000..d3a8f0e --- /dev/null +++ b/src/test/java/testcases/TodoTest.java @@ -0,0 +1,38 @@ +package testcases; + +import bases.BaseTest; +import bases.Browser; +import org.openqa.selenium.By; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class TodoTest extends BaseTest { + @BeforeClass + void navigate(){ + Browser.visit("https://todomvc.com/examples/vanillajs"); + } + + @Test + void addNewTodo(){ + Browser.fill(By.className("new-todo"),"task1\n"); + Assert.assertTrue(Browser.isDisplayed(By.xpath("//label[.='task1']"))); + } + + @Test + void markCompleted(){ + Browser.click(By.xpath("//label[.='task1']/../input[@class='toggle']")); +// Browser.click(By.xpath("//label[.='task1']/preceding-sibling::input[@class='toggle']")); + Browser.click(By.linkText("Completed")); + Assert.assertTrue(Browser.isDisplayed(By.xpath("//label[.='task1']"))); + } + + @Test + void deleteCompleted(){ + Browser.fill(By.className("new-todo"),"task1\n"); + Browser.hover(By.xpath("//label[.='task1']")); + Browser.click(By.xpath("//label[.='task1']/../button[@class='destroy']")); +// Browser.click(By.xpath("//label[.='task1']/following-sibling::button")); + Assert.assertTrue(Browser.count(By.xpath("//label[.='task1']"))==0); + } +} \ No newline at end of file