Skip to main content


Selectors can be used to install custom selector engines. See Working with selectors for more information.

selectors.register(name, **kwargs)

Added in: v1.8
  • name <str> Name that is used in selectors as a prefix, e.g. {name: 'foo'} enables foo=myselectorbody selectors. May only contain [a-zA-Z0-9_] characters.#
  • content_script <bool> Whether to run this selector engine in isolated JavaScript environment. This environment has access to the same DOM, but not any JavaScript objects from the frame's scripts. Defaults to false. Note that running as a content script is not guaranteed when this engine is used together with other registered engines.#
  • path <Union[str, pathlib.Path]> Path to the JavaScript file. If path is a relative path, then it is resolved relative to the current working directory.#
  • script <str> Raw script content.#
  • returns: <NoneType>#

An example of registering selector engine that queries elements based on a tag name:

from playwright.sync_api import sync_playwright

def run(playwright):
tag_selector = """
// Returns the first element matching given selector in the root's subtree.
query(root, selector) {
return root.querySelector(selector);
// Returns all elements matching given selector in the root's subtree.
queryAll(root, selector) {
return Array.from(root.querySelectorAll(selector));

# Register the engine. Selectors will be prefixed with "tag=".
playwright.selectors.register("tag", tag_selector)
browser = playwright.chromium.launch()
page = browser.new_page()
page.set_content('<div><button>Click me</button></div>')

# Use the selector prefixed with its name.
button = page.locator('tag=button')
# Combine it with other selector engines.
page.locator('tag=div >> text="Click me"').click()
# Can use it in any methods supporting selectors.
button_count = page.locator('tag=button').count()

with sync_playwright() as playwright: