Interview Prep
Selenium Interview Questions

Selenium Interview Questions: From Basics to Advanced WebDriver Concepts

Parul Dhingra - Senior Quality Analyst
Parul Dhingra13+ Years ExperienceHire Me

Senior Quality Analyst

Updated: 1/23/2026

Selenium remains the most widely used web automation framework, and interview questions about it range from basic concepts to complex architectural decisions. This guide covers the questions you're likely to face, organized by difficulty level.

Selenium Fundamentals

Q: What is Selenium and what are its components?

Answer: Selenium is an open-source suite for automating web browsers:

ComponentPurpose
Selenium WebDriverProgrammatic browser control via native browser APIs
Selenium IDERecord-and-playback browser extension
Selenium GridDistributed test execution across machines/browsers

Key characteristics:

  • Supports multiple browsers (Chrome, Firefox, Safari, Edge)
  • Supports multiple languages (Java, Python, JavaScript, C#, Ruby)
  • Open source with large community
  • Industry standard for web automation

Q: What are the advantages and limitations of Selenium?

Answer:

Advantages:

  • Open source (no licensing cost)
  • Multi-browser and multi-language support
  • Large community and ecosystem
  • Integration with testing frameworks
  • Extensible and customizable

Limitations:

  • Web applications only (no desktop/mobile native)
  • No built-in reporting
  • No image-based testing
  • Requires programming knowledge
  • Browser driver management
  • Can be flaky without proper waits

Q: What is the difference between Selenium 3 and Selenium 4?

Answer:

FeatureSelenium 3Selenium 4
ProtocolJSON Wire ProtocolW3C WebDriver Protocol
Relative locatorsNot availableAdded (above, below, near, etc.)
Chrome DevToolsNot integratedNative integration
New window/tabWorkarounds neededdriver.switchTo().newWindow()
Full-page screenshotElement onlyFull page supported
GridHub and nodes separateStandalone, Hub, Node, Distributed modes
// Selenium 4 relative locator example
WebElement element = driver.findElement(with(By.tagName("input"))
    .below(By.id("username"))
    .toRightOf(By.id("label")));

Q: Explain the Selenium WebDriver architecture.

Answer:

Test Script (Java/Python/etc.)

    WebDriver API

    Browser Driver (chromedriver, geckodriver)

    Browser (Chrome, Firefox)

How it works:

  1. Test script calls WebDriver API methods
  2. WebDriver API translates calls to HTTP requests
  3. Browser driver receives requests, communicates with browser
  4. Browser performs actions, returns results
  5. Results flow back through the chain

Key components:

  • Language bindings: Java, Python, etc. client libraries
  • JSON Wire/W3C Protocol: Communication standard
  • Browser drivers: Bridge between API and browsers
  • Browsers: Execute actual automation

Locators and Element Identification

Q: What locator strategies does Selenium support?

Answer:

LocatorSyntaxUse Case
IDBy.id("elementId")Unique IDs (most reliable)
NameBy.name("elementName")Form elements
Class NameBy.className("class")Single class match
Tag NameBy.tagName("div")Element type
Link TextBy.linkText("Click Here")Exact anchor text
Partial Link TextBy.partialLinkText("Click")Partial anchor text
CSS SelectorBy.cssSelector("#id .class")Flexible, fast
XPathBy.xpath("//div[@id='test']")Most flexible, complex

Priority recommendation:

  1. ID (fastest, most reliable)
  2. CSS Selector (flexible, fast)
  3. XPath (when CSS can't work)
  4. Others for specific cases

Q: What is XPath and what types are there?

Answer:

XPath is a language for navigating XML/HTML documents.

Types:

Absolute XPath:

  • Starts from root (/html/body/div[1]/form/input)
  • Fragile, breaks with structure changes
  • Not recommended

Relative XPath:

  • Starts from anywhere (//input[@id='username'])
  • More robust
  • Recommended

Common XPath functions:

// Contains
//button[contains(@class, 'submit')]

// Starts-with
//div[starts-with(@id, 'user-')]

// Text matching
//span[text()='Login']

// Partial text
//span[contains(text(), 'Log')]

// Position
//div[@class='item'][2]

// Parent/ancestor
//input[@id='email']/parent::div
//input[@id='email']/ancestor::form

// Following sibling
//label[text()='Email']/following-sibling::input

Q: How do you handle dynamic elements?

Answer:

Strategies:

1. Use stable attributes:

// Prefer data-testid or other stable attributes
driver.findElement(By.cssSelector("[data-testid='submit-btn']"));

2. Use partial matching:

// For IDs like "user-12345"
driver.findElement(By.cssSelector("[id^='user-']"));  // starts with
driver.findElement(By.cssSelector("[id*='user']"));   // contains

3. Use relationships:

// Find relative to stable parent
driver.findElement(By.xpath("//div[@id='stable-parent']//button"));

4. Wait for element stability:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(locator));

Work with developers to add data-testid attributes to elements. This is the most reliable solution for dynamic content.

Waits and Synchronization

Q: What types of waits does Selenium support?

Answer:

1. Implicit Wait:

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
  • Global setting for all element lookups
  • Polls DOM for specified duration
  • Set once, applies everywhere

2. Explicit Wait:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
  • Waits for specific conditions
  • More precise control
  • Preferred approach

3. Fluent Wait:

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofMillis(500))
    .ignoring(NoSuchElementException.class);
  • Configurable polling interval
  • Can ignore specific exceptions
  • Maximum flexibility

4. Thread.sleep() (avoid):

Thread.sleep(5000);  // Don't do this!
  • Fixed delay regardless of readiness
  • Slows tests unnecessarily
  • Use only as last resort

Q: What are Expected Conditions?

Answer:

Expected Conditions are predefined wait conditions:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
 
// Visibility
wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
 
// Clickability
wait.until(ExpectedConditions.elementToBeClickable(locator));
 
// Presence
wait.until(ExpectedConditions.presenceOfElementLocated(locator));
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(locator));
 
// Text
wait.until(ExpectedConditions.textToBePresentInElement(element, "text"));
 
// Frame
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(locator));
 
// Alert
wait.until(ExpectedConditions.alertIsPresent());
 
// URL
wait.until(ExpectedConditions.urlContains("dashboard"));
 
// Staleness
wait.until(ExpectedConditions.stalenessOf(element));

Q: What is a StaleElementReferenceException and how do you handle it?

Answer:

Cause: The element reference is no longer valid because:

  • Page was refreshed
  • Element was removed from DOM
  • Element was re-rendered

Solutions:

1. Re-find the element:

// Instead of storing element reference
WebElement element = driver.findElement(locator);
element.click();  // May throw StaleElementException
 
// Re-find when needed
driver.findElement(locator).click();  // Fresh reference

2. Wait for staleness then re-find:

WebElement element = driver.findElement(locator);
// Action that causes re-render
submitButton.click();
// Wait for old element to become stale
wait.until(ExpectedConditions.stalenessOf(element));
// Find fresh element
element = driver.findElement(locator);

3. Implement retry logic:

public void clickWithRetry(By locator, int maxAttempts) {
    for (int i = 0; i < maxAttempts; i++) {
        try {
            driver.findElement(locator).click();
            return;
        } catch (StaleElementReferenceException e) {
            // Element went stale, retry
        }
    }
    throw new RuntimeException("Failed after " + maxAttempts + " attempts");
}

Actions and Interactions

Q: How do you handle alerts in Selenium?

Answer:

// Wait for alert
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
 
// Accept alert (OK button)
alert.accept();
 
// Dismiss alert (Cancel button)
alert.dismiss();
 
// Get alert text
String alertText = alert.getText();
 
// Enter text in prompt
alert.sendKeys("input text");

Types of alerts:

  • Simple alert: OK button only
  • Confirmation alert: OK and Cancel
  • Prompt alert: Text input with OK/Cancel

Q: How do you handle multiple windows/tabs?

Answer:

// Get current window handle
String mainWindow = driver.getWindowHandle();
 
// Click link that opens new window
linkElement.click();
 
// Get all window handles
Set<String> allWindows = driver.getWindowHandles();
 
// Switch to new window
for (String window : allWindows) {
    if (!window.equals(mainWindow)) {
        driver.switchTo().window(window);
        break;
    }
}
 
// Perform actions in new window
// ...
 
// Close new window and return to main
driver.close();
driver.switchTo().window(mainWindow);

Selenium 4 new window:

// Open new tab
driver.switchTo().newWindow(WindowType.TAB);
 
// Open new window
driver.switchTo().newWindow(WindowType.WINDOW);

Q: How do you handle frames?

Answer:

// Switch by index
driver.switchTo().frame(0);
 
// Switch by name or ID
driver.switchTo().frame("frameName");
 
// Switch by WebElement
WebElement frameElement = driver.findElement(By.tagName("iframe"));
driver.switchTo().frame(frameElement);
 
// Switch back to main content
driver.switchTo().defaultContent();
 
// Switch to parent frame (one level up)
driver.switchTo().parentFrame();

Best practice:

// Wait for frame and switch
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frameId")));

Q: How do you perform mouse and keyboard actions?

Answer:

Actions actions = new Actions(driver);
 
// Mouse actions
actions.moveToElement(element).perform();           // Hover
actions.click(element).perform();                   // Click
actions.doubleClick(element).perform();             // Double-click
actions.contextClick(element).perform();            // Right-click
actions.clickAndHold(element).perform();            // Press and hold
actions.release().perform();                        // Release
 
// Drag and drop
actions.dragAndDrop(source, target).perform();
actions.dragAndDropBy(element, xOffset, yOffset).perform();
 
// Keyboard actions
actions.sendKeys(Keys.ENTER).perform();
actions.sendKeys(Keys.chord(Keys.CONTROL, "a")).perform();  // Ctrl+A
actions.keyDown(Keys.SHIFT).click(element).keyUp(Keys.SHIFT).perform();
 
// Chain actions
actions.moveToElement(menu)
       .pause(Duration.ofMillis(500))
       .moveToElement(submenu)
       .click()
       .perform();

Page Object Model

Q: What is Page Object Model and why use it?

Answer:

Page Object Model is a design pattern that creates object representations of web pages:

Structure:

src/
├── main/
│   └── pages/
│       ├── BasePage.java
│       ├── LoginPage.java
│       └── DashboardPage.java
└── test/
    └── tests/
        ├── BaseTest.java
        └── LoginTest.java

Benefits:

  • Maintainability: Locator changes affect one file
  • Reusability: Pages used across tests
  • Readability: Tests describe behavior, not implementation
  • Reduced duplication: Common methods in base page

Example:

// LoginPage.java
public class LoginPage extends BasePage {
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By loginButton = By.id("login-btn");
    private By errorMessage = By.className("error");
 
    public LoginPage(WebDriver driver) {
        super(driver);
    }
 
    public DashboardPage login(String username, String password) {
        type(usernameField, username);
        type(passwordField, password);
        click(loginButton);
        return new DashboardPage(driver);
    }
 
    public String getErrorMessage() {
        return getText(errorMessage);
    }
}
 
// LoginTest.java
@Test
public void testSuccessfulLogin() {
    LoginPage loginPage = new LoginPage(driver);
    DashboardPage dashboard = loginPage.login("user", "pass");
    assertTrue(dashboard.isDisplayed());
}

Q: What is Page Factory?

Answer:

Page Factory is Selenium's built-in implementation of Page Object Model using annotations:

public class LoginPage {
    private WebDriver driver;
 
    @FindBy(id = "username")
    private WebElement usernameField;
 
    @FindBy(id = "password")
    private WebElement passwordField;
 
    @FindBy(id = "login-btn")
    private WebElement loginButton;
 
    @FindBy(how = How.CSS, using = ".error-message")
    private WebElement errorMessage;
 
    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }
 
    public void login(String username, String password) {
        usernameField.sendKeys(username);
        passwordField.sendKeys(password);
        loginButton.click();
    }
}

Pros:

  • Cleaner syntax
  • Lazy initialization
  • Built-in to Selenium

Cons:

  • Less flexible than custom implementation
  • StaleElementException handling more complex
  • Some prefer explicit locator methods

TestNG/JUnit Integration

Q: How do you integrate Selenium with TestNG?

Answer:

public class BaseTest {
    protected WebDriver driver;
 
    @BeforeMethod
    public void setUp() {
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    }
 
    @AfterMethod
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}
 
public class LoginTest extends BaseTest {
 
    @Test(priority = 1, description = "Verify successful login")
    public void testSuccessfulLogin() {
        driver.get("https://example.com/login");
        // Test implementation
    }
 
    @Test(priority = 2, dependsOnMethods = "testSuccessfulLogin")
    public void testDashboardAccess() {
        // Test implementation
    }
 
    @DataProvider(name = "loginData")
    public Object[][] getLoginData() {
        return new Object[][] {
            {"user1", "pass1"},
            {"user2", "pass2"}
        };
    }
 
    @Test(dataProvider = "loginData")
    public void testMultipleLogins(String username, String password) {
        // Data-driven test
    }
}

Q: How do you handle test data in Selenium tests?

Answer:

1. TestNG DataProvider:

@DataProvider(name = "loginData")
public Object[][] getData() {
    return new Object[][] {
        {"valid@email.com", "validPass", true},
        {"invalid@email.com", "wrongPass", false}
    };
}

2. External files (Excel, CSV, JSON):

// Read from JSON
public List<User> getUsersFromJson() {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(new File("testdata/users.json"),
        new TypeReference<List<User>>(){});
}

3. Database:

// Query test data
public List<User> getUsersFromDB() {
    // JDBC connection and query
}

4. Faker for generated data:

Faker faker = new Faker();
String email = faker.internet().emailAddress();
String name = faker.name().fullName();

Selenium Grid

Q: What is Selenium Grid and when would you use it?

Answer:

Selenium Grid enables distributed test execution across multiple machines and browsers.

When to use:

  • Cross-browser testing
  • Parallel execution for speed
  • Testing on different OS versions
  • Remote machine testing

Architecture (Selenium 4):

                    ┌─────────────┐
                    │    Hub      │
                    │  (Router)   │
                    └──────┬──────┘
           ┌───────────────┼───────────────┐
           ▼               ▼               ▼
    ┌──────────┐    ┌──────────┐    ┌──────────┐
    │  Node 1  │    │  Node 2  │    │  Node 3  │
    │ (Chrome) │    │ (Firefox)│    │  (Edge)  │
    └──────────┘    └──────────┘    └──────────┘

Setup (Selenium 4):

# Standalone (all-in-one)
java -jar selenium-server-4.x.jar standalone
 
# Hub
java -jar selenium-server-4.x.jar hub
 
# Node (connects to hub)
java -jar selenium-server-4.x.jar node --hub http://hub:4444

Connecting to Grid:

WebDriver driver = new RemoteWebDriver(
    new URL("http://localhost:4444"),
    new ChromeOptions()
);

Q: How do you run tests in parallel with Selenium Grid?

Answer:

TestNG parallel execution:

<!-- testng.xml -->
<suite name="Parallel Tests" parallel="tests" thread-count="3">
    <test name="Chrome Test">
        <parameter name="browser" value="chrome"/>
        <classes>
            <class name="tests.LoginTest"/>
        </classes>
    </test>
    <test name="Firefox Test">
        <parameter name="browser" value="firefox"/>
        <classes>
            <class name="tests.LoginTest"/>
        </classes>
    </test>
</suite>

Thread-safe driver management:

public class DriverFactory {
    private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
 
    public static WebDriver getDriver() {
        return driver.get();
    }
 
    public static void setDriver(WebDriver webDriver) {
        driver.set(webDriver);
    }
 
    public static void quitDriver() {
        if (driver.get() != null) {
            driver.get().quit();
            driver.remove();
        }
    }
}

Advanced Scenarios

Q: How do you handle file upload/download?

Answer:

File upload:

// If input type="file" is visible
WebElement uploadInput = driver.findElement(By.id("file-upload"));
uploadInput.sendKeys("/path/to/file.txt");
 
// For hidden inputs, use JavaScript
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].style.display='block';", uploadInput);
uploadInput.sendKeys("/path/to/file.txt");

File download:

// Configure Chrome to download without prompt
ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<>();
prefs.put("download.default_directory", "/path/to/download");
prefs.put("download.prompt_for_download", false);
options.setExperimentalOption("prefs", prefs);
WebDriver driver = new ChromeDriver(options);

Q: How do you take screenshots in Selenium?

Answer:

// Screenshot of visible viewport
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("screenshot.png"));
 
// Screenshot of specific element
WebElement element = driver.findElement(By.id("myElement"));
File elementScreenshot = element.getScreenshotAs(OutputType.FILE);
 
// Full page screenshot (Selenium 4 + Firefox/Chrome DevTools)
// Chrome DevTools Protocol
ChromeDriver chromeDriver = (ChromeDriver) driver;
String base64 = chromeDriver.executeScript("return await chrome.tabs.captureVisibleTab()");

Q: How do you execute JavaScript in Selenium?

Answer:

JavascriptExecutor js = (JavascriptExecutor) driver;
 
// Execute script without return
js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
 
// Execute script with return value
String title = (String) js.executeScript("return document.title");
 
// Pass arguments to script
WebElement element = driver.findElement(By.id("myId"));
js.executeScript("arguments[0].click();", element);
 
// Execute async script
js.executeAsyncScript(
    "var callback = arguments[arguments.length - 1];" +
    "setTimeout(function() { callback('done'); }, 1000);"
);

Troubleshooting

Q: How do you debug failing Selenium tests?

Answer:

1. Add logging:

System.out.println("Current URL: " + driver.getCurrentUrl());
System.out.println("Page title: " + driver.getTitle());

2. Take screenshots on failure:

@AfterMethod
public void captureFailure(ITestResult result) {
    if (result.getStatus() == ITestResult.FAILURE) {
        File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        // Save with test name
    }
}

3. Check element state:

WebElement element = driver.findElement(locator);
System.out.println("Displayed: " + element.isDisplayed());
System.out.println("Enabled: " + element.isEnabled());
System.out.println("Location: " + element.getLocation());

4. Browser console logs:

LogEntries logs = driver.manage().logs().get(LogType.BROWSER);
for (LogEntry entry : logs) {
    System.out.println(entry.getMessage());
}

5. Network logs (Chrome DevTools):

ChromeOptions options = new ChromeOptions();
options.setCapability("goog:loggingPrefs", Map.of("performance", "ALL"));
// Then analyze network requests

Quiz on Selenium Interview

Your Score: 0/10

Question: What is the recommended locator priority in Selenium?

Continue Reading

Frequently Asked Questions (FAQs) / People Also Ask (PAA)

Should I learn Selenium or newer tools like Playwright/Cypress?

Is Selenium becoming obsolete?

Which programming language should I use with Selenium?

How do I handle tests that work locally but fail in CI?

What's the best way to handle authentication in Selenium tests?

How do I prepare for live Selenium coding in interviews?

How important is the Page Object Model in interviews?

What should I do if I can't find an element during an interview?