Auto-complete field handling in Selenium Java - Build an Automation Script
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.time.Duration; import java.util.List; public class AutoCompleteTest { private WebDriver driver; private WebDriverWait wait; @BeforeClass public void setUp() { driver = new ChromeDriver(); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); driver.get("https://example.com/search"); } @Test public void testAutoCompleteSelection() { // Locate the auto-complete input field by ID WebElement autoCompleteInput = wait.until(ExpectedConditions.elementToBeClickable(By.id("search-input"))); autoCompleteInput.click(); autoCompleteInput.clear(); autoCompleteInput.sendKeys("app"); // Wait for suggestion list to be visible WebElement suggestionList = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("suggestion-list"))); // Verify suggestions contain 'app' List<WebElement> suggestions = suggestionList.findElements(By.tagName("li")); Assert.assertFalse(suggestions.isEmpty(), "Suggestion list should not be empty"); boolean foundApple = false; for (WebElement suggestion : suggestions) { String text = suggestion.getText().toLowerCase(); Assert.assertTrue(text.contains("app"), "Suggestion '" + text + "' should contain 'app'"); if (text.equals("apple")) { foundApple = true; } } Assert.assertTrue(foundApple, "Suggestion list should contain 'apple'"); // Click on the 'apple' suggestion for (WebElement suggestion : suggestions) { if (suggestion.getText().equalsIgnoreCase("apple")) { suggestion.click(); break; } } // Verify input field value updated to 'apple' String inputValue = autoCompleteInput.getAttribute("value"); Assert.assertEquals(inputValue, "apple", "Input field value should be 'apple' after selection"); } @AfterClass public void tearDown() { if (driver != null) { driver.quit(); } } }
This test uses Selenium WebDriver with Java to automate the auto-complete field handling.
Setup: We open the browser and navigate to the search page.
Test steps: We locate the input field by its ID and type 'app'. We wait explicitly for the suggestion list to appear to avoid timing issues.
We then verify the suggestions contain the substring 'app' and specifically check that 'apple' is present.
Next, we click the 'apple' suggestion and verify the input field updates to 'apple'.
Teardown: We close the browser after the test.
This approach uses explicit waits to handle dynamic content and stable locators for reliability. Assertions confirm the expected behavior at each step.
Now add data-driven testing with 3 different inputs: 'app', 'ban', 'che'. Verify suggestions and selection for each.
Practice
Solution
Step 1: Understand auto-complete behavior
Auto-complete fields show suggestions dynamically as the user types.Step 2: Purpose of handling in Selenium
We need to select the correct suggestion from the list to simulate user interaction accurately.Final Answer:
To select the correct suggestion from the dynamic list based on user input -> Option DQuick Check:
Auto-complete handling = selecting suggestion [OK]
- Trying to disable auto-complete instead of selecting
- Ignoring dynamic suggestion list
- Submitting form without input
Solution
Step 1: Identify correct wait usage
Explicit wait with WebDriverWait and ExpectedConditions waits for element visibility properly.Step 2: Compare with other options
driver.findElement(By.id("suggestions")).click(); clicks without waiting, C uses Thread.sleep which is not best practice, D uses implicit wait which is less reliable for dynamic elements.Final Answer:
new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.visibilityOfElementLocated(By.id("suggestions"))); -> Option AQuick Check:
Explicit wait for visibility = new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.visibilityOfElementLocated(By.id("suggestions"))); [OK]
- Using Thread.sleep instead of explicit wait
- Relying only on implicit waits
- Clicking before element is visible
driver.findElement(By.id("searchBox")).sendKeys("App");
new WebDriverWait(driver, Duration.ofSeconds(5))
.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("ul.suggestions li")));
List<WebElement> options = driver.findElements(By.cssSelector("ul.suggestions li"));
for (WebElement option : options) {
if (option.getText().equals("Apple")) {
option.click();
break;
}
}
String value = driver.findElement(By.id("searchBox")).getAttribute("value");Solution
Step 1: Analyze input and wait
The code types "App" and waits for suggestions to appear.Step 2: Select matching suggestion
It loops through suggestions and clicks the one with text "Apple".Step 3: Check input value after click
Clicking "Apple" updates the input field value to "Apple".Final Answer:
"Apple" -> Option BQuick Check:
Selected suggestion text = input value [OK]
- Assuming input stays as typed text
- Ignoring wait for suggestions
- Expecting empty input after click
driver.findElement(By.id("searchBox")).sendKeys("Ban");
List<WebElement> options = driver.findElements(By.cssSelector("ul.suggestions li"));
for (WebElement option : options) {
if (option.getText().equals("Banana")) {
option.click();
}
}Solution
Step 1: Check for wait usage
The code finds suggestions immediately after typing without waiting for them to appear.Step 2: Consequence of missing wait
Without explicit wait, options list may be empty causing no click action.Final Answer:
Missing explicit wait for suggestions to appear before finding elements -> Option AQuick Check:
Wait before findElements = Missing explicit wait for suggestions to appear before finding elements [OK]
- Skipping explicit wait causing empty list
- Assuming suggestions load instantly
- Not breaking loop after click
ul with class "autocomplete-list" and each suggestion is a li. Which approach correctly handles this scenario including waiting and verification?Solution
Step 1: Send partial keys and wait explicitly
Typing "Che" triggers suggestions; explicit wait ensures suggestions are visible before interaction.Step 2: Find and click correct suggestion, then verify
Find alllielements, click the one with text "Cherry", then assert input value matches to confirm selection.Final Answer:
Send keys "Che" to input, wait explicitly for visibility oful.autocomplete-list, find allli, click the one with text "Cherry", then assert input value equals "Cherry" -> Option CQuick Check:
Explicit wait + correct click + assert input value = Send keys "Che" to input, wait explicitly for visibility oful.autocomplete-list, find allli, click the one with text "Cherry", then assert input value equals "Cherry" [OK]
- Not waiting explicitly for suggestions
- Clicking wrong suggestion or without verification
- Using Thread.sleep instead of explicit wait
Ready to prove it?
Pass the test and this pattern moves unknown
