Answer
Handling iFrames in Selenium
An iframe is an HTML document embedded inside another. Elements inside an iframe are not accessible from the parent page context — you must switch into it first.
Switch by Index
Java
// Switch to first iframe on page (0-based index)
driver.switchTo().frame(0);
// Interact with element inside iframe
driver.findElement(By.id("username")).sendKeys("testuser");
// Switch back to main page
driver.switchTo().defaultContent();
Switch by Name or ID
Java
// <iframe name="loginFrame" id="loginFrame">
driver.switchTo().frame("loginFrame");
driver.findElement(By.name("password")).sendKeys("secret");
driver.switchTo().defaultContent();
Switch by WebElement
Java
WebElement iframeElement = driver.findElement(By.cssSelector("iframe.content-frame"));
driver.switchTo().frame(iframeElement);
driver.findElement(By.id("submitBtn")).click();
driver.switchTo().defaultContent();
Nested iFrames
Java
// Switch to outer iframe
driver.switchTo().frame("outerFrame");
// Then switch to inner iframe within it
driver.switchTo().frame("innerFrame");
driver.findElement(By.id("element")).click();
// Go up one level (to outerFrame)
driver.switchTo().parentFrame();
// Go back to main page
driver.switchTo().defaultContent();
Wait for iFrame to Load
Java
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(
By.cssSelector("iframe#content")
));
// Now inside the iframe
driver.findElement(By.id("element")).click();
Common Mistake
Java
// BAD — trying to find element inside iframe without switching
driver.findElement(By.id("insideIframe")); // NoSuchElementException
// GOOD
driver.switchTo().frame("myFrame");
driver.findElement(By.id("insideIframe")); // works
driver.switchTo().defaultContent();
Always Remember
- ✓After switching to an iframe, all
findElementcalls target inside the iframe - ✓Use
defaultContent()to return to the top-level page - ✓Use
parentFrame()to go up one level in nested iframes
