Skip to main content

Page

Page provides methods to interact with a single tab in a Browser, or an extension background page in Chromium. One Browser instance might have multiple Page instances.

This example creates a page, navigates it to a URL, and then saves a screenshot:

from playwright.sync_api import sync_playwright, Playwright

def run(playwright: Playwright):
webkit = playwright.webkit
browser = webkit.launch()
context = browser.new_context()
page = context.new_page()
page.goto("https://example.com")
page.screenshot(path="screenshot.png")
browser.close()

with sync_playwright() as playwright:
run(playwright)

The Page class emits various events (described below) which can be handled using any of Node's native EventEmitter methods, such as on, once or removeListener.

This example logs a message for a single page load event:

page.once("load", lambda: print("page loaded!"))

To unsubscribe from events use the removeListener method:

def log_request(intercepted_request):
print("a request was made:", intercepted_request.url)
page.on("request", log_request)
# sometime later...
page.remove_listener("request", log_request)

Methods

add_init_script

Added before v1.9 page.add_init_script

Adds a script which would be evaluated in one of the following scenarios:

  • Whenever the page is navigated.
  • Whenever the child frame is attached or navigated. In this case, the script is evaluated in the context of the newly attached frame.

The script is evaluated after the document was created but before any of its scripts were run. This is useful to amend the JavaScript environment, e.g. to seed Math.random.

Usage

An example of overriding Math.random before the page loads:

// preload.js
Math.random = () => 42;
# in your playwright script, assuming the preload.js file is in same directory
page.add_init_script(path="./preload.js")
note

The order of evaluation of multiple scripts installed via browser_context.add_init_script() and page.add_init_script() is not defined.

Arguments

  • path Union[str, pathlib.Path] (optional)#

    Path to the JavaScript file. If path is a relative path, then it is resolved relative to the current working directory. Optional.

  • script str (optional)#

    Script to be evaluated in all pages in the browser context. Optional.

Returns


add_locator_handler

Added in: v1.42 page.add_locator_handler

When testing a web page, sometimes unexpected overlays like a "Sign up" dialog appear and block actions you want to automate, e.g. clicking a button. These overlays don't always show up in the same way or at the same time, making them tricky to handle in automated tests.

This method lets you set up a special function, called a handler, that activates when it detects that overlay is visible. The handler's job is to remove the overlay, allowing your test to continue as if the overlay wasn't there.

Things to keep in mind:

  • When an overlay is shown predictably, we recommend explicitly waiting for it in your test and dismissing it as a part of your normal test flow, instead of using page.add_locator_handler().
  • Playwright checks for the overlay every time before executing or retrying an action that requires an actionability check, or before performing an auto-waiting assertion check. When overlay is visible, Playwright calls the handler first, and then proceeds with the action/assertion. Note that the handler is only called when you perform an action/assertion - if the overlay becomes visible but you don't perform any actions, the handler will not be triggered.
  • After executing the handler, Playwright will ensure that overlay that triggered the handler is not visible anymore. You can opt-out of this behavior with no_wait_after.
  • The execution time of the handler counts towards the timeout of the action/assertion that executed the handler. If your handler takes too long, it might cause timeouts.
  • You can register multiple handlers. However, only a single handler will be running at a time. Make sure the actions within a handler don't depend on another handler.
warning

Running the handler will alter your page state mid-test. For example it will change the currently focused element and move the mouse. Make sure that actions that run after the handler are self-contained and do not rely on the focus and mouse state being unchanged.

For example, consider a test that calls locator.focus() followed by keyboard.press(). If your handler clicks a button between these two actions, the focused element most likely will be wrong, and key press will happen on the unexpected element. Use locator.press() instead to avoid this problem.

Another example is a series of mouse actions, where mouse.move() is followed by mouse.down(). Again, when the handler runs between these two actions, the mouse position will be wrong during the mouse down. Prefer self-contained actions like locator.click() that do not rely on the state being unchanged by a handler.

Usage

An example that closes a "Sign up to the newsletter" dialog when it appears:

# Setup the handler.
def handler():
page.get_by_role("button", name="No thanks").click()
page.add_locator_handler(page.get_by_text("Sign up to the newsletter"), handler)

# Write the test as usual.
page.goto("https://example.com")
page.get_by_role("button", name="Start here").click()

An example that skips the "Confirm your security details" page when it is shown:

# Setup the handler.
def handler():
page.get_by_role("button", name="Remind me later").click()
page.add_locator_handler(page.get_by_text("Confirm your security details"), handler)

# Write the test as usual.
page.goto("https://example.com")
page.get_by_role("button", name="Start here").click()

An example with a custom callback on every actionability check. It uses a locator that is always visible, so the handler is called before every actionability check. It is important to specify no_wait_after, because the handler does not hide the element.

# Setup the handler.
def handler():
page.evaluate("window.removeObstructionsForTestIfNeeded()")
page.add_locator_handler(page.locator("body"), handler, no_wait_after=True)

# Write the test as usual.
page.goto("https://example.com")
page.get_by_role("button", name="Start here").click()

Handler takes the original locator as an argument. You can also automatically remove the handler after a number of invocations by setting times:

def handler(locator):
locator.click()
page.add_locator_handler(page.get_by_label("Close"), handler, times=1)

Arguments

  • locator Locator#

    Locator that triggers the handler.

  • handler Callable[Locator]:Promise[Any]#

    Function that should be run once locator appears. This function should get rid of the element that blocks actions like click.

  • no_wait_after bool (optional) Added in: v1.44#

    By default, after calling the handler Playwright will wait until the overlay becomes hidden, and only then Playwright will continue with the action/assertion that triggered the handler. This option allows to opt-out of this behavior, so that overlay can stay visible after the handler has run.

  • times int (optional) Added in: v1.44#

    Specifies the maximum number of times this handler should be called. Unlimited by default.

Returns


add_script_tag

Added before v1.9 page.add_script_tag

Adds a


""")
page.click("button")

with sync_playwright() as playwright:
run(playwright)

Arguments

  • name str#

    Name of the function on the window object.

  • callback Callable#

    Callback function that will be called in the Playwright's context.

  • handle bool (optional)#

    Deprecated

    This option will be removed in the future.

    Whether to pass the argument as a handle, instead of passing by value. When passing a handle, only one argument is supported. When passing by value, multiple arguments are supported.

Returns


expose_function

Added before v1.9 page.expose_function

The method adds a function called name on the window object of every frame in the page. When called, the function executes callback and returns a Promise which resolves to the return value of callback.

If the callback returns a Promise, it will be awaited.

See browser_context.expose_function() for context-wide exposed function.

note

Functions installed via page.expose_function() survive navigations.

Usage

An example of adding a sha256 function to the page:

import hashlib
from playwright.sync_api import sync_playwright, Playwright

def sha256(text):
m = hashlib.sha256()
m.update(bytes(text, "utf8"))
return m.hexdigest()


def run(playwright: Playwright):
webkit = playwright.webkit
browser = webkit.launch(headless=False)
page = browser.new_page()
page.expose_function("sha256", sha256)
page.set_content("""



""")
page.click("button")

with sync_playwright() as playwright:
run(playwright)

Arguments

  • name str#

    Name of the function on the window object

  • callback Callable#

    Callback function which will be called in Playwright's context.

Returns


frame

Added before v1.9 page.frame

Returns frame matching the specified criteria. Either name or url must be specified.

Usage

frame = page.frame(name="frame-name")
frame = page.frame(url=r".*domain.*")

Arguments

  • name str (optional)#

    Frame name specified in the iframe's name attribute. Optional.

  • url str | Pattern | Callable[URL]:bool (optional)#

    A glob pattern, regex pattern or predicate receiving frame's url as a URL object. Optional.

Returns


frame_locator

Added in: v1.17 page.frame_locator

When working with iframes, you can create a frame locator that will enter the iframe and allow selecting elements in that iframe.

Usage

Following snippet locates element with text "Submit" in the iframe with id my-frame, like