Расширяемость
Пользовательские механизмы селекторов
Playwright поддерживает пользовательские механизмы селекторов, регистрируемые с помощью selectors.register().
Механизм селекторов должен иметь следующие свойства:
- Функция
query
для поиска первого элемента, соответствующегоselector
, относительноroot
. - Функция
queryAll
для поиска всех элементов, соответствующихselector
, относительноroot
.
По умолчанию механизм запускается непосредственно в контексте JavaScript фрейма и, например, может вызывать функцию, определенную в приложении. Чтобы изолировать механизм от любого JavaScript в фрейме, но оставить доступ к DOM, зарегистрируйте механизм с опцией {contentScript: true}
. Механизм контент-скрипта более безопасен, так как он защищен от любых изменений глобальных объектов, например, изменения методов Node.prototype
. Все встроенные механизмы селекторов работают как контент-скрипты. Обратите внимание, что работа в качестве контент-скрипта не гарантируется, если механизм используется вместе с другими пользовательскими механизмами.
Селекторы должны быть зарегистрированы до создания страницы.
Пример регистрации механизма селекторов, который ищет элементы на основе имени тега:
- Sync
- Async
tag_selector = """
// Должен оцениваться как экземпляр механизма селекторов.
{
// Возвращает первый элемент, соответствующий данному селектору в поддереве корня.
query(root, selector) {
return root.querySelector(selector);
},
// Возвращает все элементы, соответствующие данному селектору в поддереве корня.
queryAll(root, selector) {
return Array.from(root.querySelectorAll(selector));
}
}"""
# регистрируем механизм. селекторы будут иметь префикс "tag=".
playwright.selectors.register("tag", tag_selector)
# теперь мы можем использовать селекторы "tag=".
button = page.locator("tag=button")
button.click()
# мы можем комбинировать его с встроенными локаторами.
page.locator("tag=div").get_by_text("click me").click()
# мы можем использовать его в любых методах, поддерживающих селекторы.
button_count = page.locator("tag=button").count()
tag_selector = """
// Должен оцениваться как экземпляр механизма селекторов.
{
// Возвращает первый элемент, соответствующий данному селектору в поддереве корня.
query(root, selector) {
return root.querySelector(selector);
},
// Возвращает все элементы, соответствующие данному селектору в поддереве корня.
queryAll(root, selector) {
return Array.from(root.querySelectorAll(selector));
}
}"""
# регистрируем механизм. селекторы будут иметь префикс "tag=".
await playwright.selectors.register("tag", tag_selector)
# теперь мы можем использовать селекторы "tag=".
button = page.locator("tag=button")
await button.click()
# мы можем комбинировать его с встроенными локаторами.
await page.locator("tag=div").get_by_text("click me").click()
# мы можем использовать его в любых методах, поддерживающих селекторы.
button_count = await page.locator("tag=button").count()