From c3bb40338e8b8ae107c1fc11602cfd872c8732b4 Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 15:26:32 +0100 Subject: [PATCH 01/12] Apply POM to GettingStarted --- src/pages/webdriver/GettingStartedPage.java | 18 ++++++++++++++++++ .../webdriver/GettingStartedTests.java} | 11 +++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 src/pages/webdriver/GettingStartedPage.java rename src/{webdriver/GettingStarted.java => tests/webdriver/GettingStartedTests.java} (82%) diff --git a/src/pages/webdriver/GettingStartedPage.java b/src/pages/webdriver/GettingStartedPage.java new file mode 100644 index 0000000..c31e675 --- /dev/null +++ b/src/pages/webdriver/GettingStartedPage.java @@ -0,0 +1,18 @@ +package pages.webdriver; + +import org.openqa.selenium.WebDriver; + +public class GettingStartedPage +{ + private WebDriver driver = null; + + public GettingStartedPage(WebDriver driver) + { + this.driver = driver; + } + + public String getTitle() + { + return this.driver.getTitle(); + } +} diff --git a/src/webdriver/GettingStarted.java b/src/tests/webdriver/GettingStartedTests.java similarity index 82% rename from src/webdriver/GettingStarted.java rename to src/tests/webdriver/GettingStartedTests.java index eb01b8f..d5a33f5 100644 --- a/src/webdriver/GettingStarted.java +++ b/src/tests/webdriver/GettingStartedTests.java @@ -1,9 +1,11 @@ -package webdriver; +package tests.webdriver; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; -public class GettingStarted +import pages.webdriver.GettingStartedPage; + +public class GettingStartedTests { public static void main(String[] args) { @@ -20,7 +22,8 @@ public class GettingStarted // 4. Interact with WebElements. // When testing on a web page we want to make sure that something in it matches an expected value. // For example, this tests that the title of the web page is what we expect: - String actual = driver.getTitle(); + GettingStartedPage page = new GettingStartedPage(driver); + String actual = page.getTitle(); String expected = "ramoncaballero.dev - Selenium Playground"; assert actual.equals(expected); @@ -29,4 +32,4 @@ public class GettingStarted // 5. End the session: driver.quit(); } -} \ No newline at end of file +} From 7d4096225ac04020fb23d7d085a0da54e9091d3b Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 15:27:50 +0100 Subject: [PATCH 02/12] Apply POM to MostCommonInputs --- src/pages/webelements/ModalDialogPage.java | 26 +++++ .../webelements/MostCommonInputsPage.java | 98 +++++++++++++++++++ .../webelements/MostCommonInputsTests.java | 54 ++++++++++ src/webelements/MostCommonInputs.java | 79 --------------- 4 files changed, 178 insertions(+), 79 deletions(-) create mode 100644 src/pages/webelements/ModalDialogPage.java create mode 100644 src/pages/webelements/MostCommonInputsPage.java create mode 100644 src/tests/webelements/MostCommonInputsTests.java delete mode 100644 src/webelements/MostCommonInputs.java diff --git a/src/pages/webelements/ModalDialogPage.java b/src/pages/webelements/ModalDialogPage.java new file mode 100644 index 0000000..9d6d538 --- /dev/null +++ b/src/pages/webelements/ModalDialogPage.java @@ -0,0 +1,26 @@ +package pages.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.How; +import org.openqa.selenium.support.PageFactory; + +public class ModalDialogPage +{ + @FindBy(how = How.ID, using = "form-interactions-modal-close-button") + private WebElement closeButton; + + private WebDriver driver = null; + + public ModalDialogPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void close() + { + closeButton.click(); + } +} diff --git a/src/pages/webelements/MostCommonInputsPage.java b/src/pages/webelements/MostCommonInputsPage.java new file mode 100644 index 0000000..f51238b --- /dev/null +++ b/src/pages/webelements/MostCommonInputsPage.java @@ -0,0 +1,98 @@ +package pages.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class MostCommonInputsPage +{ + @FindBy(xpath = "//button[contains(text(),'Most Common Inputs')]") + private WebElement accordionItem; + + @FindBy(id = "text-input") + private WebElement textInput; + + @FindBy(id = "readonly-input") + private WebElement readonlyInput; + + @FindBy(id = "email-input") + private WebElement emailInput; + + @FindBy(id = "password-input") + private WebElement passwordInput; + + @FindBy(id = "textarea") + private WebElement textarea; + + @FindBy(id = "form-interactions-reset-button") + private WebElement resetButton; + + @FindBy(id = "form-interactions-submit-button") + private WebElement submitButton; + + private WebDriver driver = null; + + public MostCommonInputsPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void setText(String text) + { + textInput.sendKeys(text); + } + + public void setEmail(String text) + { + emailInput.sendKeys(text); + } + + public void setPassword(String text) + { + passwordInput.sendKeys(text); + } + + public void setTextarea(String text) + { + textarea.sendKeys(text); + } + + public void clearText() + { + textInput.clear(); + } + + public void reset() + { + resetButton.click(); + } + + public void submit() + { + submitButton.click(); + } + + public String getReadonlyValue() + { + return readonlyInput.getAttribute("value"); + } + + public void sleep(long millis) + { + try + { + Thread.sleep(millis); + } catch (InterruptedException e) + { + e.printStackTrace(); + } + + } +} diff --git a/src/tests/webelements/MostCommonInputsTests.java b/src/tests/webelements/MostCommonInputsTests.java new file mode 100644 index 0000000..0a82a4b --- /dev/null +++ b/src/tests/webelements/MostCommonInputsTests.java @@ -0,0 +1,54 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.ModalDialogPage; +import pages.webelements.MostCommonInputsPage; + +public class MostCommonInputsTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + MostCommonInputsPage page = new MostCommonInputsPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + page.setText("Selenium WebDriver"); + page.setEmail("hello@ramoncaballero.dev"); + page.setPassword("YouDontNeedToKnowThis"); + page.setTextarea("This is a textarea and I can write inside it."); + + page.clearText(); + page.setText("Interacting with WebElements"); + + page.reset(); + + page.setText("Interacting with WebElements with Selenium WebDriver"); + page.setEmail("hello@example.com"); + page.setPassword("YouMustNotKnowThis"); + page.setTextarea("Let's try to write something again."); + + page.submit(); + + page.sleep(500); + ModalDialogPage modal = new ModalDialogPage(driver); + modal.close(); + + System.out.println("The read-only input text says '" + page.getReadonlyValue() + "'"); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/webelements/MostCommonInputs.java b/src/webelements/MostCommonInputs.java deleted file mode 100644 index 1ef0062..0000000 --- a/src/webelements/MostCommonInputs.java +++ /dev/null @@ -1,79 +0,0 @@ -package webelements; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; - -public class MostCommonInputs -{ - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the 'Most Common Inputs' accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Most Common Inputs')]")).click(); - - // Text input: - WebElement textInput = driver.findElement(By.id("text-input")); - textInput.sendKeys("Selenium WebDriver"); - - // Read-only input: - WebElement readonlyInput = driver.findElement(By.id("readonly-input")); - String readonlyText = readonlyInput.getAttribute("value"); - System.out.println("The read-only input text says '" + readonlyText + "'"); - - // Email input: - WebElement emailInput = driver.findElement(By.id("email-input")); - emailInput.sendKeys("hello@ramoncaballero.dev"); - - // Password input: - WebElement passwordInput = driver.findElement(By.id("password-input")); - passwordInput.sendKeys("YouDontNeedToKnowThis"); - - // Textarea: - WebElement textarea = driver.findElement(By.id("textarea")); - textarea.sendKeys("This is a textarea and I can write inside it."); - - // Clear text input and write something else: - textInput.clear(); - textInput.sendKeys("Interacting with WebElements"); - - // Click Reset button: - driver.findElement(By.id("form-interactions-reset-button")).click(); - - // Write again on the fields (no need to find the elements as we already have them!): - textInput.sendKeys("Interacting with WebElements with Selenium WebDriver"); - emailInput.sendKeys("hello@example.com"); - passwordInput.sendKeys("YouMustNotKnowThis"); - textarea.sendKeys("Let's try to write something again."); - - // Click Submit button: - WebElement submitButton = driver.findElement(By.id("form-interactions-submit-button")); - submitButton.click(); - - // The modal dialog might take a few milliseconds to appear, so let's wait in a simple way: - try - { - Thread.sleep(500); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - - // Close the modal dialog: - driver.findElement(By.id("form-interactions-modal-close-button")).click(); - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From 92d6619c5ec0451143d0de8a9a6b9bcfa4374c76 Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 15:28:32 +0100 Subject: [PATCH 03/12] Apply POM to InputsWithUIDialogs --- .../webelements/InputsWithUIDialogsPage.java | 43 +++++++++++++++++++ .../webelements/InputsWithUIDialogsTests.java | 33 ++++++++++++++ src/webelements/InputsWithUIDialogs.java | 37 ---------------- 3 files changed, 76 insertions(+), 37 deletions(-) create mode 100644 src/pages/webelements/InputsWithUIDialogsPage.java create mode 100644 src/tests/webelements/InputsWithUIDialogsTests.java delete mode 100644 src/webelements/InputsWithUIDialogs.java diff --git a/src/pages/webelements/InputsWithUIDialogsPage.java b/src/pages/webelements/InputsWithUIDialogsPage.java new file mode 100644 index 0000000..89f76d4 --- /dev/null +++ b/src/pages/webelements/InputsWithUIDialogsPage.java @@ -0,0 +1,43 @@ +package pages.webelements; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class InputsWithUIDialogsPage +{ + @FindBy(xpath = "//button[contains(text(),'Inputs With UI Dialogs')]") + private WebElement accordionItem; + + @FindBy(id = "color-input") + private WebElement colorInput; + + @FindBy(id = "file-input") + private WebElement fileInput; + + private WebDriver driver = null; + + public InputsWithUIDialogsPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void setColor(String color) + { + JavascriptExecutor js = (JavascriptExecutor) driver; + js.executeScript("arguments[0].value = arguments[1];", colorInput, color); + } + + public void setFile(String text) + { + fileInput.sendKeys(text); + } +} diff --git a/src/tests/webelements/InputsWithUIDialogsTests.java b/src/tests/webelements/InputsWithUIDialogsTests.java new file mode 100644 index 0000000..c868385 --- /dev/null +++ b/src/tests/webelements/InputsWithUIDialogsTests.java @@ -0,0 +1,33 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.InputsWithUIDialogsPage; + +public class InputsWithUIDialogsTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + InputsWithUIDialogsPage page = new InputsWithUIDialogsPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + page.setColor("#FF0000"); + page.setFile("/home/mon/empty.txt"); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/webelements/InputsWithUIDialogs.java b/src/webelements/InputsWithUIDialogs.java deleted file mode 100644 index dc7250f..0000000 --- a/src/webelements/InputsWithUIDialogs.java +++ /dev/null @@ -1,37 +0,0 @@ -package webelements; - -import org.openqa.selenium.By; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; - -public class InputsWithUIDialogs -{ - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the 'Inputs With UI Dialogs' accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Inputs With UI Dialogs')]")).click(); - - // Color input: - JavascriptExecutor js = (JavascriptExecutor) driver; - js.executeScript("document.getElementById('color-input').value = '#000000';"); - - // File input: - WebElement fileInput = driver.findElement(By.id("file-input")); - fileInput.sendKeys("/etc/legal"); - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From c4da04e4de2d4ccd18a1c3fe9750e9147b7bd5bd Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 15:49:37 +0100 Subject: [PATCH 04/12] Apply POM to CheckboxesAndRadioButtons --- .../CheckboxesAndRadioButtonsPage.java | 70 +++++++++++++++++++ .../CheckboxesAndRadioButtonsTests.java | 33 +++++++++ .../CheckboxesAndRadioButtons.java | 48 ------------- 3 files changed, 103 insertions(+), 48 deletions(-) create mode 100644 src/pages/webelements/CheckboxesAndRadioButtonsPage.java create mode 100644 src/tests/webelements/CheckboxesAndRadioButtonsTests.java delete mode 100644 src/webelements/CheckboxesAndRadioButtons.java diff --git a/src/pages/webelements/CheckboxesAndRadioButtonsPage.java b/src/pages/webelements/CheckboxesAndRadioButtonsPage.java new file mode 100644 index 0000000..f8ca5e3 --- /dev/null +++ b/src/pages/webelements/CheckboxesAndRadioButtonsPage.java @@ -0,0 +1,70 @@ +package pages.webelements; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class CheckboxesAndRadioButtonsPage +{ + @FindBy(xpath = "//button[contains(text(),'Checkboxes and Radio Buttons')]") + private WebElement accordionItem; + + @FindBy(xpath = "//div[@id='checkboxes']//input") + private List checkboxes; + + @FindBy(xpath = "//div[@id='radiobuttons']//input") + private List radioButtons; + + private WebDriver driver = null; + + public CheckboxesAndRadioButtonsPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void selectRandomCheckboxes(int howMany) + { + // Collections.shuffle(checkboxes) is not modifying 'checkboxes' !? + // So I shuffle a list of indices instead... + + List indices = new ArrayList<>(); + for (int i = 0; i < checkboxes.size(); i++) + { + indices.add(i); + } + + Collections.shuffle(indices); + + for (int i = 0; i < howMany; i++) + { + checkboxes.get(indices.get(i)).click(); + } + } + + public void selectRandomRadioButton() + { + // Collections.shuffle(radioButtons) is not modifying 'radioButtons' !? + // So I shuffle a list of indices instead... + + List indices = new ArrayList<>(); + for (int i = 0; i < radioButtons.size(); i++) + { + indices.add(i); + } + + Collections.shuffle(indices); + + radioButtons.get(indices.get(0)).click(); + } +} diff --git a/src/tests/webelements/CheckboxesAndRadioButtonsTests.java b/src/tests/webelements/CheckboxesAndRadioButtonsTests.java new file mode 100644 index 0000000..9621044 --- /dev/null +++ b/src/tests/webelements/CheckboxesAndRadioButtonsTests.java @@ -0,0 +1,33 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.CheckboxesAndRadioButtonsPage; + +public class CheckboxesAndRadioButtonsTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + CheckboxesAndRadioButtonsPage page = new CheckboxesAndRadioButtonsPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + page.selectRandomCheckboxes(3); + page.selectRandomRadioButton(); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/webelements/CheckboxesAndRadioButtons.java b/src/webelements/CheckboxesAndRadioButtons.java deleted file mode 100644 index ed124a7..0000000 --- a/src/webelements/CheckboxesAndRadioButtons.java +++ /dev/null @@ -1,48 +0,0 @@ -package webelements; - -import java.util.Collections; -import java.util.List; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; - -public class CheckboxesAndRadioButtons -{ - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the 'Checkboxes and Radio Buttons' accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Checkboxes and Radio Buttons')]")).click(); - - // Get checkboxes and radio buttons by XPath: - List checkboxes = driver.findElements(By.xpath("//div[@id='checkboxes']//input")); - List radioButtons = driver.findElements(By.xpath("//div[@id='radiobuttons']//input")); - - // Shuffle the lists to get random order: - Collections.shuffle(checkboxes); - Collections.shuffle(radioButtons); - - // Click on the first 3 checkboxes: - for (int i = 0; i < 3; i++) - { - checkboxes.get(i).click(); - } - - // Click on the first radio button: - radioButtons.get(0).click(); - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From 9f8210bf75ba50cb3b9863a50f6baf1f5f541b4d Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 15:52:25 +0100 Subject: [PATCH 05/12] Apply POM to InputRange --- src/pages/webelements/InputRangePage.java | 42 ++++++++++++++++++++++ src/tests/webelements/InputRangeTests.java | 33 +++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/pages/webelements/InputRangePage.java create mode 100644 src/tests/webelements/InputRangeTests.java diff --git a/src/pages/webelements/InputRangePage.java b/src/pages/webelements/InputRangePage.java new file mode 100644 index 0000000..6cfe543 --- /dev/null +++ b/src/pages/webelements/InputRangePage.java @@ -0,0 +1,42 @@ +package pages.webelements; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class InputRangePage +{ + @FindBy(xpath = "//button[contains(text(),'Input Range')]") + private WebElement accordionItem; + + @FindBy(id = "range-input") + private WebElement rangeInput; + + private WebDriver driver; + + public InputRangePage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void setRangeInputValue(int value) + { + JavascriptExecutor js = (JavascriptExecutor) driver; + js.executeScript("arguments[0].value = arguments[1];", rangeInput, value); + } + + public void dragAndDropRangeInputBy(int x, int y) + { + Actions move = new Actions(driver); + move.dragAndDropBy(rangeInput, x, y).build().perform(); + } +} diff --git a/src/tests/webelements/InputRangeTests.java b/src/tests/webelements/InputRangeTests.java new file mode 100644 index 0000000..47f4bc0 --- /dev/null +++ b/src/tests/webelements/InputRangeTests.java @@ -0,0 +1,33 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.InputRangePage; + +public class InputRangeTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + InputRangePage page = new InputRangePage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + page.setRangeInputValue(0); + page.dragAndDropRangeInputBy(100, 0); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} From 702348b16ac6512d90cbe9e2a6958ac015e806fc Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 15:56:51 +0100 Subject: [PATCH 06/12] Apply POM to SelectDatalistAndOptions --- .../SelectDatalistAndOptionsPage.java | 58 +++++++++++++++++++ .../SelectDatalistAndOptionsTests.java | 34 +++++++++++ src/webelements/SelectDatalistAndOptions.java | 52 ----------------- 3 files changed, 92 insertions(+), 52 deletions(-) create mode 100644 src/pages/webelements/SelectDatalistAndOptionsPage.java create mode 100644 src/tests/webelements/SelectDatalistAndOptionsTests.java delete mode 100644 src/webelements/SelectDatalistAndOptions.java diff --git a/src/pages/webelements/SelectDatalistAndOptionsPage.java b/src/pages/webelements/SelectDatalistAndOptionsPage.java new file mode 100644 index 0000000..641f75a --- /dev/null +++ b/src/pages/webelements/SelectDatalistAndOptionsPage.java @@ -0,0 +1,58 @@ +package pages.webelements; + +import java.util.Collections; +import java.util.List; + +import org.openqa.selenium.Keys; +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.Select; + +public class SelectDatalistAndOptionsPage +{ + @FindBy(xpath = "//button[contains(text(),'Select, Datalist and Options')]") + private WebElement accordionItem; + + @FindBy(id = "select") + private WebElement selectElement; + + @FindBy(id = "datalist-input") + private WebElement datalistElement; + + Select select = null; + List selectOptions = null; + + private WebDriver driver; + + public SelectDatalistAndOptionsPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + + select = new Select(selectElement); + + // Take the options and remove the 1st option so it cannot be selected: + selectOptions = select.getOptions(); + selectOptions.remove(0); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void selectRandomOption() + { + // Shuffle the options to get a random order and select the 1st one: + Collections.shuffle(selectOptions); + select.selectByVisibleText(selectOptions.get(0).getText()); + } + + public void selectFromDatalist(String text) + { + datalistElement.sendKeys(text); + datalistElement.sendKeys(Keys.RETURN); + } +} diff --git a/src/tests/webelements/SelectDatalistAndOptionsTests.java b/src/tests/webelements/SelectDatalistAndOptionsTests.java new file mode 100644 index 0000000..7f01ef5 --- /dev/null +++ b/src/tests/webelements/SelectDatalistAndOptionsTests.java @@ -0,0 +1,34 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.SelectDatalistAndOptionsPage; + +public class SelectDatalistAndOptionsTests +{ + + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + SelectDatalistAndOptionsPage page = new SelectDatalistAndOptionsPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + page.selectRandomOption(); + page.selectFromDatalist("Batman"); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/webelements/SelectDatalistAndOptions.java b/src/webelements/SelectDatalistAndOptions.java deleted file mode 100644 index 8256a11..0000000 --- a/src/webelements/SelectDatalistAndOptions.java +++ /dev/null @@ -1,52 +0,0 @@ -package webelements; - -import java.util.Collections; -import java.util.List; - -import org.openqa.selenium.By; -import org.openqa.selenium.Keys; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.support.ui.Select; - -public class SelectDatalistAndOptions -{ - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the 'Select, Datalist and Options' accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Select, Datalist and Options')]")).click(); - - // Initialize a Select object with the HTML select: - WebElement selectElement = driver.findElement(By.id("select")); - Select select = new Select(selectElement); - - // Take the options and remove the 1st option - // (that option cannot be selected as it disappears when another one is selected): - List selectOptions = select.getOptions(); - selectOptions.remove(0); - - // Shuffle the options to get a random order and select the 1st one: - Collections.shuffle(selectOptions); - select.selectByVisibleText(selectOptions.get(0).getText()); - - // - - WebElement datalistElement = driver.findElement(By.id("datalist-input")); - datalistElement.sendKeys("Batman"); - datalistElement.sendKeys(Keys.RETURN); - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From c018aee877cd7583506c61afb4e4ff4b538a23dd Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 17:37:23 +0100 Subject: [PATCH 07/12] Apply POM to Tables --- src/pages/webelements/TablesPage.java | 57 ++++++++++++++++++++++++++ src/tests/webelements/TablesTests.java | 33 +++++++++++++++ src/webelements/Tables.java | 52 ----------------------- 3 files changed, 90 insertions(+), 52 deletions(-) create mode 100644 src/pages/webelements/TablesPage.java create mode 100644 src/tests/webelements/TablesTests.java delete mode 100644 src/webelements/Tables.java diff --git a/src/pages/webelements/TablesPage.java b/src/pages/webelements/TablesPage.java new file mode 100644 index 0000000..a0d7876 --- /dev/null +++ b/src/pages/webelements/TablesPage.java @@ -0,0 +1,57 @@ +package pages.webelements; + +import java.util.List; +import java.util.stream.Collectors; + +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; + +public class TablesPage +{ + @FindBy(xpath = "//button[contains(text(),'Tables')]") + private WebElement accordionItem; + + @FindBy(xpath = ".//table[@id='products-batman']/descendant::*/tr") + private List rows; + + List headerRow; + + private WebDriver driver = null; + + public TablesPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + + // Take the cells of the 1st row (header row): + headerRow = rows.remove(0).findElements(By.xpath("th")); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public String batmanProductsTableHeaderAsString() + { + return headerRow.stream().map(WebElement::getText).collect(Collectors.joining(", ")); + } + + public String batmanProductsTableRowsAsString() + { + String rowsAsString = ""; + + for (WebElement row : rows) + { + List cellsInRow = row.findElements(By.xpath("td")); + + String rowAsString = cellsInRow.stream().map(WebElement::getText).collect(Collectors.joining(", ")); + rowsAsString += rowAsString + '\n'; + } + + return rowsAsString; + } +} diff --git a/src/tests/webelements/TablesTests.java b/src/tests/webelements/TablesTests.java new file mode 100644 index 0000000..971907e --- /dev/null +++ b/src/tests/webelements/TablesTests.java @@ -0,0 +1,33 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.TablesPage; + +public class TablesTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + TablesPage page = new TablesPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + System.out.println("Batman Products Table Header: " + page.batmanProductsTableHeaderAsString()); + System.out.println("Batman Products Table Rows: " + page.batmanProductsTableRowsAsString()); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/webelements/Tables.java b/src/webelements/Tables.java deleted file mode 100644 index 4004c30..0000000 --- a/src/webelements/Tables.java +++ /dev/null @@ -1,52 +0,0 @@ -package webelements; - -import java.util.List; -import java.util.stream.Collectors; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; - -public class Tables -{ - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the 'Tables' accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Tables')]")).click(); - - // - - // Obtain the rows in the 'products-batman' table: - List rows = driver.findElements(By.xpath(".//table[@id='products-batman']/descendant::*/tr")); - - // Take the cells of the 1st row (header row): - List headerRow = rows.remove(0).findElements(By.xpath("th")); - - // Print the table header cells: - String headerString = headerRow.stream().map(WebElement::getText).collect(Collectors.joining(", ")); - System.out.println("Header: " + headerString); - - // Print table body cells: - for (WebElement row : rows) - { - List cellsInRow = row.findElements(By.xpath("td")); - - String rowString = cellsInRow.stream().map(WebElement::getText).collect(Collectors.joining(", ")); - System.out.println("Row: " + rowString); - } - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From cdd8d98acce8bb1ed3ca9aeb020839d0341a5390 Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 18:08:11 +0100 Subject: [PATCH 08/12] Apply POM to DatePickers --- src/pages/webelements/DatePickersPage.java | 56 +++++++++++++++++++++ src/tests/webelements/DatePickersTests.java | 42 ++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/pages/webelements/DatePickersPage.java create mode 100644 src/tests/webelements/DatePickersTests.java diff --git a/src/pages/webelements/DatePickersPage.java b/src/pages/webelements/DatePickersPage.java new file mode 100644 index 0000000..1129745 --- /dev/null +++ b/src/pages/webelements/DatePickersPage.java @@ -0,0 +1,56 @@ +package pages.webelements; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class DatePickersPage +{ + @FindBy(xpath = "//button[contains(text(),'Date Pickers')]") + private WebElement accordionItem; + + @FindBy(id = "html-datepicker") + private WebElement htmlDatePicker; + + private WebDriver driver = null; + + public DatePickersPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void setDateOnHTMLDatePicker(String inputDateAsString) + { + // JavaScript uses dates in format "yyyy-MM-dd" + // We set the value of the HTML Date Picker input using JavascriptExecutor + // So we need to convert the input date from format "dd-MM-yyyy" into "yyyy-MM-dd" + String inputDateAsStringInJavaScriptFormat = ""; + + try + { + SimpleDateFormat inputDateFormat = new SimpleDateFormat("dd-MM-yyyy"); + Date inputDate = inputDateFormat.parse(inputDateAsString); + + SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + inputDateAsStringInJavaScriptFormat = outputDateFormat.format(inputDate); + } catch (ParseException e) + { + e.printStackTrace(); + } + + JavascriptExecutor js = (JavascriptExecutor) driver; + js.executeScript("arguments[0].value='" + inputDateAsStringInJavaScriptFormat + "';", htmlDatePicker); + } +} diff --git a/src/tests/webelements/DatePickersTests.java b/src/tests/webelements/DatePickersTests.java new file mode 100644 index 0000000..ccd1c3f --- /dev/null +++ b/src/tests/webelements/DatePickersTests.java @@ -0,0 +1,42 @@ +package tests.webelements; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.DatePickersPage; + +public class DatePickersTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + DatePickersPage page = new DatePickersPage(driver); + + // This could be considered our test data: + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate today = LocalDate.now(); + + String inputDateAsString = formatter.format(today); + + // Perform actions on the page: + page.clickOnAccordionItem(); + page.setDateOnHTMLDatePicker(inputDateAsString); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} From 0701dd75f0cfd5a54512dec33335db8305af03ce Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 18:11:09 +0100 Subject: [PATCH 09/12] Apply POM to JavaScriptPopupMessages --- src/pages/webelements/AlertPanel.java | 27 ++++++++ src/pages/webelements/ConfirmPanel.java | 27 ++++++++ .../JavaScriptPopupMessagesPage.java | 49 ++++++++++++++ src/pages/webelements/PromptPanel.java | 32 +++++++++ .../JavaScriptPopupMessagesTests.java | 49 ++++++++++++++ src/webelements/JavaScriptPopupMessages.java | 65 ------------------- 6 files changed, 184 insertions(+), 65 deletions(-) create mode 100644 src/pages/webelements/AlertPanel.java create mode 100644 src/pages/webelements/ConfirmPanel.java create mode 100644 src/pages/webelements/JavaScriptPopupMessagesPage.java create mode 100644 src/pages/webelements/PromptPanel.java create mode 100644 src/tests/webelements/JavaScriptPopupMessagesTests.java delete mode 100644 src/webelements/JavaScriptPopupMessages.java diff --git a/src/pages/webelements/AlertPanel.java b/src/pages/webelements/AlertPanel.java new file mode 100644 index 0000000..7d6dbf2 --- /dev/null +++ b/src/pages/webelements/AlertPanel.java @@ -0,0 +1,27 @@ +package pages.webelements; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.WebDriver; + +public class AlertPanel +{ + private Alert alert = null; + private WebDriver driver = null; + + public AlertPanel(WebDriver driver) + { + this.driver = driver; + alert = driver.switchTo().alert(); + } + + public String getText() + { + return alert.getText(); + } + + public void accept() + { + alert.accept(); + driver.switchTo().defaultContent(); + } +} diff --git a/src/pages/webelements/ConfirmPanel.java b/src/pages/webelements/ConfirmPanel.java new file mode 100644 index 0000000..bb4f8ad --- /dev/null +++ b/src/pages/webelements/ConfirmPanel.java @@ -0,0 +1,27 @@ +package pages.webelements; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.WebDriver; + +public class ConfirmPanel +{ + private Alert confirm = null; + private WebDriver driver = null; + + public ConfirmPanel(WebDriver driver) + { + this.driver = driver; + confirm = driver.switchTo().alert(); + } + + public String getText() + { + return confirm.getText(); + } + + public void dismiss() + { + confirm.dismiss(); + driver.switchTo().defaultContent(); + } +} diff --git a/src/pages/webelements/JavaScriptPopupMessagesPage.java b/src/pages/webelements/JavaScriptPopupMessagesPage.java new file mode 100644 index 0000000..aeb521c --- /dev/null +++ b/src/pages/webelements/JavaScriptPopupMessagesPage.java @@ -0,0 +1,49 @@ +package pages.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class JavaScriptPopupMessagesPage +{ + @FindBy(xpath = "//button[contains(text(),'JavaScript Popup Messages')]") + private WebElement accordionItem; + + @FindBy(id = "alert-button") + private WebElement alertButton; + + @FindBy(id = "confirm-button") + private WebElement confirmButton; + + @FindBy(id = "prompt-button") + private WebElement promptButton; + + private WebDriver driver; + + public JavaScriptPopupMessagesPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void clickAlertButton() + { + alertButton.click(); + } + + public void clickConfirmButton() + { + confirmButton.click(); + } + + public void clickPromptButton() + { + promptButton.click(); + } +} diff --git a/src/pages/webelements/PromptPanel.java b/src/pages/webelements/PromptPanel.java new file mode 100644 index 0000000..84f624e --- /dev/null +++ b/src/pages/webelements/PromptPanel.java @@ -0,0 +1,32 @@ +package pages.webelements; + +import org.openqa.selenium.Alert; +import org.openqa.selenium.WebDriver; + +public class PromptPanel +{ + private Alert prompt = null; + private WebDriver driver = null; + + public PromptPanel(WebDriver driver) + { + this.driver = driver; + prompt = driver.switchTo().alert(); + } + + public void setText(String text) + { + prompt.sendKeys(text); + } + + public String getText() + { + return prompt.getText(); + } + + public void dismiss() + { + prompt.dismiss(); + driver.switchTo().defaultContent(); + } +} diff --git a/src/tests/webelements/JavaScriptPopupMessagesTests.java b/src/tests/webelements/JavaScriptPopupMessagesTests.java new file mode 100644 index 0000000..bd8975d --- /dev/null +++ b/src/tests/webelements/JavaScriptPopupMessagesTests.java @@ -0,0 +1,49 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.AlertPanel; +import pages.webelements.ConfirmPanel; +import pages.webelements.JavaScriptPopupMessagesPage; +import pages.webelements.PromptPanel; + +public class JavaScriptPopupMessagesTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + JavaScriptPopupMessagesPage page = new JavaScriptPopupMessagesPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + + page.clickAlertButton(); + AlertPanel alert = new AlertPanel(driver); + System.out.println("Alert text: " + alert.getText()); + alert.accept(); + + page.clickConfirmButton(); + ConfirmPanel confirm = new ConfirmPanel(driver); + System.out.println("Confirm text: " + confirm.getText()); + confirm.dismiss(); + + page.clickPromptButton(); + PromptPanel prompt = new PromptPanel(driver); + System.out.println("Prompt text: " + prompt.getText()); + prompt.dismiss(); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/webelements/JavaScriptPopupMessages.java b/src/webelements/JavaScriptPopupMessages.java deleted file mode 100644 index 12a8dfa..0000000 --- a/src/webelements/JavaScriptPopupMessages.java +++ /dev/null @@ -1,65 +0,0 @@ -package webelements; - -import org.openqa.selenium.Alert; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; - -public class JavaScriptPopupMessages -{ - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the 'JavaScript Popup Messages' accordion item: - driver.findElement(By.xpath("//button[contains(text(),'JavaScript Popup Messages')]")).click(); - - // - // ALERT - // - - driver.findElement(By.id("alert-button")).click(); - - Alert alert = driver.switchTo().alert(); - String alertText = alert.getText(); - alert.accept(); - - System.out.println("Alert text: " + alertText); - - // - // CONFIRM - // - - driver.findElement(By.id("confirm-button")).click(); - - Alert confirm = driver.switchTo().alert(); - String confirmText = confirm.getText(); - confirm.dismiss(); - - System.out.println("Confirm text: " + confirmText); - - // - // PROMPT - // - - driver.findElement(By.id("prompt-button")).click(); - - Alert prompt = driver.switchTo().alert(); - prompt.sendKeys("QA"); - String promptText = prompt.getText(); - prompt.dismiss(); - - System.out.println("Prompt text: " + promptText); - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From a41d058e0a321c4723d4445c6d94e0563f9b4da4 Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 20:08:01 +0100 Subject: [PATCH 10/12] Apply POM to FramesAndWindows --- src/pages/webelements/Frame.java | 31 ++++++ .../webelements/FramesAndWindowsPage.java | 41 ++++++++ src/pages/webelements/NewWindow.java | 64 ++++++++++++ .../webelements/FramesAndWindowsTests.java | 42 ++++++++ src/webelements/FramesAndWindows.java | 97 ------------------- 5 files changed, 178 insertions(+), 97 deletions(-) create mode 100644 src/pages/webelements/Frame.java create mode 100644 src/pages/webelements/FramesAndWindowsPage.java create mode 100644 src/pages/webelements/NewWindow.java create mode 100644 src/tests/webelements/FramesAndWindowsTests.java delete mode 100644 src/webelements/FramesAndWindows.java diff --git a/src/pages/webelements/Frame.java b/src/pages/webelements/Frame.java new file mode 100644 index 0000000..eef4184 --- /dev/null +++ b/src/pages/webelements/Frame.java @@ -0,0 +1,31 @@ +package pages.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class Frame +{ + @FindBy(id = "frame-button") + private WebElement button; + + private WebDriver driver = null; + + public Frame(WebDriver driver, WebElement frame) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + driver.switchTo().frame(frame); + } + + public void clickButton() + { + button.click(); + } + + public void dismiss() + { + driver.switchTo().defaultContent(); + } +} diff --git a/src/pages/webelements/FramesAndWindowsPage.java b/src/pages/webelements/FramesAndWindowsPage.java new file mode 100644 index 0000000..2f3d7fb --- /dev/null +++ b/src/pages/webelements/FramesAndWindowsPage.java @@ -0,0 +1,41 @@ +package pages.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +public class FramesAndWindowsPage +{ + @FindBy(xpath = "//button[contains(text(),'Frames and Windows')]") + private WebElement accordionItem; + + @FindBy(id = "custom-iframe") + private WebElement frame; + + @FindBy(id = "new-window-button") + private WebElement newWindowButton; + + private WebDriver driver = null; + + public FramesAndWindowsPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public WebElement frame() + { + return frame; + } + + public void clickNewWindowButton() + { + newWindowButton.click(); + } +} diff --git a/src/pages/webelements/NewWindow.java b/src/pages/webelements/NewWindow.java new file mode 100644 index 0000000..544b6b5 --- /dev/null +++ b/src/pages/webelements/NewWindow.java @@ -0,0 +1,64 @@ +package pages.webelements; + +import java.util.Set; + +import org.openqa.selenium.WebDriver; + +public class NewWindow +{ + private static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } catch (InterruptedException e) + { + e.printStackTrace(); + } + } + + private String originalWindowHandle; + + private WebDriver driver = null; + + public NewWindow(WebDriver driver) + { + this.driver = driver; + + // Get the handle (or identifier) of the original window: + originalWindowHandle = driver.getWindowHandle(); + + // Most likely the new window won't finish loading its content before its title is queried by the + // driver, so we sleep the execution a little bit to give it enough time: + sleep(500); + + // Get the handles of all the windows (i.e. handle of the original window + handle of the new window): + Set windowHandles = driver.getWindowHandles(); + + // Figure out the handle of the new window: + String newWindowHandle = ""; + + for (String windowHandle : windowHandles) + { + if (!originalWindowHandle.contentEquals(windowHandle)) + { + newWindowHandle = windowHandle; + break; + } + } + + // Switch to the new window: + driver.switchTo().window(newWindowHandle); + } + + public String title() + { + return driver.getTitle(); + } + + public void close() + { + driver.close(); + driver.switchTo().window(originalWindowHandle); + } +} diff --git a/src/tests/webelements/FramesAndWindowsTests.java b/src/tests/webelements/FramesAndWindowsTests.java new file mode 100644 index 0000000..2e84817 --- /dev/null +++ b/src/tests/webelements/FramesAndWindowsTests.java @@ -0,0 +1,42 @@ +package tests.webelements; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.webelements.Frame; +import pages.webelements.FramesAndWindowsPage; +import pages.webelements.NewWindow; + +public class FramesAndWindowsTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + FramesAndWindowsPage page = new FramesAndWindowsPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + + Frame frame = new Frame(driver, page.frame()); + frame.clickButton(); + frame.dismiss(); + + page.clickNewWindowButton(); + NewWindow window = new NewWindow(driver); + System.out.println("The title of the new window is: " + window.title()); + window.close(); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/webelements/FramesAndWindows.java b/src/webelements/FramesAndWindows.java deleted file mode 100644 index 2162a63..0000000 --- a/src/webelements/FramesAndWindows.java +++ /dev/null @@ -1,97 +0,0 @@ -package webelements; - -import java.util.Set; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; - -public class FramesAndWindows -{ - private static void sleep(long milliseconds) - { - try - { - Thread.sleep(milliseconds); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - } - - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the 'Frames and Windows' accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Frames and Windows')]")).click(); - - // - // FRAMES - // - - // Switch to the iframe: - WebElement frame = driver.findElement(By.id("custom-iframe")); - driver.switchTo().frame(frame); - - // Perform the actions we need to do: - driver.findElement(By.id("frame-button")).click(); - - // Switch back to the default document: - driver.switchTo().defaultContent(); - - // - // WINDOWS - // - - // Get the handle (or identifier) of the original window: - String originalWindowHandle = driver.getWindowHandle(); - - // Click the button that opens a new window: - driver.findElement(By.id("new-window-button")).click(); - - // Most likely the new window won't finish loading its content before its title is queried by the - // driver, so we sleep the execution a little bit to give it enough time: - sleep(500); - - // Get the handles of all the windows (i.e. handle of the original window + handle of the new window): - Set windowHandles = driver.getWindowHandles(); - - // Figure out the handle of the new window: - String newWindowHandle = ""; - - for (String windowHandle : windowHandles) - { - if (!originalWindowHandle.contentEquals(windowHandle)) - { - newWindowHandle = windowHandle; - break; - } - } - - // Switch to the new window: - driver.switchTo().window(newWindowHandle); - - // Perform the actions we need to do: - System.out.println("The title of the new window is: " + driver.getTitle()); - - // Close the window: - driver.close(); - - // Switch back to the default document: - driver.switchTo().window(originalWindowHandle); - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From 9ef157f8772ef2e823a963771a7b311de3d290f9 Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Thu, 25 Jul 2024 21:06:31 +0100 Subject: [PATCH 11/12] Apply POM to WaitingStrategies --- src/pages/waits/WaitingStrategiesPage.java | 96 +++++++++++++++++++ src/tests/waits/ExplicitWaitTests.java | 61 ++++++++++++ .../waits/ImplicitWaitTests.java} | 34 ++++--- src/waits/ExplicitWait.java | 89 ----------------- 4 files changed, 173 insertions(+), 107 deletions(-) create mode 100644 src/pages/waits/WaitingStrategiesPage.java create mode 100644 src/tests/waits/ExplicitWaitTests.java rename src/{waits/ImplicitWait.java => tests/waits/ImplicitWaitTests.java} (67%) delete mode 100644 src/waits/ExplicitWait.java diff --git a/src/pages/waits/WaitingStrategiesPage.java b/src/pages/waits/WaitingStrategiesPage.java new file mode 100644 index 0000000..beb7836 --- /dev/null +++ b/src/pages/waits/WaitingStrategiesPage.java @@ -0,0 +1,96 @@ +package pages.waits; + +import java.time.Duration; + +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 WaitingStrategiesPage +{ + @FindBy(xpath = "//button[contains(text(),'Waiting Strategies')]") + private WebElement accordionItem; + + @FindBy(id = "disabled-input-toggle") + private WebElement enableOrDisableButton; + + @FindBy(id = "disabled-input") + private WebElement enabledOrDisabledInput; + + @FindBy(id = "hidden-input-toggle") + private WebElement showOrHideButton; + + @FindBy(id = "hidden-input") + private WebElement shownOrHiddenInput; + + @FindBy(id = "add-remove-input-button") + private WebElement addOrRemoveButton; + + @FindBy(id = "dynamic-input") + private WebElement dynamicInput; + + private WebDriver driver = null; + + public WaitingStrategiesPage(WebDriver driver) + { + this.driver = driver; + PageFactory.initElements(this.driver, this); + } + + public void clickOnAccordionItem() + { + accordionItem.click(); + } + + public void clickEnableOrDisableButton() + { + enableOrDisableButton.click(); + } + + public void setEnabledOrDisabledInput(String text) + { + enabledOrDisabledInput.sendKeys(text); + } + + public void clickShowOrHideButton() + { + showOrHideButton.click(); + } + + public void setShownOrHiddenInput(String text) + { + shownOrHiddenInput.sendKeys(text); + } + + public void clickAddOrRemoveButton() + { + addOrRemoveButton.click(); + } + + public void setDynamicInput(String text) + { + dynamicInput.sendKeys(text); + } + + public void waitForEnabledOrDisabledInputToBeClickable(long millis) + { + WebDriverWait wait = new WebDriverWait(driver, Duration.ofMillis(millis)); + wait.until(ExpectedConditions.elementToBeClickable(enabledOrDisabledInput)); + } + + public void waitForShownOrHiddenInputToBeClickable(long millis) + { + WebDriverWait wait = new WebDriverWait(driver, Duration.ofMillis(millis)); + wait.until(ExpectedConditions.elementToBeClickable(shownOrHiddenInput)); + } + + public void waitForDynamicInputToBePresent(long millis) + { + WebDriverWait wait = new WebDriverWait(driver, Duration.ofMillis(millis)); + wait.until(ExpectedConditions.presenceOfElementLocated(By.id("dynamic-input"))); + } +} diff --git a/src/tests/waits/ExplicitWaitTests.java b/src/tests/waits/ExplicitWaitTests.java new file mode 100644 index 0000000..5e8e218 --- /dev/null +++ b/src/tests/waits/ExplicitWaitTests.java @@ -0,0 +1,61 @@ +package tests.waits; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +import pages.waits.WaitingStrategiesPage; + +public class ExplicitWaitTests +{ + public static void main(String[] args) + { + // Specify path to WebDriver: + System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); + + // Launch browser and navigate to test page: + WebDriver driver = new FirefoxDriver(); + driver.manage().window().maximize(); + driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); + + // Instantiate the page model: + WaitingStrategiesPage page = new WaitingStrategiesPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); + + // ======================================================================================== // + // + // DISABLED INPUT + // + // ======================================================================================== // + + page.clickEnableOrDisableButton(); + page.waitForEnabledOrDisabledInputToBeClickable(1000); // Wait for the JavaScript to enable the input. + page.setEnabledOrDisabledInput("Explicit Wait with disabled elements"); + + // ======================================================================================== // + // + // HIDDEN INPUT + // + // ======================================================================================== // + + page.clickShowOrHideButton(); + page.waitForShownOrHiddenInputToBeClickable(1000); // Wait for the JavaScript to show the input. + page.setShownOrHiddenInput("Explicit Wait with hidden elements"); + + // ======================================================================================== // + // + // DYNAMIC INPUT + // + // ======================================================================================== // + + page.clickAddOrRemoveButton(); + page.waitForDynamicInputToBePresent(1000); + page.setDynamicInput("Explicit Wait with dynamic elements"); + + // + + // This is commented out so you can actually see what happened in the web page: + // driver.quit(); + } +} diff --git a/src/waits/ImplicitWait.java b/src/tests/waits/ImplicitWaitTests.java similarity index 67% rename from src/waits/ImplicitWait.java rename to src/tests/waits/ImplicitWaitTests.java index c7a836d..5d7740b 100644 --- a/src/waits/ImplicitWait.java +++ b/src/tests/waits/ImplicitWaitTests.java @@ -1,12 +1,13 @@ -package waits; +package tests.waits; import java.time.Duration; -import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; -public class ImplicitWait +import pages.waits.WaitingStrategiesPage; + +public class ImplicitWaitTests { private static void sleep(long milliseconds) { @@ -25,14 +26,17 @@ public class ImplicitWait // Specify path to WebDriver: System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - // Launch browser, set implicit waiting time, and navigate to test page: + // Launch browser and navigate to test page: WebDriver driver = new FirefoxDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000)); driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - // Click on the Waiting Strategies accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Waiting Strategies')]")).click(); + // Instantiate the page model: + WaitingStrategiesPage page = new WaitingStrategiesPage(driver); + + // Perform actions on the page: + page.clickOnAccordionItem(); // ======================================================================================== // // @@ -40,16 +44,14 @@ public class ImplicitWait // // ======================================================================================== // - // Click on the Enable button that will enable the disabled input: - driver.findElement(By.id("disabled-input-toggle")).click(); + page.clickEnableOrDisableButton(); // implicitlyWait is used when trying to find an element or elements that are not immediately available. // In this case, the disabled input is available (i.e. exists in the DOM), so we sleep the execution // before continuing: sleep(1000); - // Enter some text in the input: - driver.findElement(By.id("disabled-input")).sendKeys("Implicit Wait with disabled elements"); + page.setEnabledOrDisabledInput("Implicit Wait with disabled elements"); // ======================================================================================== // // @@ -57,16 +59,14 @@ public class ImplicitWait // // ======================================================================================== // - // Click on the Hide button that will show the hidden input: - driver.findElement(By.id("hidden-input-toggle")).click(); + page.clickShowOrHideButton(); // implicitlyWait is used when trying to find an element or elements that are not immediately available. // In this case, the hidden input is available (i.e. exists in the DOM), so we sleep the execution // before continuing: sleep(1000); - // Enter some text in the input: - driver.findElement(By.id("hidden-input")).sendKeys("Implicit Wait with hidden elements"); + page.setShownOrHiddenInput("Implicit Wait with hidden elements"); // ======================================================================================== // // @@ -74,14 +74,12 @@ public class ImplicitWait // // ======================================================================================== // - // Click on the Add button that will add a new input: - driver.findElement(By.id("add-remove-input-button")).click(); + page.clickAddOrRemoveButton(); // We don't need to sleep here, as the dynamic input doesn't exist in the DOM and implicitlyWait // will keep trying for the specified amount of time until the input is available. - // Enter some text in the input: - driver.findElement(By.id("dynamic-input")).sendKeys("Implicit Wait with dynamic elements"); + page.setDynamicInput("Implicit Wait with dynamic elements"); // diff --git a/src/waits/ExplicitWait.java b/src/waits/ExplicitWait.java deleted file mode 100644 index 7c9d26f..0000000 --- a/src/waits/ExplicitWait.java +++ /dev/null @@ -1,89 +0,0 @@ -package waits; - -import java.time.Duration; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; - -public class ExplicitWait -{ - public static void main(String[] args) - { - // Specify path to WebDriver: - System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); - - // Launch browser and navigate to test page: - WebDriver driver = new FirefoxDriver(); - driver.manage().window().maximize(); - driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); - - // Click on the Waiting Strategies accordion item: - driver.findElement(By.xpath("//button[contains(text(),'Waiting Strategies')]")).click(); - - // ======================================================================================== // - // - // DISABLED INPUT - // - // ======================================================================================== // - - // Get a reference to the disabled input (we can do that because the input is in the DOM): - WebElement disabledInput = driver.findElement(By.id("disabled-input")); - - // Click on the Enable button that will enable the disabled input: - driver.findElement(By.id("disabled-input-toggle")).click(); - - // Wait for the JavaScript to enable the input: - WebDriverWait wait = new WebDriverWait(driver, Duration.ofMillis(1000)); - wait.until(ExpectedConditions.elementToBeClickable(disabledInput)); - - // Enter some text in the input: - disabledInput.sendKeys("Explicit Wait with disabled elements"); - - // ======================================================================================== // - // - // HIDDEN INPUT - // - // ======================================================================================== // - - // Get a reference to the hidden input (we can do that because the input is in the DOM): - WebElement hiddenInput = driver.findElement(By.id("hidden-input")); - - // Click on the Hide button that will show the hidden input: - driver.findElement(By.id("hidden-input-toggle")).click(); - - // Wait for the JavaScript to show the input: - wait = new WebDriverWait(driver, Duration.ofMillis(1000)); - wait.until(ExpectedConditions.visibilityOf(hiddenInput)); - - // Enter some text in the input: - hiddenInput.sendKeys("Explicit Wait with hidden elements"); - - // ======================================================================================== // - // - // DYNAMIC INPUT - // - // ======================================================================================== // - - // We cannot get a reference to the dynamic input because it doesn't exist in the DOM yet! - // WebElement dynamicInput = driver.findElement(By.id("dynamic-input")); - - // Click on the Add button that will add a new input: - driver.findElement(By.id("add-remove-input-button")).click(); - - // Wait for the JavaScript to add the input: - wait = new WebDriverWait(driver, Duration.ofMillis(1000)); - wait.until(ExpectedConditions.presenceOfElementLocated(By.id("dynamic-input"))); - - // Enter some text in the input: - driver.findElement(By.id("dynamic-input")).sendKeys("Explicit Wait with dynamic elements"); - - // - - // This is commented out so you can actually see what happened in the web page: - // driver.quit(); - } -} From b4904adfb4542feccb2df9bb5f0c48a4caa832fa Mon Sep 17 00:00:00 2001 From: Ramon Caballero Date: Fri, 26 Jul 2024 14:53:46 +0100 Subject: [PATCH 12/12] Implement BasePage with functionality common to all pages --- src/pages/BasePage.java | 25 +++++++++++++++++++ src/pages/waits/WaitingStrategiesPage.java | 8 +++--- src/pages/webelements/AlertPanel.java | 7 +++--- .../CheckboxesAndRadioButtonsPage.java | 8 +++--- src/pages/webelements/ConfirmPanel.java | 7 +++--- src/pages/webelements/DatePickersPage.java | 11 ++++---- .../webelements/FramesAndWindowsPage.java | 8 +++--- src/pages/webelements/InputRangePage.java | 8 +++--- .../webelements/InputsWithUIDialogsPage.java | 8 +++--- .../JavaScriptPopupMessagesPage.java | 8 +++--- src/pages/webelements/ModalDialogPage.java | 8 +++--- .../webelements/MostCommonInputsPage.java | 20 +++------------ src/pages/webelements/NewWindow.java | 19 +++----------- src/pages/webelements/PromptPanel.java | 7 +++--- .../SelectDatalistAndOptionsPage.java | 8 +++--- src/pages/webelements/TablesPage.java | 8 +++--- 16 files changed, 87 insertions(+), 81 deletions(-) create mode 100644 src/pages/BasePage.java diff --git a/src/pages/BasePage.java b/src/pages/BasePage.java new file mode 100644 index 0000000..b6069b0 --- /dev/null +++ b/src/pages/BasePage.java @@ -0,0 +1,25 @@ +package pages; + +import org.openqa.selenium.WebDriver; + +public abstract class BasePage +{ + protected WebDriver driver = null; + + protected BasePage(WebDriver driver) + { + this.driver = driver; + } + + public void sleep(long millis) + { + try + { + Thread.sleep(millis); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } +} diff --git a/src/pages/waits/WaitingStrategiesPage.java b/src/pages/waits/WaitingStrategiesPage.java index beb7836..d029b3b 100644 --- a/src/pages/waits/WaitingStrategiesPage.java +++ b/src/pages/waits/WaitingStrategiesPage.java @@ -10,7 +10,9 @@ import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; -public class WaitingStrategiesPage +import pages.BasePage; + +public class WaitingStrategiesPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Waiting Strategies')]") private WebElement accordionItem; @@ -33,11 +35,9 @@ public class WaitingStrategiesPage @FindBy(id = "dynamic-input") private WebElement dynamicInput; - private WebDriver driver = null; - public WaitingStrategiesPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } diff --git a/src/pages/webelements/AlertPanel.java b/src/pages/webelements/AlertPanel.java index 7d6dbf2..b2adaf3 100644 --- a/src/pages/webelements/AlertPanel.java +++ b/src/pages/webelements/AlertPanel.java @@ -3,14 +3,15 @@ package pages.webelements; import org.openqa.selenium.Alert; import org.openqa.selenium.WebDriver; -public class AlertPanel +import pages.BasePage; + +public class AlertPanel extends BasePage { private Alert alert = null; - private WebDriver driver = null; public AlertPanel(WebDriver driver) { - this.driver = driver; + super(driver); alert = driver.switchTo().alert(); } diff --git a/src/pages/webelements/CheckboxesAndRadioButtonsPage.java b/src/pages/webelements/CheckboxesAndRadioButtonsPage.java index f8ca5e3..cdfcadb 100644 --- a/src/pages/webelements/CheckboxesAndRadioButtonsPage.java +++ b/src/pages/webelements/CheckboxesAndRadioButtonsPage.java @@ -9,7 +9,9 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class CheckboxesAndRadioButtonsPage +import pages.BasePage; + +public class CheckboxesAndRadioButtonsPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Checkboxes and Radio Buttons')]") private WebElement accordionItem; @@ -20,11 +22,9 @@ public class CheckboxesAndRadioButtonsPage @FindBy(xpath = "//div[@id='radiobuttons']//input") private List radioButtons; - private WebDriver driver = null; - public CheckboxesAndRadioButtonsPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } diff --git a/src/pages/webelements/ConfirmPanel.java b/src/pages/webelements/ConfirmPanel.java index bb4f8ad..62921e5 100644 --- a/src/pages/webelements/ConfirmPanel.java +++ b/src/pages/webelements/ConfirmPanel.java @@ -3,14 +3,15 @@ package pages.webelements; import org.openqa.selenium.Alert; import org.openqa.selenium.WebDriver; -public class ConfirmPanel +import pages.BasePage; + +public class ConfirmPanel extends BasePage { private Alert confirm = null; - private WebDriver driver = null; public ConfirmPanel(WebDriver driver) { - this.driver = driver; + super(driver); confirm = driver.switchTo().alert(); } diff --git a/src/pages/webelements/DatePickersPage.java b/src/pages/webelements/DatePickersPage.java index 1129745..7e0aeb2 100644 --- a/src/pages/webelements/DatePickersPage.java +++ b/src/pages/webelements/DatePickersPage.java @@ -10,7 +10,9 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class DatePickersPage +import pages.BasePage; + +public class DatePickersPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Date Pickers')]") private WebElement accordionItem; @@ -18,11 +20,9 @@ public class DatePickersPage @FindBy(id = "html-datepicker") private WebElement htmlDatePicker; - private WebDriver driver = null; - public DatePickersPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } @@ -45,7 +45,8 @@ public class DatePickersPage SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd"); inputDateAsStringInJavaScriptFormat = outputDateFormat.format(inputDate); - } catch (ParseException e) + } + catch (ParseException e) { e.printStackTrace(); } diff --git a/src/pages/webelements/FramesAndWindowsPage.java b/src/pages/webelements/FramesAndWindowsPage.java index 2f3d7fb..2bda138 100644 --- a/src/pages/webelements/FramesAndWindowsPage.java +++ b/src/pages/webelements/FramesAndWindowsPage.java @@ -5,7 +5,9 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class FramesAndWindowsPage +import pages.BasePage; + +public class FramesAndWindowsPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Frames and Windows')]") private WebElement accordionItem; @@ -16,11 +18,9 @@ public class FramesAndWindowsPage @FindBy(id = "new-window-button") private WebElement newWindowButton; - private WebDriver driver = null; - public FramesAndWindowsPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } diff --git a/src/pages/webelements/InputRangePage.java b/src/pages/webelements/InputRangePage.java index 6cfe543..ae4e248 100644 --- a/src/pages/webelements/InputRangePage.java +++ b/src/pages/webelements/InputRangePage.java @@ -7,7 +7,9 @@ import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class InputRangePage +import pages.BasePage; + +public class InputRangePage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Input Range')]") private WebElement accordionItem; @@ -15,11 +17,9 @@ public class InputRangePage @FindBy(id = "range-input") private WebElement rangeInput; - private WebDriver driver; - public InputRangePage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } diff --git a/src/pages/webelements/InputsWithUIDialogsPage.java b/src/pages/webelements/InputsWithUIDialogsPage.java index 89f76d4..5fce6f5 100644 --- a/src/pages/webelements/InputsWithUIDialogsPage.java +++ b/src/pages/webelements/InputsWithUIDialogsPage.java @@ -6,7 +6,9 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class InputsWithUIDialogsPage +import pages.BasePage; + +public class InputsWithUIDialogsPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Inputs With UI Dialogs')]") private WebElement accordionItem; @@ -17,11 +19,9 @@ public class InputsWithUIDialogsPage @FindBy(id = "file-input") private WebElement fileInput; - private WebDriver driver = null; - public InputsWithUIDialogsPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } diff --git a/src/pages/webelements/JavaScriptPopupMessagesPage.java b/src/pages/webelements/JavaScriptPopupMessagesPage.java index aeb521c..d0c7563 100644 --- a/src/pages/webelements/JavaScriptPopupMessagesPage.java +++ b/src/pages/webelements/JavaScriptPopupMessagesPage.java @@ -5,7 +5,9 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class JavaScriptPopupMessagesPage +import pages.BasePage; + +public class JavaScriptPopupMessagesPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'JavaScript Popup Messages')]") private WebElement accordionItem; @@ -19,11 +21,9 @@ public class JavaScriptPopupMessagesPage @FindBy(id = "prompt-button") private WebElement promptButton; - private WebDriver driver; - public JavaScriptPopupMessagesPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } diff --git a/src/pages/webelements/ModalDialogPage.java b/src/pages/webelements/ModalDialogPage.java index 9d6d538..99fcc62 100644 --- a/src/pages/webelements/ModalDialogPage.java +++ b/src/pages/webelements/ModalDialogPage.java @@ -6,16 +6,16 @@ import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.How; import org.openqa.selenium.support.PageFactory; -public class ModalDialogPage +import pages.BasePage; + +public class ModalDialogPage extends BasePage { @FindBy(how = How.ID, using = "form-interactions-modal-close-button") private WebElement closeButton; - private WebDriver driver = null; - public ModalDialogPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } diff --git a/src/pages/webelements/MostCommonInputsPage.java b/src/pages/webelements/MostCommonInputsPage.java index f51238b..8f0d0c2 100644 --- a/src/pages/webelements/MostCommonInputsPage.java +++ b/src/pages/webelements/MostCommonInputsPage.java @@ -5,7 +5,9 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class MostCommonInputsPage +import pages.BasePage; + +public class MostCommonInputsPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Most Common Inputs')]") private WebElement accordionItem; @@ -31,11 +33,9 @@ public class MostCommonInputsPage @FindBy(id = "form-interactions-submit-button") private WebElement submitButton; - private WebDriver driver = null; - public MostCommonInputsPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); } @@ -83,16 +83,4 @@ public class MostCommonInputsPage { return readonlyInput.getAttribute("value"); } - - public void sleep(long millis) - { - try - { - Thread.sleep(millis); - } catch (InterruptedException e) - { - e.printStackTrace(); - } - - } } diff --git a/src/pages/webelements/NewWindow.java b/src/pages/webelements/NewWindow.java index 544b6b5..721c2b3 100644 --- a/src/pages/webelements/NewWindow.java +++ b/src/pages/webelements/NewWindow.java @@ -4,26 +4,15 @@ import java.util.Set; import org.openqa.selenium.WebDriver; -public class NewWindow +import pages.BasePage; + +public class NewWindow extends BasePage { - private static void sleep(long milliseconds) - { - try - { - Thread.sleep(milliseconds); - } catch (InterruptedException e) - { - e.printStackTrace(); - } - } - private String originalWindowHandle; - private WebDriver driver = null; - public NewWindow(WebDriver driver) { - this.driver = driver; + super(driver); // Get the handle (or identifier) of the original window: originalWindowHandle = driver.getWindowHandle(); diff --git a/src/pages/webelements/PromptPanel.java b/src/pages/webelements/PromptPanel.java index 84f624e..55c3352 100644 --- a/src/pages/webelements/PromptPanel.java +++ b/src/pages/webelements/PromptPanel.java @@ -3,14 +3,15 @@ package pages.webelements; import org.openqa.selenium.Alert; import org.openqa.selenium.WebDriver; -public class PromptPanel +import pages.BasePage; + +public class PromptPanel extends BasePage { private Alert prompt = null; - private WebDriver driver = null; public PromptPanel(WebDriver driver) { - this.driver = driver; + super(driver); prompt = driver.switchTo().alert(); } diff --git a/src/pages/webelements/SelectDatalistAndOptionsPage.java b/src/pages/webelements/SelectDatalistAndOptionsPage.java index 641f75a..cf4e5d9 100644 --- a/src/pages/webelements/SelectDatalistAndOptionsPage.java +++ b/src/pages/webelements/SelectDatalistAndOptionsPage.java @@ -10,7 +10,9 @@ import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.Select; -public class SelectDatalistAndOptionsPage +import pages.BasePage; + +public class SelectDatalistAndOptionsPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Select, Datalist and Options')]") private WebElement accordionItem; @@ -24,11 +26,9 @@ public class SelectDatalistAndOptionsPage Select select = null; List selectOptions = null; - private WebDriver driver; - public SelectDatalistAndOptionsPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); select = new Select(selectElement); diff --git a/src/pages/webelements/TablesPage.java b/src/pages/webelements/TablesPage.java index a0d7876..b777b6c 100644 --- a/src/pages/webelements/TablesPage.java +++ b/src/pages/webelements/TablesPage.java @@ -9,7 +9,9 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -public class TablesPage +import pages.BasePage; + +public class TablesPage extends BasePage { @FindBy(xpath = "//button[contains(text(),'Tables')]") private WebElement accordionItem; @@ -19,11 +21,9 @@ public class TablesPage List headerRow; - private WebDriver driver = null; - public TablesPage(WebDriver driver) { - this.driver = driver; + super(driver); PageFactory.initElements(this.driver, this); // Take the cells of the 1st row (header row):