メインコンテンツにスキップ

拡張性

カスタムセレクターエンジン

Playwrightは、Selectors.register()で登録されたカスタムセレクターエンジンをサポートしています。

セレクターエンジンは、以下のプロパティを持つ必要があります。

  • root から相対的に selector に一致する最初の要素をクエリする query 関数。
  • root から相対的に selector に一致するすべての要素をクエリする queryAll 関数。

デフォルトでは、エンジンはフレームの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();