Перейти к основному содержимому

Расширяемость

Пользовательские механизмы селекторов

Playwright поддерживает пользовательские механизмы селекторов, регистрируемые с помощью Selectors.register().

Механизм селектора должен иметь следующие свойства:

  • Функция query для поиска первого элемента, соответствующего selector, относительно root.
  • Функция queryAll для поиска всех элементов, соответствующих selector, относительно root.

По умолчанию механизм запускается непосредственно в контексте JavaScript фрейма и, например, может вызывать функцию, определенную в приложении. Чтобы изолировать механизм от любого JavaScript в фрейме, но оставить доступ к DOM, зарегистрируйте механизм с опцией {contentScript: true}. Механизм контент-скрипта более безопасен, так как он защищен от любых изменений глобальных объектов, например, изменения методов Node.prototype. Все встроенные механизмы селекторов работают как контент-скрипты. Обратите внимание, что работа в качестве контент-скрипта не гарантируется, если механизм используется вместе с другими пользовательскими механизмами.

Селекторы должны быть зарегистрированы до создания страницы.

Пример регистрации механизма селектора, который ищет элементы на основе имени тега:

// Должен быть скрипт, который оценивается как экземпляр механизма селектора. Скрипт оценивается в контексте страницы.
String createTagNameEngine = "{\n" +
" // Возвращает первый элемент, соответствующий данному селектору в поддереве корня.\n" +
" query(root, selector) {\n" +
" return root.querySelector(selector);\n" +
" },\n" +
"\n" +
" // Возвращает все элементы, соответствующие данному селектору в поддереве корня.\n" +
" queryAll(root, selector) {\n" +
" return Array.from(root.querySelectorAll(selector));\n" +
" }\n" +
"}";

// Зарегистрируйте механизм. Селекторы будут иметь префикс "tag=".
playwright.selectors().register("tag", createTagNameEngine);

// Теперь мы можем использовать селекторы "tag=".
Locator button = page.locator("tag=button");
button.click();

// Мы можем комбинировать его с встроенными локаторами.
page.locator("tag=div").getByText("Click me").click();

// Мы можем использовать его в любых методах, поддерживающих селекторы.
int buttonCount = (int) page.locator("tag=button").count();