Interview #6: How do you handle dropdowns in Selenium?

Handling dropdowns in Selenium with Java is a fundamental aspect of automating web applications. Dropdowns can come in two forms: standard HTML <select> elements and custom dropdowns built using JavaScript and CSS. Each type requires different techniques for interaction. This comprehensive guide will walk you through the methods for handling both standard and custom dropdowns in Selenium using Java.

Disclaimer: For QA-Testing Jobs, WhatsApp us @ 91-6232667387

Understanding Dropdowns

1. Standard HTML <select> Elements

Standard dropdowns are created using the <select> HTML tag, which allows users to choose one or more options from a list. Here’s a basic example:

<select id="countries">
<option value="us">United States</option>
<option value="ca">Canada</option>
<option value="uk">United Kingdom</option>
</select>

2. Custom Dropdowns

Custom dropdowns do not utilize the standard <select> tag; instead, they are typically styled divs or buttons that reveal a list of options upon interaction. Here’s an example:

<div class="dropdown">
<button class="dropbtn">Select Country</button>
<div class="dropdown-content">
<a href="#" data-value="us">United States</a>
<a href="#" data-value="ca">Canada</a>
<a href="#" data-value="uk">United Kingdom</a>
</div>
</div>

Handling Standard Dropdowns in Selenium

Selenium provides a built-in Select class specifically designed to interact with standard HTML dropdowns. Here's how to work with it in Java.

1. Selecting by Visible Text

To select an option by its visible text, you first need to locate the dropdown element and create a Select object.

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;
public class DropdownExample {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("url_of_your_page");
// Locate the dropdown element
WebElement dropdownElement = driver.findElement(By.id("countries"));
// Create a Select object
Select dropdown = new Select(dropdownElement);
// Select an option by visible text
dropdown.selectByVisibleText("Canada");
// Close the browser
driver.quit();
}
}

2. Selecting by Value

You can also select an option using its value attribute.

dropdown.selectByValue("uk");

3. Selecting by Index

If you know the index of the option, you can select it by index.

dropdown.selectByIndex(0); // Selects the first option

4. Deselecting Options

For multi-select dropdowns (i.e., <select multiple>), you can deselect options similarly.

dropdown.deselectByVisibleText("Canada");
dropdown.deselectByIndex(0);
dropdown.deselectByValue("uk");

5. Getting Selected Options

To retrieve the currently selected option, use:

WebElement selectedOption = dropdown.getFirstSelectedOption();
System.out.println("Selected: " + selectedOption.getText());
For multi-select dropdowns, you can retrieve all selected options:
List<WebElement> selectedOptions = dropdown.getAllSelectedOptions();
for (WebElement option : selectedOptions) {
System.out.println(option.getText());
}

Handling Custom Dropdowns in Selenium

Interacting with custom dropdowns involves simulating user actions since they do not have the same straightforward structure as standard dropdowns.

1. Opening the Dropdown

First, click the dropdown button to display the options.

WebElement dropdownButton = driver.findElement(By.className("dropbtn"));
dropdownButton.click();

2. Selecting an Option

After clicking the dropdown, you need to locate the desired option and click it. You can use various locators, such as XPath or CSS selectors, to find the options.

WebElement countryOption = driver.findElement(By.xpath("//a[@data-value='ca']"));
countryOption.click();

3. Waiting for Elements

Because the dropdown options may not be immediately available after clicking, it’s essential to use WebDriverWait to ensure the options are ready for interaction.

import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement countryOption = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@data-value='us']")));
countryOption.click();

Complete Example of Dropdown Handling

Here’s a complete example that combines both standard and custom dropdown handling within a single test case:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
public class DropdownTest {
public static void main(String[] args) {
// Set up the WebDriver and navigate to the page
WebDriver driver = new ChromeDriver();
driver.get("url_of_your_page");
// Handling standard dropdown
WebElement standardDropdown = driver.findElement(By.id("countries"));
Select select = new Select(standardDropdown);
select.selectByVisibleText("Canada");
// Handling custom dropdown
WebElement dropdownButton = driver.findElement(By.className("dropbtn"));
dropdownButton.click();
// Wait for the dropdown options to be visible and select one
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement customOption = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@data-value='us']")));
customOption.click();
// Close the browser
driver.quit();
}
}

Best Practices for Handling Dropdowns

  1. Use Explicit Waits: Always use explicit waits when working with dropdowns, especially custom ones, to ensure that elements are present and interactable before performing actions.
  2. Avoid Hardcoding Values: Use variables or constants for option values and texts, which makes your code cleaner and easier to maintain.
  3. Implement Error Handling: Wrap your dropdown interactions in try-catch blocks to handle potential exceptions gracefully, logging errors for debugging purposes.
  4. Utilize Page Object Model (POM): If your tests are complex, consider using the Page Object Model to encapsulate dropdown handling logic within dedicated classes. This will improve maintainability and readability.

Conclusion

Handling dropdowns in Selenium with Java requires a good understanding of the differences between standard and custom dropdown implementations. By using the Select class for standard dropdowns and leveraging WebDriver methods for custom dropdowns, you can effectively automate user interactions. Following best practices such as using explicit waits, avoiding hardcoded values, and employing the Page Object Model will lead to more robust and maintainable test scripts. This foundational knowledge will serve you well as you continue to develop automated tests for web applications.

Previous: Interview #5: What are page objects, and why are they used?

Interview #35: Write a Selenium script that checks for broken links on a webpage.

To check for broken links on a webpage using Selenium, you can follow a systematic approach: Retrieve all anchor (<a>) tags with href ...

Most Popular