Compare commits
	
		
			10 Commits
		
	
	
		
			c4da04e4de
			...
			95e8debdda
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 95e8debdda | |
|  | 05b089f331 | |
|  | b4904adfb4 | |
|  | 9ef157f877 | |
|  | a41d058e0a | |
|  | 0701dd75f0 | |
|  | cdd8d98acc | |
|  | c018aee877 | |
|  | 702348b16a | |
|  | 9f8210bf75 | 
							
								
								
									
										13
									
								
								README.md
								
								
								
								
							
							
						
						
									
										13
									
								
								README.md
								
								
								
								
							|  | @ -1,16 +1,17 @@ | ||||||
| # Page Object Model | # Page Object Model | ||||||
| 
 | 
 | ||||||
| Several examples demonstrating some features of Selenium WebDriver using Java. | Examples from [Selenium WebDriver](https://gitea.ramoncaballero.dev/mon/SeleniumWebDriver) adopting Page Object Model. | ||||||
| 
 | 
 | ||||||
| Each class has its own main method, so they are meant to be executed individually to showcase different Selenium features.  | Each test class has its own main method, so they are meant to be executed individually to showcase different Selenium features. | ||||||
| 
 | 
 | ||||||
| ## Run on Eclipse | ## Run on Eclipse | ||||||
| 
 | 
 | ||||||
| 1. **Package Explorer** | 1. **Package Explorer** | ||||||
| 2. Select the `.java` file that you want to run. | 2. Browse to **src/tests** package. | ||||||
| 3. Contextual menu > **Run As** > **Java Application** | 3. Select the `.java` file that you want to run. | ||||||
|  | 4. Contextual menu > **Run As** > **Java Application** | ||||||
| 
 | 
 | ||||||
| ## Notes | ## Notes | ||||||
| 
 | 
 | ||||||
| - `GettingStarted.java` needs to be run with `-ea` or `-enableasserts` as arguments. | - `GettingStartedTests.java` needs to be run with `-ea` or `-enableasserts` as arguments. | ||||||
| - `InputsWithUIDialogs.java` needs the name of a valid file in your system. | - `InputsWithUIDialogsTests.java` needs the name of a valid file in your system. | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class WaitingStrategiesPage extends BasePage | ||||||
|  | { | ||||||
|  | 	@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; | ||||||
|  | 
 | ||||||
|  | 	public WaitingStrategiesPage(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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"))); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | package pages.webelements; | ||||||
|  | 
 | ||||||
|  | import org.openqa.selenium.Alert; | ||||||
|  | import org.openqa.selenium.WebDriver; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class AlertPanel extends BasePage | ||||||
|  | { | ||||||
|  | 	private Alert alert = null; | ||||||
|  | 
 | ||||||
|  | 	public AlertPanel(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(driver); | ||||||
|  | 		alert = driver.switchTo().alert(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public String getText() | ||||||
|  | 	{ | ||||||
|  | 		return alert.getText(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void accept() | ||||||
|  | 	{ | ||||||
|  | 		alert.accept(); | ||||||
|  | 		driver.switchTo().defaultContent(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -9,7 +9,9 @@ import org.openqa.selenium.WebElement; | ||||||
| import org.openqa.selenium.support.FindBy; | import org.openqa.selenium.support.FindBy; | ||||||
| import org.openqa.selenium.support.PageFactory; | 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')]") | 	@FindBy(xpath = "//button[contains(text(),'Checkboxes and Radio Buttons')]") | ||||||
| 	private WebElement accordionItem; | 	private WebElement accordionItem; | ||||||
|  | @ -20,11 +22,9 @@ public class CheckboxesAndRadioButtonsPage | ||||||
| 	@FindBy(xpath = "//div[@id='radiobuttons']//input") | 	@FindBy(xpath = "//div[@id='radiobuttons']//input") | ||||||
| 	private List<WebElement> radioButtons; | 	private List<WebElement> radioButtons; | ||||||
| 
 | 
 | ||||||
| 	private WebDriver driver = null; |  | ||||||
| 
 |  | ||||||
| 	public CheckboxesAndRadioButtonsPage(WebDriver driver) | 	public CheckboxesAndRadioButtonsPage(WebDriver driver) | ||||||
| 	{ | 	{ | ||||||
| 		this.driver = driver; | 		super(driver); | ||||||
| 		PageFactory.initElements(this.driver, this); | 		PageFactory.initElements(this.driver, this); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | package pages.webelements; | ||||||
|  | 
 | ||||||
|  | import org.openqa.selenium.Alert; | ||||||
|  | import org.openqa.selenium.WebDriver; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class ConfirmPanel extends BasePage | ||||||
|  | { | ||||||
|  | 	private Alert confirm = null; | ||||||
|  | 
 | ||||||
|  | 	public ConfirmPanel(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(driver); | ||||||
|  | 		confirm = driver.switchTo().alert(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public String getText() | ||||||
|  | 	{ | ||||||
|  | 		return confirm.getText(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void dismiss() | ||||||
|  | 	{ | ||||||
|  | 		confirm.dismiss(); | ||||||
|  | 		driver.switchTo().defaultContent(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,57 @@ | ||||||
|  | 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; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class DatePickersPage extends BasePage | ||||||
|  | { | ||||||
|  | 	@FindBy(xpath = "//button[contains(text(),'Date Pickers')]") | ||||||
|  | 	private WebElement accordionItem; | ||||||
|  | 
 | ||||||
|  | 	@FindBy(id = "html-datepicker") | ||||||
|  | 	private WebElement htmlDatePicker; | ||||||
|  | 
 | ||||||
|  | 	public DatePickersPage(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class FramesAndWindowsPage extends BasePage | ||||||
|  | { | ||||||
|  | 	@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; | ||||||
|  | 
 | ||||||
|  | 	public FramesAndWindowsPage(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(driver); | ||||||
|  | 		PageFactory.initElements(this.driver, this); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void clickOnAccordionItem() | ||||||
|  | 	{ | ||||||
|  | 		accordionItem.click(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public WebElement frame() | ||||||
|  | 	{ | ||||||
|  | 		return frame; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void clickNewWindowButton() | ||||||
|  | 	{ | ||||||
|  | 		newWindowButton.click(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class InputRangePage extends BasePage | ||||||
|  | { | ||||||
|  | 	@FindBy(xpath = "//button[contains(text(),'Input Range')]") | ||||||
|  | 	private WebElement accordionItem; | ||||||
|  | 
 | ||||||
|  | 	@FindBy(id = "range-input") | ||||||
|  | 	private WebElement rangeInput; | ||||||
|  | 
 | ||||||
|  | 	public InputRangePage(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -6,7 +6,9 @@ import org.openqa.selenium.WebElement; | ||||||
| import org.openqa.selenium.support.FindBy; | import org.openqa.selenium.support.FindBy; | ||||||
| import org.openqa.selenium.support.PageFactory; | 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')]") | 	@FindBy(xpath = "//button[contains(text(),'Inputs With UI Dialogs')]") | ||||||
| 	private WebElement accordionItem; | 	private WebElement accordionItem; | ||||||
|  | @ -17,11 +19,9 @@ public class InputsWithUIDialogsPage | ||||||
| 	@FindBy(id = "file-input") | 	@FindBy(id = "file-input") | ||||||
| 	private WebElement fileInput; | 	private WebElement fileInput; | ||||||
| 
 | 
 | ||||||
| 	private WebDriver driver = null; |  | ||||||
| 
 |  | ||||||
| 	public InputsWithUIDialogsPage(WebDriver driver) | 	public InputsWithUIDialogsPage(WebDriver driver) | ||||||
| 	{ | 	{ | ||||||
| 		this.driver = driver; | 		super(driver); | ||||||
| 		PageFactory.initElements(this.driver, this); | 		PageFactory.initElements(this.driver, this); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class JavaScriptPopupMessagesPage extends BasePage | ||||||
|  | { | ||||||
|  | 	@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; | ||||||
|  | 
 | ||||||
|  | 	public JavaScriptPopupMessagesPage(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -6,16 +6,16 @@ import org.openqa.selenium.support.FindBy; | ||||||
| import org.openqa.selenium.support.How; | import org.openqa.selenium.support.How; | ||||||
| import org.openqa.selenium.support.PageFactory; | 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") | 	@FindBy(how = How.ID, using = "form-interactions-modal-close-button") | ||||||
| 	private WebElement closeButton; | 	private WebElement closeButton; | ||||||
| 
 | 
 | ||||||
| 	private WebDriver driver = null; |  | ||||||
| 
 |  | ||||||
| 	public ModalDialogPage(WebDriver driver) | 	public ModalDialogPage(WebDriver driver) | ||||||
| 	{ | 	{ | ||||||
| 		this.driver = driver; | 		super(driver); | ||||||
| 		PageFactory.initElements(this.driver, this); | 		PageFactory.initElements(this.driver, this); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,7 +5,9 @@ import org.openqa.selenium.WebElement; | ||||||
| import org.openqa.selenium.support.FindBy; | import org.openqa.selenium.support.FindBy; | ||||||
| import org.openqa.selenium.support.PageFactory; | 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')]") | 	@FindBy(xpath = "//button[contains(text(),'Most Common Inputs')]") | ||||||
| 	private WebElement accordionItem; | 	private WebElement accordionItem; | ||||||
|  | @ -31,11 +33,9 @@ public class MostCommonInputsPage | ||||||
| 	@FindBy(id = "form-interactions-submit-button") | 	@FindBy(id = "form-interactions-submit-button") | ||||||
| 	private WebElement submitButton; | 	private WebElement submitButton; | ||||||
| 
 | 
 | ||||||
| 	private WebDriver driver = null; |  | ||||||
| 
 |  | ||||||
| 	public MostCommonInputsPage(WebDriver driver) | 	public MostCommonInputsPage(WebDriver driver) | ||||||
| 	{ | 	{ | ||||||
| 		this.driver = driver; | 		super(driver); | ||||||
| 		PageFactory.initElements(this.driver, this); | 		PageFactory.initElements(this.driver, this); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -83,16 +83,4 @@ public class MostCommonInputsPage | ||||||
| 	{ | 	{ | ||||||
| 		return readonlyInput.getAttribute("value"); | 		return readonlyInput.getAttribute("value"); | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	public void sleep(long millis) |  | ||||||
| 	{ |  | ||||||
| 		try |  | ||||||
| 		{ |  | ||||||
| 			Thread.sleep(millis); |  | ||||||
| 		} catch (InterruptedException e) |  | ||||||
| 		{ |  | ||||||
| 			e.printStackTrace(); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,53 @@ | ||||||
|  | package pages.webelements; | ||||||
|  | 
 | ||||||
|  | import java.util.Set; | ||||||
|  | 
 | ||||||
|  | import org.openqa.selenium.WebDriver; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class NewWindow extends BasePage | ||||||
|  | { | ||||||
|  | 	private String originalWindowHandle; | ||||||
|  | 
 | ||||||
|  | 	public NewWindow(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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<String> 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); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,33 @@ | ||||||
|  | package pages.webelements; | ||||||
|  | 
 | ||||||
|  | import org.openqa.selenium.Alert; | ||||||
|  | import org.openqa.selenium.WebDriver; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class PromptPanel extends BasePage | ||||||
|  | { | ||||||
|  | 	private Alert prompt = null; | ||||||
|  | 
 | ||||||
|  | 	public PromptPanel(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class SelectDatalistAndOptionsPage extends BasePage | ||||||
|  | { | ||||||
|  | 	@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<WebElement> selectOptions = null; | ||||||
|  | 
 | ||||||
|  | 	public SelectDatalistAndOptionsPage(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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; | ||||||
|  | 
 | ||||||
|  | import pages.BasePage; | ||||||
|  | 
 | ||||||
|  | public class TablesPage extends BasePage | ||||||
|  | { | ||||||
|  | 	@FindBy(xpath = "//button[contains(text(),'Tables')]") | ||||||
|  | 	private WebElement accordionItem; | ||||||
|  | 
 | ||||||
|  | 	@FindBy(xpath = ".//table[@id='products-batman']/descendant::*/tr") | ||||||
|  | 	private List<WebElement> rows; | ||||||
|  | 
 | ||||||
|  | 	List<WebElement> headerRow; | ||||||
|  | 
 | ||||||
|  | 	public TablesPage(WebDriver driver) | ||||||
|  | 	{ | ||||||
|  | 		super(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<WebElement> cellsInRow = row.findElements(By.xpath("td")); | ||||||
|  | 
 | ||||||
|  | 			String rowAsString = cellsInRow.stream().map(WebElement::getText).collect(Collectors.joining(", ")); | ||||||
|  | 			rowsAsString += rowAsString + '\n'; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return rowsAsString; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -1,12 +1,13 @@ | ||||||
| package waits; | package tests.waits; | ||||||
| 
 | 
 | ||||||
| import java.time.Duration; | import java.time.Duration; | ||||||
| 
 | 
 | ||||||
| import org.openqa.selenium.By; |  | ||||||
| import org.openqa.selenium.WebDriver; | import org.openqa.selenium.WebDriver; | ||||||
| import org.openqa.selenium.firefox.FirefoxDriver; | import org.openqa.selenium.firefox.FirefoxDriver; | ||||||
| 
 | 
 | ||||||
| public class ImplicitWait | import pages.waits.WaitingStrategiesPage; | ||||||
|  | 
 | ||||||
|  | public class ImplicitWaitTests | ||||||
| { | { | ||||||
| 	private static void sleep(long milliseconds) | 	private static void sleep(long milliseconds) | ||||||
| 	{ | 	{ | ||||||
|  | @ -25,14 +26,17 @@ public class ImplicitWait | ||||||
| 		// Specify path to WebDriver: | 		// Specify path to WebDriver: | ||||||
| 		System.setProperty("webdriver.gecko.driver", "/snap/bin/geckodriver"); | 		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(); | 		WebDriver driver = new FirefoxDriver(); | ||||||
| 		driver.manage().window().maximize(); | 		driver.manage().window().maximize(); | ||||||
| 		driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000)); | 		driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000)); | ||||||
| 		driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); | 		driver.get("https://ramoncaballero.dev/sdet/selenium-webdriver/playgrounds/"); | ||||||
| 
 | 
 | ||||||
| 		// Click on the Waiting Strategies accordion item: | 		// Instantiate the page model: | ||||||
| 		driver.findElement(By.xpath("//button[contains(text(),'Waiting Strategies')]")).click(); | 		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: | 		page.clickEnableOrDisableButton(); | ||||||
| 		driver.findElement(By.id("disabled-input-toggle")).click(); |  | ||||||
| 
 | 
 | ||||||
| 		// implicitlyWait is used when trying to find an element or elements that are not immediately available. | 		// 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 | 		// In this case, the disabled input is available (i.e. exists in the DOM), so we sleep the execution | ||||||
| 		// before continuing: | 		// before continuing: | ||||||
| 		sleep(1000); | 		sleep(1000); | ||||||
| 
 | 
 | ||||||
| 		// Enter some text in the input: | 		page.setEnabledOrDisabledInput("Implicit Wait with disabled elements"); | ||||||
| 		driver.findElement(By.id("disabled-input")).sendKeys("Implicit Wait with disabled elements"); |  | ||||||
| 
 | 
 | ||||||
| 		// ======================================================================================== // | 		// ======================================================================================== // | ||||||
| 		// | 		// | ||||||
|  | @ -57,16 +59,14 @@ public class ImplicitWait | ||||||
| 		// | 		// | ||||||
| 		// ======================================================================================== // | 		// ======================================================================================== // | ||||||
| 
 | 
 | ||||||
| 		// Click on the Hide button that will show the hidden input: | 		page.clickShowOrHideButton(); | ||||||
| 		driver.findElement(By.id("hidden-input-toggle")).click(); |  | ||||||
| 
 | 
 | ||||||
| 		// implicitlyWait is used when trying to find an element or elements that are not immediately available. | 		// 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 | 		// In this case, the hidden input is available (i.e. exists in the DOM), so we sleep the execution | ||||||
| 		// before continuing: | 		// before continuing: | ||||||
| 		sleep(1000); | 		sleep(1000); | ||||||
| 
 | 
 | ||||||
| 		// Enter some text in the input: | 		page.setShownOrHiddenInput("Implicit Wait with hidden elements"); | ||||||
| 		driver.findElement(By.id("hidden-input")).sendKeys("Implicit Wait with hidden elements"); |  | ||||||
| 
 | 
 | ||||||
| 		// ======================================================================================== // | 		// ======================================================================================== // | ||||||
| 		// | 		// | ||||||
|  | @ -74,14 +74,12 @@ public class ImplicitWait | ||||||
| 		// | 		// | ||||||
| 		// ======================================================================================== // | 		// ======================================================================================== // | ||||||
| 
 | 
 | ||||||
| 		// Click on the Add button that will add a new input: | 		page.clickAddOrRemoveButton(); | ||||||
| 		driver.findElement(By.id("add-remove-input-button")).click(); |  | ||||||
| 
 | 
 | ||||||
| 		// We don't need to sleep here, as the dynamic input doesn't exist in the DOM and implicitlyWait | 		// 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. | 		// will keep trying for the specified amount of time until the input is available. | ||||||
| 
 | 
 | ||||||
| 		// Enter some text in the input: | 		page.setDynamicInput("Implicit Wait with dynamic elements"); | ||||||
| 		driver.findElement(By.id("dynamic-input")).sendKeys("Implicit Wait with dynamic elements"); |  | ||||||
| 
 | 
 | ||||||
| 		// | 		// | ||||||
| 
 | 
 | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -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<String> 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(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -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(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -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<WebElement> 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(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -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<WebElement> rows = driver.findElements(By.xpath(".//table[@id='products-batman']/descendant::*/tr")); |  | ||||||
| 
 |  | ||||||
| 		// Take the cells of the 1st row (header row): |  | ||||||
| 		List<WebElement> 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<WebElement> 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(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue