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