拡張性
カスタムセレクターエンジン
Playwright は、Selectors.register() で登録されたカスタムセレクターエンジンをサポートしています。
セレクターエンジンは、以下のプロパティを持つ必要があります。
query
関数:root
を基準としたselector
に一致する最初の要素をクエリします。queryAll
関数:root
を基準としたselector
に一致するすべての要素をクエリします。
デフォルトでは、エンジンはフレームの JavaScript コンテキストで直接実行され、例えば、アプリケーション定義の関数を呼び出すことができます。フレーム内の JavaScript からエンジンを分離し、DOM へのアクセスを維持するには、{contentScript: true}
オプションを指定してエンジンを登録します。コンテンツスクリプトエンジンは、例えば Node.prototype
メソッドの変更など、グローバルオブジェクトの改ざんから保護されているため、より安全です。すべての組み込みセレクターエンジンは、コンテンツスクリプトとして実行されます。エンジンが他のカスタムエンジンと組み合わせて使用される場合、コンテンツスクリプトとして実行されることは保証されないことに注意してください。
セレクターは、ページを作成する前に登録する必要があります。
タグ名に基づいて要素をクエリするセレクターエンジンを登録する例
// Must be a script that evaluates to a selector engine instance. The script is evaluated in the page context.
String createTagNameEngine = "{\n" +
" // Returns the first element matching given selector in the root's subtree.\n" +
" query(root, selector) {\n" +
" return root.querySelector(selector);\n" +
" },\n" +
"\n" +
" // Returns all elements matching given selector in the root's subtree.\n" +
" queryAll(root, selector) {\n" +
" return Array.from(root.querySelectorAll(selector));\n" +
" }\n" +
"}";
// Register the engine. Selectors will be prefixed with "tag=".
playwright.selectors().register("tag", createTagNameEngine);
// Now we can use "tag=" selectors.
Locator button = page.locator("tag=button");
button.click();
// We can combine it with built-in locators.
page.locator("tag=div").getByText("Click me").click();
// We can use it in any methods supporting selectors.
int buttonCount = (int) page.locator("tag=button").count();