拡張性
カスタムセレクターエンジン
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();