@applitools/spec-driver-playwright 1.3.21 → 1.3.23
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 +45 -0
- package/dist/spec-driver.js +50 -62
- package/package.json +5 -5
- package/types/index.d.ts +18 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.3.23](https://github.com/applitools/eyes.sdk.javascript1/compare/js/spec-driver-playwright@1.3.22...js/spec-driver-playwright@1.3.23) (2023-08-18)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Code Refactoring
|
|
7
|
+
|
|
8
|
+
* refactored spec driver interface ([#1839](https://github.com/applitools/eyes.sdk.javascript1/issues/1839)) ([aa49ec2](https://github.com/applitools/eyes.sdk.javascript1/commit/aa49ec2a7d14b8529acc3a8a4c2baecfa113d98a))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* @applitools/utils bumped to 1.5.1
|
|
14
|
+
#### Code Refactoring
|
|
15
|
+
|
|
16
|
+
* refactored spec driver interface ([#1839](https://github.com/applitools/eyes.sdk.javascript1/issues/1839)) ([aa49ec2](https://github.com/applitools/eyes.sdk.javascript1/commit/aa49ec2a7d14b8529acc3a8a4c2baecfa113d98a))
|
|
17
|
+
* @applitools/logger bumped to 2.0.8
|
|
18
|
+
#### Code Refactoring
|
|
19
|
+
|
|
20
|
+
* refactored spec driver interface ([#1839](https://github.com/applitools/eyes.sdk.javascript1/issues/1839)) ([aa49ec2](https://github.com/applitools/eyes.sdk.javascript1/commit/aa49ec2a7d14b8529acc3a8a4c2baecfa113d98a))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
* @applitools/snippets bumped to 2.4.23
|
|
25
|
+
#### Code Refactoring
|
|
26
|
+
|
|
27
|
+
* refactored spec driver interface ([#1839](https://github.com/applitools/eyes.sdk.javascript1/issues/1839)) ([aa49ec2](https://github.com/applitools/eyes.sdk.javascript1/commit/aa49ec2a7d14b8529acc3a8a4c2baecfa113d98a))
|
|
28
|
+
* @applitools/driver bumped to 1.13.5
|
|
29
|
+
#### Bug Fixes
|
|
30
|
+
|
|
31
|
+
* optimize driver usage in close ([#1867](https://github.com/applitools/eyes.sdk.javascript1/issues/1867)) ([60dff6b](https://github.com/applitools/eyes.sdk.javascript1/commit/60dff6b160e69d3893c91a1125d668fa18b43072))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
#### Code Refactoring
|
|
35
|
+
|
|
36
|
+
* refactored spec driver interface ([#1839](https://github.com/applitools/eyes.sdk.javascript1/issues/1839)) ([aa49ec2](https://github.com/applitools/eyes.sdk.javascript1/commit/aa49ec2a7d14b8529acc3a8a4c2baecfa113d98a))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## [1.3.22](https://github.com/applitools/eyes.sdk.javascript1/compare/js/spec-driver-playwright@1.3.21...js/spec-driver-playwright@1.3.22) (2023-08-10)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### Bug Fixes
|
|
45
|
+
|
|
46
|
+
* avoid service worker shutdown ([#1830](https://github.com/applitools/eyes.sdk.javascript1/issues/1830)) ([f552d84](https://github.com/applitools/eyes.sdk.javascript1/commit/f552d8425778f300cad31c0297a04f3f282f34e0))
|
|
47
|
+
|
|
3
48
|
## [1.3.21](https://github.com/applitools/eyes.sdk.javascript1/compare/js/spec-driver-playwright@1.3.20...js/spec-driver-playwright@1.3.21) (2023-08-03)
|
|
4
49
|
|
|
5
50
|
|
package/dist/spec-driver.js
CHANGED
|
@@ -23,12 +23,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.build = exports.
|
|
26
|
+
exports.build = exports.takeScreenshot = exports.visit = exports.getUrl = exports.getTitle = exports.getCookies = exports.setViewportSize = exports.getViewportSize = exports.getDriverInfo = exports.childContext = exports.parentContext = exports.mainContext = exports.click = exports.hover = exports.setElementText = exports.findElements = exports.findElement = exports.executeScript = exports.extractContext = exports.toSimpleCommonSelector = exports.toSelector = exports.isStaleElementError = exports.isSelector = exports.isElement = exports.isContext = exports.isDriver = void 0;
|
|
27
27
|
const fs = __importStar(require("fs"));
|
|
28
28
|
const os = __importStar(require("os"));
|
|
29
29
|
const path = __importStar(require("path"));
|
|
30
30
|
const utils = __importStar(require("@applitools/utils"));
|
|
31
|
-
// #region HELPERS
|
|
32
31
|
async function handleToObject(handle) {
|
|
33
32
|
var _a;
|
|
34
33
|
let [, type] = (_a = handle.toString().match(/(?:.+@)?(\w*)(?:\(\d+\))?/i)) !== null && _a !== void 0 ? _a : [];
|
|
@@ -49,8 +48,6 @@ async function handleToObject(handle) {
|
|
|
49
48
|
return handle.jsonValue();
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
|
-
// #endregion
|
|
53
|
-
// #region UTILITY
|
|
54
51
|
function isDriver(page) {
|
|
55
52
|
if (!page)
|
|
56
53
|
return false;
|
|
@@ -75,7 +72,16 @@ function isSelector(selector) {
|
|
|
75
72
|
return utils.types.isString(selector) || utils.types.instanceOf(selector, 'Locator');
|
|
76
73
|
}
|
|
77
74
|
exports.isSelector = isSelector;
|
|
78
|
-
function
|
|
75
|
+
function isStaleElementError(err) {
|
|
76
|
+
var _a, _b, _c, _d;
|
|
77
|
+
return (((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('Element is not attached to the DOM')) || // universal message
|
|
78
|
+
((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes('Protocol error (DOM.describeNode)')) || // chrome message
|
|
79
|
+
((_c = err === null || err === void 0 ? void 0 : err.message) === null || _c === void 0 ? void 0 : _c.includes('Protocol error (Page.adoptNode)')) || // firefox message
|
|
80
|
+
((_d = err === null || err === void 0 ? void 0 : err.message) === null || _d === void 0 ? void 0 : _d.includes('Unable to adopt element handle from a different document')) // webkit message
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
exports.isStaleElementError = isStaleElementError;
|
|
84
|
+
function toSelector(selector) {
|
|
79
85
|
if (utils.types.has(selector, 'selector')) {
|
|
80
86
|
if (!utils.types.has(selector, 'type'))
|
|
81
87
|
return selector.selector;
|
|
@@ -84,8 +90,8 @@ function transformSelector(selector) {
|
|
|
84
90
|
}
|
|
85
91
|
return selector;
|
|
86
92
|
}
|
|
87
|
-
exports.
|
|
88
|
-
function
|
|
93
|
+
exports.toSelector = toSelector;
|
|
94
|
+
function toSimpleCommonSelector(selector) {
|
|
89
95
|
if (utils.types.instanceOf(selector, 'Locator')) {
|
|
90
96
|
;
|
|
91
97
|
[, selector] = selector.toString().match(/Locator@(.+)/);
|
|
@@ -94,48 +100,17 @@ function untransformSelector(selector) {
|
|
|
94
100
|
return { selector };
|
|
95
101
|
return selector;
|
|
96
102
|
}
|
|
97
|
-
exports.
|
|
103
|
+
exports.toSimpleCommonSelector = toSimpleCommonSelector;
|
|
98
104
|
function extractContext(page) {
|
|
99
105
|
return isDriver(page) ? page.mainFrame() : page;
|
|
100
106
|
}
|
|
101
107
|
exports.extractContext = extractContext;
|
|
102
|
-
function isStaleElementError(err) {
|
|
103
|
-
var _a, _b, _c, _d;
|
|
104
|
-
return (((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('Element is not attached to the DOM')) || // universal message
|
|
105
|
-
((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes('Protocol error (DOM.describeNode)')) || // chrome message
|
|
106
|
-
((_c = err === null || err === void 0 ? void 0 : err.message) === null || _c === void 0 ? void 0 : _c.includes('Protocol error (Page.adoptNode)')) || // firefox message
|
|
107
|
-
((_d = err === null || err === void 0 ? void 0 : err.message) === null || _d === void 0 ? void 0 : _d.includes('Unable to adopt element handle from a different document')) // webkit message
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
exports.isStaleElementError = isStaleElementError;
|
|
111
|
-
// #endregion
|
|
112
|
-
// #region COMMANDS
|
|
113
108
|
async function executeScript(frame, script, arg) {
|
|
114
109
|
script = utils.types.isString(script) ? new Function(script) : script;
|
|
115
110
|
const result = await frame.evaluateHandle(script, arg);
|
|
116
111
|
return handleToObject(result);
|
|
117
112
|
}
|
|
118
113
|
exports.executeScript = executeScript;
|
|
119
|
-
async function mainContext(frame) {
|
|
120
|
-
frame = extractContext(frame);
|
|
121
|
-
let mainFrame = frame;
|
|
122
|
-
while (mainFrame.parentFrame()) {
|
|
123
|
-
mainFrame = mainFrame.parentFrame();
|
|
124
|
-
}
|
|
125
|
-
return mainFrame;
|
|
126
|
-
}
|
|
127
|
-
exports.mainContext = mainContext;
|
|
128
|
-
async function parentContext(frame) {
|
|
129
|
-
var _a;
|
|
130
|
-
frame = extractContext(frame);
|
|
131
|
-
return (_a = frame.parentFrame()) !== null && _a !== void 0 ? _a : frame;
|
|
132
|
-
}
|
|
133
|
-
exports.parentContext = parentContext;
|
|
134
|
-
async function childContext(_frame, element) {
|
|
135
|
-
const frame = (await element.contentFrame());
|
|
136
|
-
return frame;
|
|
137
|
-
}
|
|
138
|
-
exports.childContext = childContext;
|
|
139
114
|
async function findElement(frame, selector, parent) {
|
|
140
115
|
if (utils.types.instanceOf(selector, 'Locator')) {
|
|
141
116
|
return selector.elementHandle();
|
|
@@ -157,6 +132,36 @@ async function setElementText(frame, element, text) {
|
|
|
157
132
|
await (resolvedElement === null || resolvedElement === void 0 ? void 0 : resolvedElement.fill(text));
|
|
158
133
|
}
|
|
159
134
|
exports.setElementText = setElementText;
|
|
135
|
+
async function hover(_frame, element) {
|
|
136
|
+
await element.hover();
|
|
137
|
+
}
|
|
138
|
+
exports.hover = hover;
|
|
139
|
+
async function click(_frame, element) {
|
|
140
|
+
await element.click();
|
|
141
|
+
}
|
|
142
|
+
exports.click = click;
|
|
143
|
+
async function mainContext(frame) {
|
|
144
|
+
let mainFrame = frame;
|
|
145
|
+
while (mainFrame.parentFrame()) {
|
|
146
|
+
mainFrame = mainFrame.parentFrame();
|
|
147
|
+
}
|
|
148
|
+
return mainFrame;
|
|
149
|
+
}
|
|
150
|
+
exports.mainContext = mainContext;
|
|
151
|
+
async function parentContext(frame) {
|
|
152
|
+
var _a;
|
|
153
|
+
return (_a = frame.parentFrame()) !== null && _a !== void 0 ? _a : frame;
|
|
154
|
+
}
|
|
155
|
+
exports.parentContext = parentContext;
|
|
156
|
+
async function childContext(_frame, element) {
|
|
157
|
+
const frame = (await element.contentFrame());
|
|
158
|
+
return frame;
|
|
159
|
+
}
|
|
160
|
+
exports.childContext = childContext;
|
|
161
|
+
async function getDriverInfo(_page) {
|
|
162
|
+
return { features: { allCookies: true } };
|
|
163
|
+
}
|
|
164
|
+
exports.getDriverInfo = getDriverInfo;
|
|
160
165
|
async function getViewportSize(page) {
|
|
161
166
|
return page.viewportSize();
|
|
162
167
|
}
|
|
@@ -174,10 +179,6 @@ async function getCookies(page) {
|
|
|
174
179
|
});
|
|
175
180
|
}
|
|
176
181
|
exports.getCookies = getCookies;
|
|
177
|
-
async function getDriverInfo(_page) {
|
|
178
|
-
return { features: { allCookies: true } };
|
|
179
|
-
}
|
|
180
|
-
exports.getDriverInfo = getDriverInfo;
|
|
181
182
|
async function getTitle(page) {
|
|
182
183
|
return page.title();
|
|
183
184
|
}
|
|
@@ -194,24 +195,6 @@ async function takeScreenshot(page) {
|
|
|
194
195
|
return page.screenshot();
|
|
195
196
|
}
|
|
196
197
|
exports.takeScreenshot = takeScreenshot;
|
|
197
|
-
async function click(frame, element) {
|
|
198
|
-
const resolvedElement = isSelector(element) ? await findElement(frame, element) : element;
|
|
199
|
-
await (resolvedElement === null || resolvedElement === void 0 ? void 0 : resolvedElement.click());
|
|
200
|
-
}
|
|
201
|
-
exports.click = click;
|
|
202
|
-
async function hover(frame, element) {
|
|
203
|
-
const resolvedElement = isSelector(element) ? await findElement(frame, element) : element;
|
|
204
|
-
await (resolvedElement === null || resolvedElement === void 0 ? void 0 : resolvedElement.hover());
|
|
205
|
-
}
|
|
206
|
-
exports.hover = hover;
|
|
207
|
-
async function waitUntilDisplayed(frame, selector) {
|
|
208
|
-
if (utils.types.instanceOf(selector, 'Locator'))
|
|
209
|
-
return selector.waitFor();
|
|
210
|
-
await frame.waitForSelector(selector);
|
|
211
|
-
}
|
|
212
|
-
exports.waitUntilDisplayed = waitUntilDisplayed;
|
|
213
|
-
// #endregion
|
|
214
|
-
// #region BUILD
|
|
215
198
|
const browserNames = {
|
|
216
199
|
chrome: 'chromium',
|
|
217
200
|
safari: 'webkit',
|
|
@@ -246,6 +229,12 @@ async function build(env) {
|
|
|
246
229
|
headless: headless && !extension,
|
|
247
230
|
ignoreDefaultArgs: ['--hide-scrollbars'],
|
|
248
231
|
};
|
|
232
|
+
// TODO remove this once Playwright provides formal support for headless: 'new' (https://github.com/microsoft/playwright/issues/21194)
|
|
233
|
+
if (headless === 'new') {
|
|
234
|
+
options.args.push('--headless=new');
|
|
235
|
+
delete options.headless;
|
|
236
|
+
options.ignoreDefaultArgs.push('--headless');
|
|
237
|
+
}
|
|
249
238
|
if (extension) {
|
|
250
239
|
options.args.push(`--load-extension=${extension}`, `--disable-extensions-except=${extension}`);
|
|
251
240
|
}
|
|
@@ -281,4 +270,3 @@ async function build(env) {
|
|
|
281
270
|
return [page, () => (driver ? driver.close() : context.close())];
|
|
282
271
|
}
|
|
283
272
|
exports.build = build;
|
|
284
|
-
// #endregion
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applitools/spec-driver-playwright",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.23",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"playwright",
|
|
6
6
|
"chrome devtools protocol",
|
|
@@ -37,17 +37,17 @@
|
|
|
37
37
|
"test": "run --top-level mocha './test/**/*.spec.ts' --exit",
|
|
38
38
|
"setup": "yarn playwright:setup",
|
|
39
39
|
"playwright:setup": "sudo npx playwright install-deps",
|
|
40
|
-
"up:framework": "
|
|
40
|
+
"up:framework": "yarn add --dev --caret playwright${APPLITOOLS_FRAMEWORK_VERSION:+@$APPLITOOLS_FRAMEWORK_VERSION}"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@applitools/driver": "1.13.
|
|
44
|
-
"@applitools/utils": "1.5.
|
|
43
|
+
"@applitools/driver": "1.13.5",
|
|
44
|
+
"@applitools/utils": "1.5.1"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@applitools/api-extractor": "^1.2.21",
|
|
48
48
|
"@applitools/test-utils": "^1.5.17",
|
|
49
49
|
"@types/node": "^12.20.55",
|
|
50
|
-
"playwright": "^1.
|
|
50
|
+
"playwright": "^1.37.0"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"playwright": ">=1.0.0"
|
package/types/index.d.ts
CHANGED
|
@@ -1,34 +1,40 @@
|
|
|
1
|
-
declare const _default:
|
|
1
|
+
declare const _default: SpecDriver;
|
|
2
2
|
export default _default;
|
|
3
3
|
export function isDriver(page: any): page is Driver;
|
|
4
4
|
export function isContext(frame: any): frame is Context;
|
|
5
5
|
export function isElement(element: any): element is Element<Node>;
|
|
6
6
|
export function isSelector(selector: any): selector is Selector;
|
|
7
|
-
export function transformSelector(selector: import('@applitools/driver').CommonSelector<Selector>): Selector;
|
|
8
|
-
export function untransformSelector(selector: Selector): import('@applitools/driver').CommonSelector;
|
|
9
|
-
export function extractContext(page: Driver | Context): Context;
|
|
10
7
|
export function isStaleElementError(err: any): boolean;
|
|
8
|
+
export function toSelector(selector: import('@applitools/driver').CommonSelector<Selector>): Selector;
|
|
9
|
+
export function toSimpleCommonSelector(selector: Selector): import('@applitools/driver').CommonSelector;
|
|
10
|
+
export function extractContext(page: Driver): Context;
|
|
11
11
|
export function executeScript(frame: Context, script: string | ((arg: any) => any), arg: any): Promise<any>;
|
|
12
|
-
export function mainContext(frame: Context): Promise<Context>;
|
|
13
|
-
export function parentContext(frame: Context): Promise<Context>;
|
|
14
|
-
export function childContext(_frame: Context, element: Element<Node>): Promise<Context>;
|
|
15
12
|
export function findElement(frame: Context, selector: Selector, parent?: undefined | Element<Node>): Promise<null | Element<SVGElement | HTMLElement>>;
|
|
16
13
|
export function findElements(frame: Context, selector: Selector, parent?: undefined | Element<Node>): Promise<Array<Element<SVGElement | HTMLElement>>>;
|
|
17
14
|
export function setElementText(frame: Context, element: Selector | Element<Node>, text: string): Promise<void>;
|
|
15
|
+
export function hover(_frame: Context, element: Element<Node>): Promise<void>;
|
|
16
|
+
export function click(_frame: Context, element: Element<Node>): Promise<void>;
|
|
17
|
+
export function mainContext(frame: Context): Promise<Context>;
|
|
18
|
+
export function parentContext(frame: Context): Promise<Context>;
|
|
19
|
+
export function childContext(_frame: Context, element: Element<Node>): Promise<Context>;
|
|
20
|
+
export function getDriverInfo(_page: Driver): Promise<import('@applitools/driver').DriverInfo>;
|
|
18
21
|
export function getViewportSize(page: Driver): Promise<{ width: number; height: number; }>;
|
|
19
22
|
export function setViewportSize(page: Driver, size: { width: number; height: number; }): Promise<void>;
|
|
20
23
|
export function getCookies(page: Driver): Promise<Array<import('@applitools/driver').Cookie>>;
|
|
21
|
-
export function getDriverInfo(_page: Driver): Promise<import('@applitools/driver').DriverInfo>;
|
|
22
24
|
export function getTitle(page: Driver): Promise<string>;
|
|
23
25
|
export function getUrl(page: Driver): Promise<string>;
|
|
24
26
|
export function visit(page: Driver, url: string): Promise<void>;
|
|
25
27
|
export function takeScreenshot(page: Driver): Promise<Buffer>;
|
|
26
|
-
export function click(frame: Context, element: Selector | Element<Node>): Promise<void>;
|
|
27
|
-
export function hover(frame: Context, element: Selector | Element<Node>): Promise<void>;
|
|
28
|
-
export function waitUntilDisplayed(frame: Context, selector: Selector): Promise<void>;
|
|
29
28
|
export function build(env: any): Promise<[Driver, () => Promise<void>]>;
|
|
30
29
|
export type Driver = import('playwright-core').Page & { __applitoolsBrand?: undefined; };
|
|
31
30
|
export type Context = import('playwright-core').Frame & { __applitoolsBrand?: undefined; };
|
|
32
31
|
export type Element<T = Node> = import('playwright-core').ElementHandle<T> & { __applitoolsBrand?: undefined; };
|
|
33
32
|
export type Selector = (string | import('playwright-core').Locator) & { __applitoolsBrand?: undefined; };
|
|
34
|
-
export type
|
|
33
|
+
export type PrimarySpecType = {
|
|
34
|
+
driver: Driver;
|
|
35
|
+
context: Context;
|
|
36
|
+
element: Element<Node>;
|
|
37
|
+
selector: Selector;
|
|
38
|
+
secondary: never;
|
|
39
|
+
};
|
|
40
|
+
export type SpecDriver = import('@applitools/driver').SpecDriver<PrimarySpecType>;
|