@serenity-js/playwright
Version:
Adapter that integrates @serenity-js/web with Playwright, enabling Serenity/JS reporting and using the Screenplay Pattern to write component and end-to-end test scenarios
44 lines • 1.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SerenitySelectorEngines = void 0;
const core_1 = require("@serenity-js/core");
/**
* Utility class responsible for registering custom [Playwright selector engines](https://playwright.dev/docs/extensibility)
* used internally by Serenity/JS.
*
* @internal
*/
class SerenitySelectorEngines {
static isRegistered = false;
static engines = new Map(Object.entries({
_sjs_closest: () => ({
query: (root, selector) => {
return root.closest(selector);
},
queryAll: (root, selector) => {
return [root.closest(selector)];
}
})
}));
async ensureRegisteredWith(selectors) {
// As of Playwright 1.36.1, Selectors don't offer any inspection mechanism,
// so invoking `register` twice with the same engine name results in a error.
// Static `isRegistered` helps to work around that
// https://github.com/microsoft/playwright/blob/49c1f9eb025d02f8bfc38351592f3466fe8bc242/packages/playwright-core/src/client/selectors.ts
if (!SerenitySelectorEngines.isRegistered) {
for (const [engineName, engine] of SerenitySelectorEngines.engines) {
await selectors.register(engineName, engine, { contentScript: true });
}
SerenitySelectorEngines.isRegistered = true;
}
}
static engineIdOf(engineName) {
const prefixedEngineName = `_sjs_${engineName}`;
if (!this.engines.has(prefixedEngineName)) {
throw new core_1.LogicError(`${engineName} is not a valid Serenity/JS Playwright selector engine name. Available engines: ${this.engines.keys()} `);
}
return prefixedEngineName;
}
}
exports.SerenitySelectorEngines = SerenitySelectorEngines;
//# sourceMappingURL=SerenitySelectorEngines.js.map