@serenity-js/playwright 3.34.1 → 3.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/lib/screenplay/models/locators/PlaywrightLocator.d.ts.map +1 -1
- package/lib/screenplay/models/locators/PlaywrightLocator.js +53 -0
- package/lib/screenplay/models/locators/PlaywrightLocator.js.map +1 -1
- package/package.json +5 -5
- package/src/screenplay/models/locators/PlaywrightLocator.ts +61 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.35.0](https://github.com/serenity-js/serenity-js/compare/v3.34.2...v3.35.0) (2025-09-07)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **web:** support for identifying page elements by their ARIA role ([cf3672a](https://github.com/serenity-js/serenity-js/commit/cf3672a6fe3051eab9c195f2f342ebf55c19e2d6))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [3.34.2](https://github.com/serenity-js/serenity-js/compare/v3.34.1...v3.34.2) (2025-09-07)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @serenity-js/playwright
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
## [3.34.1](https://github.com/serenity-js/serenity-js/compare/v3.34.0...v3.34.1) (2025-08-20)
|
|
7
26
|
|
|
8
27
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaywrightLocator.d.ts","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/PlaywrightLocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"PlaywrightLocator.d.ts","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/PlaywrightLocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,EAA2E,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACpH,OAAO,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAKnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;gBAGlE,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,EACvC,QAAQ,EAAE,QAAQ;IAMtB,SAAS,CAAC,cAAc,IAAI,MAAM;IAgC5B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAsB7B,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;IAM5C,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAU7D,EAAE,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;IAItE,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;IAIxE,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;IAIrE,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;IAIpC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;CAavE;AAED;;GAEG;AACH,qBAAa,gCAAiC,SAAQ,iBAAiB;IAI/D,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAFtC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,EACvC,QAAQ,EAAE,QAAQ,EACD,qBAAqB,EAAE,UAAU,CAAC,OAAO;IAKxD,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;IAI5C,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;CAGhE"}
|
|
@@ -29,6 +29,9 @@ class PlaywrightLocator extends web_1.Locator {
|
|
|
29
29
|
if (this.selector instanceof web_1.ById) {
|
|
30
30
|
return `id=${this.selector.value}`;
|
|
31
31
|
}
|
|
32
|
+
if (this.selector instanceof web_1.ByRole) {
|
|
33
|
+
return getByRoleSelector(this.selector.value, this.selector.options);
|
|
34
|
+
}
|
|
32
35
|
if (this.selector instanceof web_1.ByTagName) {
|
|
33
36
|
return `:light(${this.selector.value})`;
|
|
34
37
|
}
|
|
@@ -115,4 +118,54 @@ class PlaywrightParentElementLocator extends PlaywrightLocator {
|
|
|
115
118
|
return [await this.nativeElement()];
|
|
116
119
|
}
|
|
117
120
|
}
|
|
121
|
+
// Playwright doesn't expose the internal locator utilities, so unfortunately we need to re-implement them here.
|
|
122
|
+
// https://github.com/microsoft/playwright/blob/release-1.55/packages/playwright-core/src/utils/isomorphic/locatorUtils.ts#L59
|
|
123
|
+
function getByRoleSelector(role, options = {}) {
|
|
124
|
+
const props = [];
|
|
125
|
+
if (options.checked !== undefined) {
|
|
126
|
+
props.push(['checked', String(options.checked)]);
|
|
127
|
+
}
|
|
128
|
+
if (options.disabled !== undefined) {
|
|
129
|
+
props.push(['disabled', String(options.disabled)]);
|
|
130
|
+
}
|
|
131
|
+
if (options.selected !== undefined) {
|
|
132
|
+
props.push(['selected', String(options.selected)]);
|
|
133
|
+
}
|
|
134
|
+
if (options.expanded !== undefined) {
|
|
135
|
+
props.push(['expanded', String(options.expanded)]);
|
|
136
|
+
}
|
|
137
|
+
if (options.includeHidden !== undefined) {
|
|
138
|
+
props.push(['include-hidden', String(options.includeHidden)]);
|
|
139
|
+
}
|
|
140
|
+
if (options.level !== undefined) {
|
|
141
|
+
props.push(['level', String(options.level)]);
|
|
142
|
+
}
|
|
143
|
+
if (options.name !== undefined) {
|
|
144
|
+
props.push(['name', escapeForAttributeSelector(options.name, !!options.exact)]);
|
|
145
|
+
}
|
|
146
|
+
if (options.pressed !== undefined) {
|
|
147
|
+
props.push(['pressed', String(options.pressed)]);
|
|
148
|
+
}
|
|
149
|
+
return `role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join('')}`;
|
|
150
|
+
}
|
|
151
|
+
// https://github.com/microsoft/playwright/blob/release-1.55/packages/playwright-core/src/utils/isomorphic/stringUtils.ts#L92
|
|
152
|
+
function escapeForAttributeSelector(value, exact) {
|
|
153
|
+
if (typeof value !== 'string') {
|
|
154
|
+
return escapeRegexForSelector(value);
|
|
155
|
+
}
|
|
156
|
+
// However, Playwright attribute selectors do not conform to CSS parsing spec,
|
|
157
|
+
// so we escape them differently.
|
|
158
|
+
return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"${exact ? 's' : 'i'}`;
|
|
159
|
+
}
|
|
160
|
+
// https://github.com/microsoft/playwright/blob/release-1.55/packages/playwright-core/src/utils/isomorphic/stringUtils.ts#L75
|
|
161
|
+
function escapeRegexForSelector(re) {
|
|
162
|
+
// Unicode mode does not allow "identity character escapes", so Playwright does not escape and
|
|
163
|
+
// hopes that it does not contain quotes and/or >> signs.
|
|
164
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Character_escape
|
|
165
|
+
if (re['unicode'] || re['unicodeSets']) {
|
|
166
|
+
return String(re);
|
|
167
|
+
}
|
|
168
|
+
// Even number of backslashes followed by the quote -> insert a backslash.
|
|
169
|
+
return String(re).replaceAll(/(^|[^\\])(\\\\)*(["'`])/g, '$1$2\\$3').replaceAll('>>', '\\>\\>');
|
|
170
|
+
}
|
|
118
171
|
//# sourceMappingURL=PlaywrightLocator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaywrightLocator.js","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/PlaywrightLocator.ts"],"names":[],"mappings":";;;AAAA,4CAAkD;AAElD,
|
|
1
|
+
{"version":3,"file":"PlaywrightLocator.js","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/PlaywrightLocator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serenity-js/playwright",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.35.0",
|
|
4
4
|
"description": "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",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jan Molak",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"node": "^18.12 || ^20 || ^22"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@serenity-js/core": "3.
|
|
61
|
-
"@serenity-js/web": "3.
|
|
60
|
+
"@serenity-js/core": "3.35.0",
|
|
61
|
+
"@serenity-js/web": "3.35.0",
|
|
62
62
|
"tiny-types": "1.24.1"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
@@ -69,11 +69,11 @@
|
|
|
69
69
|
"@types/chai": "4.3.20",
|
|
70
70
|
"@types/mocha": "10.0.10",
|
|
71
71
|
"c8": "10.1.3",
|
|
72
|
-
"mocha": "11.7.
|
|
72
|
+
"mocha": "11.7.2",
|
|
73
73
|
"mocha-multi": "1.1.7",
|
|
74
74
|
"playwright-core": "1.55.0",
|
|
75
75
|
"ts-node": "10.9.2",
|
|
76
76
|
"typescript": "5.9.2"
|
|
77
77
|
},
|
|
78
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "b87c48f8c67c0a51173cd5c29eb6e8599ca131ca"
|
|
79
79
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { f, LogicError } from '@serenity-js/core';
|
|
2
|
-
import type { PageElement, RootLocator, Selector } from '@serenity-js/web';
|
|
3
|
-
import { ByCss, ByCssContainingText, ByDeepCss, ById, ByTagName, ByXPath, Locator } from '@serenity-js/web';
|
|
2
|
+
import type { ByRoleSelectorOptions, PageElement, RootLocator, Selector } from '@serenity-js/web';
|
|
3
|
+
import { ByCss, ByCssContainingText, ByDeepCss, ById, ByRole, ByTagName, ByXPath, Locator } from '@serenity-js/web';
|
|
4
4
|
import type * as playwright from 'playwright-core';
|
|
5
5
|
|
|
6
6
|
import { SerenitySelectorEngines } from '../../../selector-engines';
|
|
@@ -40,6 +40,10 @@ export class PlaywrightLocator extends Locator<playwright.Locator, string> {
|
|
|
40
40
|
return `id=${ this.selector.value }`;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
if (this.selector instanceof ByRole) {
|
|
44
|
+
return getByRoleSelector(this.selector.value, this.selector.options)
|
|
45
|
+
}
|
|
46
|
+
|
|
43
47
|
if (this.selector instanceof ByTagName) {
|
|
44
48
|
return `:light(${ this.selector.value })`;
|
|
45
49
|
}
|
|
@@ -161,3 +165,58 @@ class PlaywrightParentElementLocator extends PlaywrightLocator {
|
|
|
161
165
|
return [ await this.nativeElement() ];
|
|
162
166
|
}
|
|
163
167
|
}
|
|
168
|
+
|
|
169
|
+
// Playwright doesn't expose the internal locator utilities, so unfortunately we need to re-implement them here.
|
|
170
|
+
|
|
171
|
+
// https://github.com/microsoft/playwright/blob/release-1.55/packages/playwright-core/src/utils/isomorphic/locatorUtils.ts#L59
|
|
172
|
+
function getByRoleSelector(role: string, options: ByRoleSelectorOptions = {}): string {
|
|
173
|
+
const props: string[][] = [];
|
|
174
|
+
if (options.checked !== undefined) {
|
|
175
|
+
props.push(['checked', String(options.checked)]);
|
|
176
|
+
}
|
|
177
|
+
if (options.disabled !== undefined) {
|
|
178
|
+
props.push(['disabled', String(options.disabled)]);
|
|
179
|
+
}
|
|
180
|
+
if (options.selected !== undefined) {
|
|
181
|
+
props.push(['selected', String(options.selected)]);
|
|
182
|
+
}
|
|
183
|
+
if (options.expanded !== undefined) {
|
|
184
|
+
props.push(['expanded', String(options.expanded)]);
|
|
185
|
+
}
|
|
186
|
+
if (options.includeHidden !== undefined) {
|
|
187
|
+
props.push(['include-hidden', String(options.includeHidden)]);
|
|
188
|
+
}
|
|
189
|
+
if (options.level !== undefined) {
|
|
190
|
+
props.push(['level', String(options.level)]);
|
|
191
|
+
}
|
|
192
|
+
if (options.name !== undefined) {
|
|
193
|
+
props.push(['name', escapeForAttributeSelector(options.name, !!options.exact)]);
|
|
194
|
+
}
|
|
195
|
+
if (options.pressed !== undefined) {
|
|
196
|
+
props.push(['pressed', String(options.pressed)]);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return `role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join('')}`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// https://github.com/microsoft/playwright/blob/release-1.55/packages/playwright-core/src/utils/isomorphic/stringUtils.ts#L92
|
|
203
|
+
function escapeForAttributeSelector(value: string | RegExp, exact: boolean): string {
|
|
204
|
+
if (typeof value !== 'string') {
|
|
205
|
+
return escapeRegexForSelector(value);
|
|
206
|
+
}
|
|
207
|
+
// However, Playwright attribute selectors do not conform to CSS parsing spec,
|
|
208
|
+
// so we escape them differently.
|
|
209
|
+
return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"${exact ? 's' : 'i'}`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// https://github.com/microsoft/playwright/blob/release-1.55/packages/playwright-core/src/utils/isomorphic/stringUtils.ts#L75
|
|
213
|
+
function escapeRegexForSelector(re: RegExp): string {
|
|
214
|
+
// Unicode mode does not allow "identity character escapes", so Playwright does not escape and
|
|
215
|
+
// hopes that it does not contain quotes and/or >> signs.
|
|
216
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Character_escape
|
|
217
|
+
if (re['unicode'] || re['unicodeSets']) {
|
|
218
|
+
return String(re);
|
|
219
|
+
}
|
|
220
|
+
// Even number of backslashes followed by the quote -> insert a backslash.
|
|
221
|
+
return String(re).replaceAll(/(^|[^\\])(\\\\)*(["'`])/g, '$1$2\\$3').replaceAll('>>', '\\>\\>');
|
|
222
|
+
}
|