Saturday, 4 July 2026

How to Handle Frames and iFrames in Playwright Using Java

Modern web applications frequently use frames and iFrames to embed content from external or internal sources.

Common examples include:

  • Payment gateways
  • Advertisement sections
  • Chat widgets
  • Embedded videos
  • Document viewers
  • Third-party integrations

As automation engineers, we must know how to switch into these frames and interact with elements inside them.

In this article, we'll learn how to handle frames and iFrames in Playwright using Java.


What is an iFrame?

An iFrame (Inline Frame) is an HTML element that loads another webpage inside the current webpage.

Example:

<iframe id="paymentFrame" src="payment.html"></iframe>

Elements inside an iFrame are isolated from the parent page.

This means the following code will fail:

page.locator("#cardNumber").fill("1234567890123456");

Playwright cannot access elements inside an iFrame directly from the main page context.


How Playwright Handles Frames

Playwright provides the frameLocator() method to interact with frames easily.

Example:

FrameLocator paymentFrame =
        page.frameLocator("#paymentFrame");

paymentFrame
        .locator("#cardNumber")
        .fill("1234567890123456");

This automatically switches into the frame before performing the action.


Handling Frames Using Frame Locator

Consider the following HTML:

<iframe id="loginFrame"></iframe>

Automation example:

page.frameLocator("#loginFrame")
        .locator("#username")
        .fill("admin");

page.frameLocator("#loginFrame")
        .locator("#password")
        .fill("password");

page.frameLocator("#loginFrame")
        .locator("#loginButton")
        .click();

Storing Frame Reference

If multiple interactions occur inside the same frame, storing the frame reference improves readability.

Example:

FrameLocator loginFrame =
        page.frameLocator("#loginFrame");

loginFrame.locator("#username")
        .fill("admin");

loginFrame.locator("#password")
        .fill("password");

loginFrame.locator("#loginButton")
        .click();

Accessing Frames by Name

Some applications provide frame names instead of IDs.

Example:

Frame frame =
        page.frame("paymentFrame");

You can then interact with elements:

frame.locator("#cardNumber")
        .fill("1234567890123456");

Accessing Frames by URL

Sometimes frames don't have IDs or names.

Example:

Frame frame =
        page.frameByUrl("**/payment/**");

This is useful when working with third-party integrations.


Handling Nested Frames

Some applications contain frames inside other frames.

Example:

page.frameLocator("#parentFrame")
        .frameLocator("#childFrame")
        .locator("#submitButton")
        .click();

Playwright makes nested frame handling very simple compared to traditional automation frameworks.


Getting All Available Frames

You can retrieve all frames present on the page.

Example:

for (Frame frame : page.frames()) {
    System.out.println(frame.url());
}

This is useful during debugging.


Real World Example: Payment Gateway

Consider an online shopping application.

Steps:

  1. Open checkout page.
  2. Payment gateway opens inside an iFrame.
  3. Enter card details.
  4. Submit payment.

Example:

FrameLocator paymentFrame =
        page.frameLocator("#paymentFrame");

paymentFrame.locator("#cardNumber")
        .fill("4111111111111111");

paymentFrame.locator("#expiryDate")
        .fill("12/30");

paymentFrame.locator("#cvv")
        .fill("123");

paymentFrame.locator("#payNow")
        .click();

Common Mistakes

Using Page Locator Instead of Frame Locator

Incorrect:

page.locator("#cardNumber")
        .fill("4111111111111111");

Correct:

page.frameLocator("#paymentFrame")
        .locator("#cardNumber")
        .fill("4111111111111111");

Using Hardcoded Waits

Avoid:

Thread.sleep(5000);

Playwright automatically waits for frames and elements when using locators.


Best Practices

Prefer frameLocator()

frameLocator() is cleaner and easier to maintain than manual frame handling.


Store Frame References

When interacting multiple times with the same frame, store the reference in a variable.


Use Meaningful Variable Names

Good examples:

paymentFrame
loginFrame
chatWidgetFrame

Avoid:

frame1
frame2

Validate Frame Visibility

Before interacting with frames, verify they are loaded properly.

Example:

assertThat(
        page.locator("#paymentFrame")
).isVisible();

Interview Questions

What is the difference between a Frame and an iFrame?

An iFrame is an HTML element that embeds another document inside the current page.

In automation testing, both are generally handled similarly.


Which Playwright method is commonly used to handle iFrames?

frameLocator()

How do you handle nested frames?

Use chained frame locators:

frameLocator()
        .frameLocator()

How can you retrieve all frames available on a page?

page.frames();

Conclusion

Frames and iFrames are widely used in modern web applications, especially in enterprise systems and third-party integrations.

Fortunately, Playwright provides simple and powerful APIs to handle them efficiently.

In this article, you learned:

  • What frames and iFrames are
  • How to use frameLocator()
  • How to handle nested frames
  • How to retrieve frame information
  • Best practices for frame automation

Mastering frame handling will make your Playwright framework more robust and capable of handling real-world applications.

In the next article, we'll learn how to handle multiple browser tabs and windows in Playwright using Java.

No comments:

Post a Comment