Selectors
Selectors API 用于注册自定义选择器引擎。更多细节参见 选择器工作方式。
selectors.register(name, **kwargs)
Added in: v1.8name<str> 选择器前缀名称,例如{name: 'foo'}会启用foo=myselectorbody的写法。只能包含[a-zA-Z0-9_]。#content_script<bool> 是否在隔离的 JavaScript 环境中运行。该环境可访问 DOM,但无法使用页面脚本中的 JS 对象。默认false。当与其他自定义引擎一起使用时,并非总能保证以 content script 方式运行。#path<Union[str, pathlib.Path]> 指向 JS 文件的路径。相对路径会基于当前工作目录解析。#script<str> 直接提供脚本内容。#- returns: <NoneType>#
下面示例展示如何注册一个按标签名查询元素的引擎:
- Sync
- Async
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));
}
}"""
# 注册引擎,前缀为 "tag="
playwright.selectors.register("tag", tag_selector)
browser = playwright.chromium.launch()
page = browser.new_page()
page.set_content('<div><button>Click me</button></div>')
# 使用自定义前缀
button = page.locator('tag=button')
# 可与其他选择器引擎组合
page.locator('tag=div >> text="Click me"').click()
# 任何支持选择器的方法均可使用
button_count = page.locator('tag=button').count()
print(button_count)
browser.close()
with sync_playwright() as playwright:
run(playwright)
import asyncio
from playwright.async_api import async_playwright
async 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=".
await playwright.selectors.register("tag", tag_selector)
browser = await playwright.chromium.launch()
page = await browser.new_page()
await page.set_content('<div><button>Click me</button></div>')
# Use the selector prefixed with its name.
button = await page.query_selector('tag=button')
# Combine it with other selector engines.
await page.locator('tag=div >> text="Click me"').click()
# Can use it in any methods supporting selectors.
button_count = await page.locator('tag=button').count()
print(button_count)
await browser.close()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
selectors.set_test_id_attribute(attribute_name)
Added in: v1.27自定义 get_by_test_id() 使用的属性。例如:
- Sync
- Async
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
p.selectors.set_test_id_attribute("data-test-id")
browser = p.chromium.launch()
page = browser.new_page()
page.set_content("<button data-test-id='submit'>Submit</button>")
page.get_by_test_id("submit").click()
browser.close()
import asyncio
from playwright.async_api import async_playwright
async def run():
async with async_playwright() as p:
await p.selectors.set_test_id_attribute("data-test-id")
browser = await p.chromium.launch()
page = await browser.new_page()
await page.set_content("<button data-test-id='submit'>Submit</button>")
await page.get_by_test_id("submit").click()
await browser.close()
asyncio.run(run())