Top 50 Selenium Automation Interview Questions for Software Testing

If you are preparing for software testing interviews, Selenium automation tool is one of the most demanded automation software you should prepare well. Interviewers usually check whether you understand not only basic commands, but also practical topics like locator strategy, waits, framework structure, and handling real-time UI issues. This guide is designed to help you answer Selenium questions with confidence using simple language and practical understanding. You can find below popular automation tools and their usage in the software testing industry.
Automation Tools and Their Uses
| Tool | Primary Use | Best For |
|---|---|---|
| Selenium | Web UI automation in real browsers | Cross-browser regression testing |
| Playwright | Fast modern web automation (Chromium, Firefox, WebKit) | Stable E2E tests for dynamic apps |
| Cypress | Frontend-focused test automation framework | Developer-friendly UI testing in CI |
| Appium | Mobile app automation (Android/iOS) | Native, hybrid, and mobile web app testing |
| Postman | API testing and API collections | Functional API validation and quick automation |
| Rest Assured | Code-based API automation (Java) | Robust API regression suites |
| JMeter | Performance and load testing | API and web performance validation |
| k6 | Scripted load testing | Developer-centric performance testing in CI/CD |
| TestNG | Test execution framework (Java) | Test structure, grouping, parallel runs, reports |
| JUnit | Unit/integration test framework (Java) | Code-level and automation test orchestration |
| Cucumber | BDD-style automation with Gherkin | Readable tests for business + QA collaboration |
| Robot Framework | Keyword-driven automation | Readable test cases with less coding |
| Jenkins | Continuous Integration / Continuous Delivery | Automated test execution in pipelines |
| GitHub Actions | Workflow automation in GitHub repos | CI pipelines for automated test runs |
| Allure Report | Rich test reporting and dashboards | Detailed automation result visualization |
Tip: Pick tools based on application type (web/mobile/API), team skill, and CI/CD needs.
1. What is Selenium?
Selenium is an open-source automation toolset used to test web applications in browsers. It automates actions like login, search, form submission, and checkout. It is popular because it supports multiple browsers and programming languages.
2. Why is Selenium used in testing?
Selenium helps execute repetitive test cases quickly and consistently. It is highly useful for regression testing in frequent release cycles. It also saves effort and improves test coverage.
3. What are Selenium components?
Main components are Selenium WebDriver, Selenium Grid, and Selenium IDE. WebDriver is used for code-based automation, Grid for parallel runs, and IDE for basic record-playback tasks.
Selenium WebDriver
Used for code-based automation of web browsers.
Selenium Grid
Used for parallel test execution across machines/browsers.
Selenium IDE
Used for basic record-and-playback tasks.
4. What is Selenium WebDriver?
WebDriver is Selenium’s core API for browser automation. It directly interacts with browser drivers and executes test commands. Most modern Selenium frameworks are built on WebDriver.
5. What is Selenium IDE?
Selenium IDE is a browser extension for recording and replaying test steps. It is useful for quick prototyping and beginner learning. Large projects generally use WebDriver code-based automation.
6. What is Selenium Grid?
Selenium Grid lets you run tests across multiple machines, browsers, and operating systems in parallel. It reduces suite execution time and improves cross-browser coverage.
7. Selenium 3 vs Selenium 4 (basic)?
Selenium 4 introduced improved W3C compliance, modern Grid architecture, better DevTools support, and relative locators. It offers better compatibility with modern browsers and frameworks.
8. What applications can Selenium automate?
Selenium automates web applications in browsers. It does not directly automate desktop apps or native mobile apps. For native mobile automation, Appium is generally used.
Can Automate
- Web applications in browsers
- Responsive web apps
- Cross-browser web flows (Chrome, Firefox, Edge, Safari)
- Form validation, login, checkout, navigation flows
Can’t Automate Directly
- Desktop applications (Windows/Mac native apps)
- Native mobile apps (Android/iOS)
- CAPTCHA verification flows
- Browser-level authentication popups (without workaround)
Related Tool Guidance
Use Appium for native mobile apps, and desktop automation tools (like WinAppDriver/AutoIt alternatives) for desktop apps.
Selenium remains best for browser-based automation.
9. Which programming languages are supported by Selenium?
Selenium supports Java, Python, C#, JavaScript, Ruby, and others. Most teams choose one based on ecosystem and team skill. You should be confident in at least one language.
Java
Most used in enterprise automation
Python
Simple syntax, fast scripting
C#
Popular in .NET ecosystems
JavaScript
Useful for Node.js test stacks
Ruby
Readable syntax, BDD-friendly
Quick Tip:
Choose the language based on your team stack, CI/CD tools, and long-term maintainability.
In interviews, deep practical knowledge of one language is better than shallow knowledge of many.
10. Which browsers are supported by Selenium?
Chrome, Firefox, Edge, Safari, and more (through browser drivers). Browser-driver version compatibility is very important for stable execution.
11. What is browser driver?
A browser driver acts as bridge between Selenium script and browser engine. Examples include ChromeDriver, GeckoDriver, and EdgeDriver. Without proper driver setup, tests cannot run.
A browser driver is the bridge between Selenium code and the actual browser.
It receives WebDriver commands and executes them in Chrome, Firefox, Edge, etc.
| Browser | Driver Name | Java Class Example |
|---|---|---|
| Google Chrome | ChromeDriver | new ChromeDriver() |
| Mozilla Firefox | GeckoDriver | new FirefoxDriver() |
| Microsoft Edge | EdgeDriver | new EdgeDriver() |
| Safari (macOS) | SafariDriver | new SafariDriver() |
Sample Code (Chrome)
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class DriverExample {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver(); // Browser driver created
driver.get("https://example.com");
driver.quit();
}
}
Important:
- Browser version and driver version should be compatible.
- If versions mismatch, session creation errors are common.
- In CI/CD, keep driver setup automated for consistency.
12. What is WebDriver interface?
WebDriver is a parent interface that defines browser operation methods. Classes like ChromeDriver implement this interface. This design helps create browser-independent code.
WebDriver is the main Selenium interface that defines methods to control browsers.
Browser-specific classes like ChromeDriver, FirefoxDriver, and EdgeDriver implement this interface.
| WebDriver Capability | Common Method | Purpose |
|---|---|---|
| Open URL | get("url") |
Launches target website |
| Page title | getTitle() |
Returns current page title |
| Find element | findElement(By...) |
Locates single element |
| Close browser | close(), quit() |
Ends tab/session |
| Current URL | getCurrentUrl() |
Returns active page URL |
Java Example (Interface Usage)
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class WebDriverInterfaceDemo {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver(); // interface reference
driver.get("https://example.com");
System.out.println("Title: " + driver.getTitle());
System.out.println("URL: " + driver.getCurrentUrl());
// Example element action
// driver.findElement(By.id("login")).click();
driver.quit();
}
}
Why interface matters:
Using WebDriver as reference type makes your code flexible.
You can switch from Chrome to Firefox/Edge with minimal code change.
13. How do you launch a browser in Selenium?
Initialize the respective browser driver and open URL using get(). Correct driver setup and browser compatibility must be ensured first.
Below example uses Java + Selenium WebDriver + Chrome.
Same concept applies to Firefox/Edge with their drivers.
Step 1: Add Selenium dependency
If using Maven, add Selenium Java in pom.xml.
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.20.0</version>
</dependency>
Step 2: Import required classes
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
Step 3: Create WebDriver object
WebDriver driver = new ChromeDriver();
Step 4: Open website URL
driver.get("https://www.google.com");
Step 5: Maximize and close browser
driver.manage().window().maximize();
driver.quit();
Complete Java Example
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class LaunchBrowserDemo {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver(); // Launch Chrome
driver.manage().window().maximize(); // Maximize window
driver.get("https://www.google.com"); // Open URL
// Add your test steps here
driver.quit(); // Close all browser windows and end session
}
}
Quick Notes:
- Keep browser and driver versions compatible.
- Use
quit()in teardown to avoid hanging sessions. - For Firefox, replace
ChromeDriverwithFirefoxDriver.
14. Difference between close() and quit()?
close() closes current window. quit() closes all browser windows and ends session. In teardown, quit() is generally preferred.
| Method | What It Does | When to Use |
|---|---|---|
| close() | Closes only the current browser window/tab. | Use when multiple tabs are open and you want to close only one. |
| quit() | Closes all browser windows and ends the WebDriver session. | Use at test end/teardown to fully clean up execution. |
Java Example
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
// Closes only current tab
driver.close();
// Recommended cleanup: closes all tabs and ends session
driver.quit();
Quick Tip:
In automation frameworks, prefer quit() in teardown methods to avoid leftover browser sessions.
15. What are locators in Selenium?
Locators identify web elements for interaction. Common locators are id, name, className, cssSelector, xpath, linkText, and tagName. Stable locators are key for reliable tests.
Locators help Selenium identify web elements for automation actions.
id
Best when unique and stable. Fast and reliable.
driver.findElement(By.id("email"));
name
Useful when id is missing but name is stable.
driver.findElement(By.name("password"));
className
Works for class-based elements, but avoid non-unique classes.
driver.findElement(By.className("login-btn"));
tagName
Useful for collections like links/images/buttons.
driver.findElements(By.tagName("a"));
linkText
Matches exact visible link text.
driver.findElement(By.linkText("Forgot Password?"));
partialLinkText
Matches partial text in anchor links.
driver.findElement(By.partialLinkText("Forgot"));
cssSelector
Fast, readable, and highly preferred in many frameworks.
driver.findElement(By.cssSelector("input#email"));
driver.findElement(By.cssSelector("button.btn.primary"));
xpath
Powerful for complex DOM paths and dynamic structures.
driver.findElement(By.xpath("//input[@id='email']"));
driver.findElement(By.xpath("//button[text()='Login']"));
Best Practice Order:
Prefer id → name → stable cssSelector → clean xpath.
Avoid brittle locators tied to dynamic classes/positions.
16. Which locator should be preferred?
Prefer unique and stable id when available. Otherwise use clean CSS selectors or robust XPath. Avoid dynamic/fragile locator strategies.
Prefer stable and unique locators. In most cases, id is the best choice.
If id is not available, use clean cssSelector or robust xpath.
| Priority | Locator | Why Preferred | Example |
|---|---|---|---|
| 1 | id | Usually unique, fast, and stable | By.id("email") |
| 2 | name | Simple and readable when unique | By.name("password") |
| 3 | cssSelector | Flexible, concise, commonly fast | By.cssSelector("button.btn-primary") |
| 4 | xpath | Powerful for complex DOM structures | By.xpath("//button[text()='Login']") |
| 5 | className / tagName / linkText | Use carefully; often less unique | By.linkText("Forgot Password?") |
Quick Rule:
Best locator is not just “short” locator — it should be stable, unique, and readable even after UI changes.
17. What is XPath?
XPath is a path expression used to locate elements in DOM. It is powerful for complex element structures, but should be kept simple for maintainability.
XPath in Detail (Quick Guide)
Useful for Selenium automation when stable IDs are not available.
1) What is XPath?
XPath (XML Path Language) is used to locate elements in the DOM using structure, attributes, text, and relationships.
2) Absolute XPath
Starts from root HTML node.
/html/body/div[2]/form/input[1]
Note: Very fragile when UI structure changes.
3) Relative XPath
Starts from anywhere using //.
//input[@id='email']
Best choice for maintainable Selenium scripts.
4) Most Used XPath Patterns
| Use Case | XPath |
|---|---|
| By single attribute | //button[@type='submit'] |
| By text | //button[text()='Login'] |
| Contains text | //div[contains(text(),'Welcome')] |
| Contains attribute value | //input[contains(@placeholder,'Email')] |
| Starts-with attribute | //input[starts-with(@id,'user_')] |
| Multiple conditions | //input[@type='text' and @name='username'] |
5) XPath Axes (Relationship-Based)
//label[text()='Email']/following::input[1]
//input[@id='email']/preceding::label[1]
//div[@class='card']//ancestor::section
//h2[text()='Profile']/parent::div
6) Indexing in XPath
(//button[@class='btn-primary'])[1]
(//input[@type='text'])[last()]
Use index only when no stable attribute exists.
7) XPath Best Practices
- Prefer stable attributes like
id,name,data-testid. - Avoid very long absolute XPath chains.
- Use
contains()carefully for dynamic values. - Keep XPath readable and reusable in Page Object classes.
- Pair XPath with explicit waits for stable execution.
18. CSS selector vs XPath?
CSS selectors are usually shorter and often faster. XPath is more flexible for hierarchy/text-based traversal. Use whichever is more stable and readable for your page.
| Comparison Point | CSS Selector | XPath |
|---|---|---|
| Speed | Generally faster in many browsers | Can be slightly slower in complex expressions |
| Readability | Usually shorter and cleaner | Can become long/complex if overused |
| Flexibility | Strong for attribute/class/id-based selection | Very powerful for DOM relationships and text matching |
| Text-based match | Not directly supported | Supported (e.g., text(), contains(text(),...)) |
| Parent/ancestor navigation | Limited | Strong support via axes (parent, ancestor, etc.) |
| Best use case | Stable UI with strong attributes | Complex/dynamic DOM where CSS is insufficient |
CSS Selector Examples
By.cssSelector("input#email")
By.cssSelector("button.btn-primary")
By.cssSelector("div.card .title")
XPath Examples
By.xpath("//input[@id='email']")
By.xpath("//button[text()='Login']")
By.xpath("//label[text()='Email']/following::input[1]")
Practical Rule:
Prefer CSS Selector for speed and cleaner syntax. Use XPath when you need text matching or complex parent-child traversal.
19. findElement vs findElements?
findElement returns first match and throws exception if none found. findElements returns list and gives empty list if no match exists.
| Point | findElement() | findElements() |
|---|---|---|
| Return Type | Single WebElement |
List of WebElement |
| If no element found | Throws NoSuchElementException |
Returns empty list (size() == 0) |
| Use Case | When exactly one element is expected | When multiple/optional elements are expected |
| Typical Example | Login button, username field | List of products, table rows, menu items |
findElement() Example
WebElement loginBtn = driver.findElement(By.id("login"));
loginBtn.click();
findElements() Example
List<WebElement> products = driver.findElements(By.cssSelector(".product-card"));
System.out.println("Total products: " + products.size());
Quick Tip:
Use findElement() for mandatory single elements and findElements() for optional or repeating elements.
This helps avoid unnecessary exceptions.
20. What is synchronization in Selenium?
Synchronization aligns script execution with application response timing. Without it, tests fail due to element timing issues. Correct wait strategy is crucial.
Synchronization means aligning Selenium script speed with application response time.
It prevents failures like element not found, element not clickable, and flaky test behavior.
| Wait Type | How It Works | Best Use Case |
|---|---|---|
| Implicit Wait | Global wait for element lookup across script | Basic setup for small/simple tests |
| Explicit Wait | Waits for a specific condition on a specific element | Dynamic pages and stable automation |
| Fluent Wait | Custom timeout + polling + ignored exceptions | Advanced unstable/delayed UI scenarios |
| Thread.sleep() | Hard-coded fixed pause (blind wait) | Temporary debugging only (not recommended for framework) |
Implicit Wait (Java)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
Explicit Wait (Java)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement loginBtn = wait.until(
ExpectedConditions.elementToBeClickable(By.id("login"))
);
loginBtn.click();
Fluent Wait (Java)
Wait<WebDriver> fluentWait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(20))
.pollingEvery(Duration.ofSeconds(2))
.ignoring(NoSuchElementException.class);
WebElement element = fluentWait.until(
d -> d.findElement(By.id("dynamicElement"))
);
Thread.sleep() (Avoid in framework)
Thread.sleep(5000); // waits blindly for 5 sec
Best Practice:
Prefer Explicit Wait for most scenarios. Keep synchronization condition-based, not time-based.
This makes tests faster and more stable.
21. What is implicit wait?
Implicit wait applies a global wait time for element searches. It is simple but less precise than explicit waits. Overuse can slow execution.
22. What is explicit wait?
Explicit wait waits for specific conditions like visibility or clickability. It is more controlled and preferred for dynamic web behavior.
23. What is FluentWait?
FluentWait allows custom timeout, polling intervals, and exception handling. It is useful for unstable loading patterns where default waits are not enough.
Implicit Wait vs Explicit Wait vs FluentWait
Implicit Wait
Type: Global wait
Scope: All element lookups
Best for: Basic test setup
Limitation: Less precise, can slow overall tests
Explicit Wait
Type: Condition-based wait
Scope: Specific element/action
Best for: Dynamic UI synchronization
Advantage: Most stable and recommended
FluentWait
Type: Advanced explicit wait
Scope: Custom timeout + polling
Best for: Unstable/delayed elements
Advantage: Fine-grained control
| Parameter | Implicit Wait | Explicit Wait | FluentWait |
|---|---|---|---|
| Applied on | Whole driver session | Specific condition | Specific condition |
| Condition support | No | Yes | Yes (advanced) |
| Polling control | No | Default polling | Custom polling interval |
| Exception handling | Limited | Basic | Custom ignored exceptions |
| Recommended usage | Minimal/global setup | Most test scenarios | Complex dynamic scenarios |
Quick Rule:
Use Explicit Wait by default. Use FluentWait when you need custom polling/exception handling.
Keep Implicit Wait low or minimal to avoid hidden delays.
24. Why avoid Thread.sleep()?
It pauses blindly and increases test runtime unnecessarily. It can still fail if page takes longer than fixed sleep value. Condition-based waits are better.
25. How do you handle dropdowns?
For standard <select> dropdowns, use Selenium Select class methods. For custom dropdowns, treat them as normal clickable elements.
In Selenium, dropdown handling depends on the HTML type:
standard dropdown (<select>) vs custom dropdown (div/li based).
1) Standard Dropdown (<select> tag)
Use Selenium Select class.
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;
// Locate dropdown element
WebElement countryDropdown = driver.findElement(By.id("country"));
// Create Select object
Select select = new Select(countryDropdown);
// Select options
select.selectByVisibleText("India");
select.selectByValue("IN");
select.selectByIndex(3);
// Get selected option
String selected = select.getFirstSelectedOption().getText();
2) Custom Dropdown (non-select)
Handle it like normal clickable elements.
// Click dropdown to open options
driver.findElement(By.id("cityDropdown")).click();
// Click desired option
driver.findElement(By.xpath("//li[text()='Mumbai']")).click();
Validation Example
// Validate selected value in standard dropdown
Select s = new Select(driver.findElement(By.id("country")));
String actual = s.getFirstSelectedOption().getText();
Assert.assertEquals(actual, "India");
Best Practices:
- Inspect HTML first: if tag is
<select>, useSelectclass. - Use explicit waits before clicking dropdown/options on dynamic pages.
- Always validate selected value after selection.
- For multi-select dropdowns, check
isMultiple()before deselect operations.
26. How do you handle alerts?
Switch to alert with switchTo().alert(), then accept, dismiss, read text, or send input. Context switch is mandatory before alert actions.
Selenium handles JavaScript alerts using the Alert interface.
You must switch to alert first, then perform action like accept() or dismiss().
| Alert Action | Method | Use Case |
|---|---|---|
| Accept alert | alert.accept() |
Click OK / Yes |
| Dismiss alert | alert.dismiss() |
Click Cancel / No |
| Read alert text | alert.getText() |
Validate message content |
| Send text (prompt alert) | alert.sendKeys("text") |
Input into prompt dialog |
Basic Alert Example
import org.openqa.selenium.Alert;
// Switch to alert
Alert alert = driver.switchTo().alert();
// Read text
String msg = alert.getText();
// Click OK
alert.accept();
Prompt Alert Example
Alert prompt = driver.switchTo().alert();
prompt.sendKeys("Test User");
prompt.accept();
Using Explicit Wait for Alert
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
alert.accept();
Best Practices:
- Always switch to alert before interacting.
- Use explicit wait if alert appears after delay.
- Validate alert text for business/message correctness.
- Handle
NoAlertPresentExceptionin unstable flows.
27. How do you handle frames/iframes?
Switch to frame using index, name/id, or WebElement. After actions, switch back with defaultContent().
Elements inside a frame/iframe are in a different DOM context.
Selenium cannot interact with them until you switch to that frame.
| Switch Method | Example | When to Use |
|---|---|---|
| By index | driver.switchTo().frame(0); |
When frame order is stable |
| By name/id | driver.switchTo().frame("paymentFrame"); |
When frame name/id exists |
| By WebElement | driver.switchTo().frame(frameElement); |
Most reliable when located explicitly |
Example: Switch by name/id
driver.switchTo().frame("loginFrame");
driver.findElement(By.id("username")).sendKeys("testuser");
driver.findElement(By.id("password")).sendKeys("pass123");
driver.findElement(By.id("loginBtn")).click();
Example: Switch by WebElement
WebElement frame = driver.findElement(By.cssSelector("iframe#payment-frame"));
driver.switchTo().frame(frame);
driver.findElement(By.id("cardNumber")).sendKeys("4111111111111111");
How to Return from Frame
// Go back to parent frame
driver.switchTo().parentFrame();
// Go back to main page DOM
driver.switchTo().defaultContent();
Nested Frame Example
driver.switchTo().frame("outerFrame");
driver.switchTo().frame("innerFrame");
driver.findElement(By.id("submit")).click();
driver.switchTo().defaultContent();
Best Practices:
- Always confirm if element is inside iframe before locating.
- Prefer switching by WebElement for better stability.
- Use
defaultContent()after frame actions to avoid locator failures. - For dynamic iframes, use explicit wait before switching.
28. How do you handle multiple windows/tabs?
Use window handles to switch between parent and child windows. Perform actions in target window and then switch back safely.
Selenium uses window handles to switch between browser windows/tabs.
Every open tab/window has a unique handle (ID).
| Step | Purpose | Key Method |
|---|---|---|
| 1 | Capture parent window handle | driver.getWindowHandle() |
| 2 | Open/click action that launches new tab | Normal click + wait |
| 3 | Get all handles | driver.getWindowHandles() |
| 4 | Switch to target child window | driver.switchTo().window(handle) |
| 5 | Do actions, close child, return to parent | driver.close() + switchTo() |
Java Example (Parent -> Child -> Parent)
// Store parent window
String parentWindow = driver.getWindowHandle();
// Click link/button that opens new tab
driver.findElement(By.id("openNewTab")).click();
// Get all windows
Set<String> allWindows = driver.getWindowHandles();
// Switch to child window
for (String window : allWindows) {
if (!window.equals(parentWindow)) {
driver.switchTo().window(window);
break;
}
}
// Perform actions in child window
System.out.println("Child Title: " + driver.getTitle());
// Close child and switch back
driver.close();
driver.switchTo().window(parentWindow);
Open New Tab via JavaScript (Optional)
((JavascriptExecutor) driver).executeScript("window.open('https://example.com', '_blank');");
Best Practices:
- Always store parent window handle before opening new tabs.
- Use explicit wait if new tab loads slowly.
- After closing child window, switch back to parent before next action.
- Never assume tab order; rely on handles.
29. How do you perform mouse actions?
Use Actions class for hover, right-click, drag-drop, and double-click operations. It is useful for advanced UI controls.
Selenium uses the Actions class to handle advanced mouse interactions
like hover, right-click, double-click, and drag-and-drop.
| Mouse Action | Method | Use Case |
|---|---|---|
| Hover | moveToElement() |
Open hidden menus/tooltips |
| Right Click | contextClick() |
Context menu validation |
| Double Click | doubleClick() |
Open/edit actions on double-click events |
| Drag and Drop | dragAndDrop() |
Move card/item between zones |
| Click and Hold | clickAndHold() |
Slider or long-press style actions |
Java Setup
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
Actions actions = new Actions(driver);
Hover Example
WebElement menu = driver.findElement(By.id("menu"));
actions.moveToElement(menu).perform();
Right Click Example
WebElement file = driver.findElement(By.id("fileOption"));
actions.contextClick(file).perform();
Double Click Example
WebElement card = driver.findElement(By.id("editCard"));
actions.doubleClick(card).perform();
Drag and Drop Example
WebElement source = driver.findElement(By.id("dragItem"));
WebElement target = driver.findElement(By.id("dropZone"));
actions.dragAndDrop(source, target).perform();
Best Practices:
- Use explicit waits before mouse actions on dynamic UI.
- Always finish chain with
.perform(). - Validate result after action (menu visible, item moved, etc.).
- For flaky drag-drop UIs, consider click-hold/move/release sequence.
30. How do you perform keyboard actions?
Use sendKeys() and Actions class for key combinations like ENTER, TAB, CTRL+A. Helpful for shortcut and form flow testing.
Selenium supports keyboard actions using sendKeys() and the Actions class.
You can type text, press special keys, and perform shortcut combinations.
| Action Type | Method | Example Use |
|---|---|---|
| Type text | element.sendKeys("text") |
Enter username/password |
| Special key | element.sendKeys(Keys.ENTER) |
Submit form/search |
| Shortcut combo | Actions + keyDown/keyUp |
CTRL+A, CTRL+C, CTRL+V |
| Global key action | actions.sendKeys(Keys.TAB) |
Move focus between fields |
Java Imports
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
1) Type Text + ENTER
WebElement searchBox = driver.findElement(By.id("search"));
searchBox.sendKeys("Selenium");
searchBox.sendKeys(Keys.ENTER);
2) TAB Navigation
Actions actions = new Actions(driver);
actions.sendKeys(Keys.TAB).perform();
3) Keyboard Shortcut (CTRL + A)
WebElement input = driver.findElement(By.id("username"));
input.click();
Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL)
.sendKeys("a")
.keyUp(Keys.CONTROL)
.perform();
4) ESC Key Example
Actions actions = new Actions(driver);
actions.sendKeys(Keys.ESCAPE).perform();
Best Practices:
- Click/focus element before sending keyboard shortcuts.
- Use explicit waits if input fields load dynamically.
- Validate outcome after key action (search result, focus change, form submit).
- For cross-platform tests, check CMD vs CTRL behavior where needed.
31. How do you upload files?
For file input elements, use sendKeys(filePath). This avoids OS dialog handling in most standard upload controls.
In Selenium, file upload is usually done by sending the file path to an
<input type="file"> element using sendKeys().
This is the most reliable and standard approach.
| Scenario | Recommended Approach | Notes |
|---|---|---|
| Standard file input is visible | sendKeys(filePath) |
Best and simplest method |
| File input is hidden | Use JS to make input visible (if allowed), then sendKeys() |
Avoid OS-level popup handling where possible |
| Custom upload widget | Find underlying input element and send file path | Inspect DOM carefully before coding |
Basic Java Example (Recommended)
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
// Locate file input element
WebElement uploadInput = driver.findElement(By.id("fileUpload"));
// Provide absolute file path
uploadInput.sendKeys("C:\\\\Users\\\\jicha\\\\Documents\\\\resume.pdf");
// Optional: click upload button if needed
driver.findElement(By.id("uploadBtn")).click();
If Input is Hidden (Optional JavaScript Workaround)
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
WebElement hiddenInput = driver.findElement(By.cssSelector("input[type='file']"));
// Make input visible (if app allows)
((JavascriptExecutor) driver).executeScript("arguments[0].style.display='block';", hiddenInput);
// Upload file
hiddenInput.sendKeys("C:\\\\Users\\\\jicha\\\\Documents\\\\sample.png");
Best Practices:
- Always use absolute file path in automation scripts.
- Verify file type and size validation behavior (positive + negative cases).
- Use explicit wait before interacting with upload controls on dynamic pages.
- Validate success message and backend/file preview after upload.
32. How do you take screenshots?
Use TakesScreenshot interface and save output file. Screenshots are valuable for failure evidence in reports.
Selenium takes screenshots using the TakesScreenshot interface.
Screenshots are very useful for debugging test failures and attaching evidence in reports.
| Screenshot Type | Use Case | Method |
|---|---|---|
| Full page viewport screenshot | General evidence for pass/fail state | ((TakesScreenshot) driver).getScreenshotAs(...) |
| Element screenshot (Selenium 4) | Capture only specific failing element | element.getScreenshotAs(...) |
1) Full Browser Screenshot (Java)
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.io.FileHandler;
import java.io.File;
// Capture screenshot
File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
// Save to destination
File dest = new File("C:\\\\Screenshots\\\\home_page.png");
FileHandler.copy(src, dest);
2) Element Screenshot (Java, Selenium 4+)
import org.openqa.selenium.WebElement;
WebElement logo = driver.findElement(By.id("siteLogo"));
File srcElement = logo.getScreenshotAs(OutputType.FILE);
File destElement = new File("C:\\\\Screenshots\\\\logo.png");
FileHandler.copy(srcElement, destElement);
3) Auto Screenshot on Test Failure (TestNG example concept)
@AfterMethod
public void captureOnFailure(ITestResult result) throws Exception {
if (result.getStatus() == ITestResult.FAILURE) {
File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
File dest = new File("C:\\\\Screenshots\\\\" + result.getName() + ".png");
FileHandler.copy(src, dest);
}
}
Best Practices:
- Capture screenshots on failure automatically via framework hooks.
- Use timestamp in file names to avoid overwrite.
- Store screenshots in report-friendly folder structure.
- For dynamic pages, wait for stable UI state before capture.
33. What is JavascriptExecutor?
It executes JavaScript in browser context for actions like scroll/click when normal WebDriver methods are limited. Use it selectively, not as default approach.
34. What is Page Object Model (POM)?
POM is a framework design pattern where each page has separate class with locators and reusable methods. It improves readability and maintenance.
35. What is Page Factory?
Page Factory uses annotations like @FindBy to initialize page elements. It reduces boilerplate but should be used with clean structure and stable locators.
36. What is data-driven testing?
Data-driven testing runs the same test with multiple input datasets. It improves coverage and avoids duplicate test code.
37. What is keyword-driven testing?
Keyword-driven testing maps reusable actions to business keywords (like Login, AddToCart). It can improve reusability if framework is designed properly.
38. How is Selenium used with TestNG/JUnit?
Selenium performs browser actions, while TestNG/JUnit manages test execution, assertions, and setup/teardown. Together they form complete automation flow.
39. What are assertions?
Assertions verify expected vs actual outcomes. Without assertions, tests only perform actions and do not validate functionality.
40. How do you run tests in parallel?
Use framework parallel settings (like TestNG) with Selenium Grid or cloud. Parallel runs reduce execution time significantly.
41. What is headless execution?
Headless mode runs browser without UI. It is faster for CI runs, but occasional headed runs help visual debugging.
42. How do you handle dynamic elements?
Use stable locators, explicit waits, and re-location after DOM refresh. Avoid absolute XPath and hard waits.
Dynamic elements are those whose attributes, position, or visibility change at runtime.
In Selenium, handle them using stable locator strategy + explicit waits + re-location.
| Challenge | Recommended Approach | Example |
|---|---|---|
| ID/class changes dynamically | Use contains/starts-with in XPath or stable CSS attributes | //input[contains(@id,'user_')] |
| Element appears after delay | Use explicit wait for visibility/clickability | ExpectedConditions.visibilityOfElementLocated(...) |
| Element becomes stale after refresh | Re-locate element before action | Catch stale exception + refetch element |
| List/table content changes | Use dynamic XPath/CSS with index/text filters | //table//tr[td[text()='Order123']] |
1) Use Explicit Wait for Dynamic Visibility
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement btn = wait.until(
ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(text(),'Submit')]"))
);
btn.click();
2) Handle Dynamic ID with XPath Contains
WebElement input = driver.findElement(
By.xpath("//input[contains(@id,'email_')]")
);
input.sendKeys("test@mail.com");
3) Handle Stale Element (Refetch)
try {
driver.findElement(By.id("saveBtn")).click();
} catch (StaleElementReferenceException e) {
WebElement save = driver.findElement(By.id("saveBtn"));
save.click();
}
4) Dynamic List Item Click by Text
String productName = "Laptop Pro";
driver.findElement(By.xpath("//div[@class='product-name' and text()='" + productName + "']")).click();
Best Practices:
- Prefer stable attributes like
data-testid,name, and meaningful CSS classes. - Use explicit wait instead of
Thread.sleep(). - Keep XPath readable; avoid long fragile absolute paths.
- Re-locate elements after page refresh/AJAX updates.
- Validate element state (
isDisplayed(),isEnabled()) before action.
43. Why do Selenium tests become flaky?
Common reasons: timing issues, weak locators, shared test data, popups, and unstable environments. Flaky tests reduce trust in automation.
44. What is StaleElementReferenceException?
It occurs when element reference becomes invalid after DOM change. Re-find element and retry with proper synchronization.
45. How do you design a strong Selenium framework?
Use layered architecture with config, data, page classes, utility methods, reports, and CI integration. Framework should prioritize readability and maintainability.
A strong Selenium framework is not just about running tests — it should be stable, reusable, easy to debug, and simple for the team to maintain.
1) Core Goals Before Coding
- Readable test code for any tester in the team
- Reusable components to avoid duplication
- Stable execution using proper waits and retry strategy
- Clear reports with screenshots/logs for failures
- Easy CI/CD integration (Jenkins, GitHub Actions, etc.)
2) Choose the Right Design Pattern
Use Page Object Model (POM) to separate page locators/actions from test logic. This keeps tests clean and reduces maintenance when UI changes.
3) Build Reusable Base Layer
Create common utilities for browser setup, waits, screenshots, logging, config reading, and test data loading. Reuse these across all tests.
4) Externalize Test Data
Keep credentials and input data outside test classes (JSON/Excel/CSV/env/config). This makes tests safer and easier to run in multiple environments.
5) Recommended Folder Structure
project-root/ ├─ src/test/java/tests ├─ src/test/java/pages ├─ src/test/java/utils ├─ src/test/java/base ├─ src/test/resources/testdata ├─ src/test/resources/config ├─ reports/ └─ screenshots/
6) Strong Framework Checklist
- Driver management: automatic browser driver setup
- Smart waits: prefer explicit/fluent waits over hard sleeps
- Assertions: clear, meaningful validation messages
- Logging: step-level logs to trace failures quickly
- Reporting: HTML reports with screenshots
- Parallel run: faster suites using TestNG/JUnit parallel config
- Environment support: dev/qa/stage config switching
- CI pipeline: auto-run on code push and scheduled builds
7) Common Mistakes to Avoid
- Putting locators directly inside test methods
- Using too many
Thread.sleep()calls - Hardcoding test data and URLs
- Not capturing screenshots/logs on failure
- Writing very long end-to-end tests without modularity
Quick Summary
A strong Selenium framework is modular + maintainable + stable + report-friendly.
If your team can add new tests quickly, debug failures fast, and run reliably in CI, your framework is strong.
46. Can Selenium test APIs or DB directly?
Selenium is for UI/browser automation. API/DB validations are done with separate tools/libraries and often integrated in same test workflow.
47. How do you maintain Selenium scripts long term?
Keep locators stable, refactor regularly, remove obsolete tests, and monitor flaky patterns. Maintenance is essential for long-term automation value.
48. Role of CI/CD in Selenium automation?
CI/CD runs tests on each build/deploy to catch regressions early. It provides fast quality feedback and improves release confidence.
CI/CD makes Selenium testing continuous, faster, and dependable by running tests automatically on every code change and before every release.
What CI/CD Means for QA
- CI (Continuous Integration): every code commit triggers build + automated Selenium tests.
- CD (Continuous Delivery/Deployment): tested code moves safely through QA/stage/prod pipelines.
- Result: defects are detected early, not at the end of release.
1) Fast Feedback
Selenium suites run automatically after each push/PR, so teams know quickly if a change broke login, checkout, payments, or other critical flows.
2) Better Release Confidence
Only code that passes test gates progresses to the next stage. This reduces production bugs and gives stronger go/no-go decisions.
3) Consistent Test Execution
CI/CD runs tests in a standardized environment, minimizing “works on my machine” issues and improving result reliability.
Typical Selenium CI/CD Flow
- Developer pushes code to Git.
- Pipeline starts (Jenkins / GitHub Actions / GitLab CI / Azure DevOps).
- Build + dependency install + environment setup.
- Selenium smoke/regression tests execute.
- Reports/screenshots are generated and shared.
- Pass: deploy to next environment. Fail: block pipeline and notify team.
Best Practices
- Run smoke tests on every commit, full regression on schedule/nightly.
- Use parallel execution with Selenium Grid/cloud for speed.
- Store env configs externally (dev/qa/stage/prod).
- Add auto screenshot/video/log capture on failures.
- Keep flaky tests isolated and fix quickly.
Common Pitfalls
- Running only full regression for every tiny commit (slow pipelines).
- No test categorization (smoke/sanity/regression).
- Ignoring flaky test trends and unstable environments.
- Not sharing readable reports with developers/product owners.
Quick Take
CI/CD turns Selenium from a manual activity into an automated quality gate.
It improves speed, consistency, and release safety — exactly what modern QA teams need.
49. What should be automated first?
Automate stable, repetitive, high-impact regression flows first. Avoid unstable or one-time flows in early stages.
50. What makes a strong Selenium automation tester?
A strong tester combines coding ability, QA thinking, debugging skill, and framework discipline. They focus on stable coverage and clear defect evidence, not just script count.
Quick Clarity: Selenium Basics
WebDriver
Core Selenium component for code-based browser automation.
Grid
Runs tests in parallel across multiple browsers and machines.
IDE
Simple record-and-playback tool for quick test creation.
Locators
Identify elements using id, name, CSS, XPath, etc.
Waits
Use Explicit/Fluent waits to handle dynamic loading reliably.
POM
Page Object Model improves code readability and maintenance.
Assertions
Validate expected vs actual result in automated tests.
CI/CD Integration
Run Selenium tests on each build for fast release feedback.
Selenium interview success is not about memorizing definitions—it is about explaining how you would solve real automation challenges in projects. When you can clearly discuss synchronization, flaky test handling, reusable framework design, and CI/CD integration, you stand out as a reliable automation professional. These 50 questions can be helpful, you should practice regularly, and then you will be better prepared for both interviews and day-to-day automation work.
Discover more from Newskart
Subscribe to get the latest posts sent to your email.

[…] reporting, test data, and CI/CD integration features. Since Katalon Studio is built on top of Selenium framework, even it provides capabilities to create and execute tests across diverse applications such as Web […]
[…] from above QnA, you should also understand the differences among webdriverIO vs Selenium vs Cypress vs Playwright vs Testcafe. We’ve given the comparison among these tools as follows […]