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

拡張性

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

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();