@applitools/spec-driver-playwright 1.2.0 → 1.3.2

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/dist/index.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -24,4 +28,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
24
28
  Object.defineProperty(exports, "__esModule", { value: true });
25
29
  const spec = __importStar(require("./spec-driver"));
26
30
  __exportStar(require("./spec-driver"), exports);
27
- exports.default = spec;
31
+ const typedSpec = spec;
32
+ exports.default = typedSpec;
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -19,7 +23,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
19
23
  return result;
20
24
  };
21
25
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.build = exports.waitUntilDisplayed = exports.scrollIntoView = exports.hover = exports.type = exports.click = exports.takeScreenshot = exports.visit = exports.getUrl = exports.getTitle = exports.getDriverInfo = exports.getCookies = exports.setViewportSize = exports.getViewportSize = exports.findElements = exports.findElement = exports.childContext = exports.parentContext = exports.mainContext = exports.executeScript = exports.isStaleElementError = exports.extractContext = exports.transformSelector = exports.isSelector = exports.isElement = exports.isContext = exports.isDriver = void 0;
26
+ exports.build = exports.waitUntilDisplayed = exports.scrollIntoView = exports.hover = exports.type = exports.click = exports.takeScreenshot = exports.visit = exports.getUrl = exports.getTitle = exports.getDriverInfo = exports.getCookies = exports.setViewportSize = exports.getViewportSize = exports.findElements = exports.findElement = exports.childContext = exports.parentContext = exports.mainContext = exports.executeScript = exports.isStaleElementError = exports.extractContext = exports.untransformSelector = exports.transformSelector = exports.isSelector = exports.isElement = exports.isContext = exports.isDriver = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const os = __importStar(require("os"));
29
+ const path = __importStar(require("path"));
23
30
  const utils = __importStar(require("@applitools/utils"));
24
31
  // #region HELPERS
25
32
  async function handleToObject(handle) {
@@ -63,7 +70,9 @@ function isElement(element) {
63
70
  }
64
71
  exports.isElement = isElement;
65
72
  function isSelector(selector) {
66
- return utils.types.isString(selector);
73
+ if (!selector)
74
+ return false;
75
+ return utils.types.isString(selector) || utils.types.instanceOf(selector, 'Locator');
67
76
  }
68
77
  exports.isSelector = isSelector;
69
78
  function transformSelector(selector) {
@@ -76,15 +85,26 @@ function transformSelector(selector) {
76
85
  return selector;
77
86
  }
78
87
  exports.transformSelector = transformSelector;
88
+ function untransformSelector(selector) {
89
+ if (utils.types.instanceOf(selector, 'Locator')) {
90
+ ;
91
+ [, selector] = selector.toString().match(/Locator@(.+)/);
92
+ }
93
+ if (utils.types.isString(selector))
94
+ return { selector };
95
+ return selector;
96
+ }
97
+ exports.untransformSelector = untransformSelector;
79
98
  function extractContext(page) {
80
99
  return isDriver(page) ? page.mainFrame() : page;
81
100
  }
82
101
  exports.extractContext = extractContext;
83
102
  function isStaleElementError(err) {
84
- var _a, _b, _c;
85
- return (((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('Protocol error (DOM.describeNode)')) || // chrome
86
- ((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes('Protocol error (Page.adoptNode)')) || // firefox
87
- ((_c = err === null || err === void 0 ? void 0 : err.message) === null || _c === void 0 ? void 0 : _c.includes('Unable to adopt element handle from a different document')) // webkit
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
88
108
  );
89
109
  }
90
110
  exports.isStaleElementError = isStaleElementError;
@@ -115,11 +135,15 @@ async function childContext(_frame, element) {
115
135
  }
116
136
  exports.childContext = childContext;
117
137
  async function findElement(frame, selector, parent) {
138
+ if (utils.types.instanceOf(selector, 'Locator'))
139
+ return selector.elementHandle();
118
140
  const root = parent !== null && parent !== void 0 ? parent : frame;
119
141
  return root.$(selector);
120
142
  }
121
143
  exports.findElement = findElement;
122
144
  async function findElements(frame, selector, parent) {
145
+ if (utils.types.instanceOf(selector, 'Locator'))
146
+ return selector.elementHandles();
123
147
  const root = parent !== null && parent !== void 0 ? parent : frame;
124
148
  return root.$$(selector);
125
149
  }
@@ -187,6 +211,8 @@ async function scrollIntoView(frame, element, align = false) {
187
211
  }
188
212
  exports.scrollIntoView = scrollIntoView;
189
213
  async function waitUntilDisplayed(frame, selector) {
214
+ if (utils.types.instanceOf(selector, 'Locator'))
215
+ return selector.waitFor();
190
216
  await frame.waitForSelector(selector);
191
217
  }
192
218
  exports.waitUntilDisplayed = waitUntilDisplayed;
@@ -200,7 +226,7 @@ const browserNames = {
200
226
  async function build(env) {
201
227
  const playwright = require('playwright');
202
228
  const parseEnv = require('@applitools/test-utils/src/parse-env');
203
- const { browser, device, url, attach, proxy, args = [], headless } = parseEnv(env, 'cdp');
229
+ const { browser, device, url, attach, proxy, args = [], headless, extension } = parseEnv(env, 'cdp');
204
230
  const launcher = playwright[browserNames[browser] || browser];
205
231
  if (!launcher)
206
232
  throw new Error(`Browser "${browser}" is not supported.`);
@@ -208,30 +234,38 @@ async function build(env) {
208
234
  throw new Error(`Attaching to the existed browser doesn't supported by playwright`);
209
235
  const options = {
210
236
  args,
211
- headless,
237
+ headless: headless && !extension,
212
238
  ignoreDefaultArgs: ['--hide-scrollbars'],
213
239
  };
240
+ if (extension) {
241
+ options.args.push(`--load-extension=${extension}`, `--disable-extensions-except=${extension}`);
242
+ }
214
243
  if (proxy) {
215
244
  options.proxy = {
216
245
  server: proxy.https || proxy.http || proxy.server,
217
246
  bypass: proxy.bypass.join(','),
218
247
  };
219
248
  }
220
- let driver;
221
- if (url) {
222
- if (utils.types.isArray(options.ignoreDefaultArgs)) {
223
- url.searchParams.set('ignoreDefaultArgs', options.ignoreDefaultArgs.join(','));
224
- }
225
- url.searchParams.set('headless', options.headless);
226
- options.args.forEach((arg) => url.searchParams.set(...arg.split('=')));
227
- driver = await launcher.connect({ wsEndpoint: url.href });
249
+ let driver, context;
250
+ if (extension) {
251
+ context = await launcher.launchPersistentContext(fs.mkdtempSync(path.join(os.tmpdir(), 'chrome-user-data-dir')), Object.assign(Object.assign(Object.assign({}, options), { viewport: null }), (device ? playwright.devices[device] : {})));
228
252
  }
229
253
  else {
230
- driver = await launcher.launch(options);
254
+ if (url) {
255
+ if (utils.types.isArray(options.ignoreDefaultArgs)) {
256
+ url.searchParams.set('ignoreDefaultArgs', options.ignoreDefaultArgs.join(','));
257
+ }
258
+ url.searchParams.set('headless', options.headless);
259
+ options.args.forEach((arg) => url.searchParams.set(...arg.split('=')));
260
+ driver = await launcher.connect({ wsEndpoint: url.href });
261
+ }
262
+ else {
263
+ driver = await launcher.launch(options);
264
+ }
265
+ context = await driver.newContext(device ? playwright.devices[device] : {});
231
266
  }
232
- const context = await driver.newContext(device ? playwright.devices[device] : {});
233
267
  const page = await context.newPage();
234
- return [page, () => driver.close()];
268
+ return [page, () => (driver ? driver.close() : context.close())];
235
269
  }
236
270
  exports.build = build;
237
271
  // #endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/spec-driver-playwright",
3
- "version": "1.2.0",
3
+ "version": "1.3.2",
4
4
  "keywords": [
5
5
  "playwright",
6
6
  "chrome devtools protocol",
@@ -18,13 +18,16 @@
18
18
  "repository": {
19
19
  "type": "git",
20
20
  "url": "git://github.com/applitools/eyes.sdk.javascript1.git",
21
- "directory": "packages/spec-driver-playwright"
21
+ "directory": "js/packages/spec-driver-playwright"
22
22
  },
23
23
  "license": "SEE LICENSE IN LICENSE",
24
24
  "author": {
25
25
  "name": "Applitools Team",
26
26
  "email": "team@applitools.com"
27
27
  },
28
+ "aliases": [
29
+ "spec-playwright"
30
+ ],
28
31
  "main": "./dist/index.js",
29
32
  "types": "./types/index.d.ts",
30
33
  "files": [
@@ -35,11 +38,13 @@
35
38
  "lint": "eslint '**/*.ts'",
36
39
  "build": "ttsc",
37
40
  "test": "mocha ./test/**/*.spec.ts --no-timeouts -r ts-node/register",
41
+ "test:sanity": "yarn test",
38
42
  "setup": "yarn playwright:setup",
39
43
  "playwright:setup": "sudo npx playwright install-deps",
44
+ "upgrade:framework": "if [ ! -z $APPLITOOLS_PLAYWRIGHT_VERSION ]; then packagejson=`cat package.json`; yarn upgrade --no-lockfile playwright@$APPLITOOLS_PLAYWRIGHT_VERSION; echo \"$packagejson\" > package.json; fi",
40
45
  "deps": "bongo deps",
41
46
  "gh:test": "gh workflow run test.yml --ref $(git rev-parse --abbrev-ref HEAD) -f packages='spec-playwright' -f links='types utils test-utils'",
42
- "gh:publish": "gh workflow run publish.yml --ref $(git rev-parse --abbrev-ref HEAD) -f packages='spec-playwright'",
47
+ "gh:publish": "gh workflow run publish-spec-playwright.yml --ref $(git rev-parse --abbrev-ref HEAD)",
43
48
  "preversion": "bongo preversion",
44
49
  "version": "bongo version",
45
50
  "postversion": "bongo postversion --skip-release-notification"
@@ -50,32 +55,35 @@
50
55
  }
51
56
  },
52
57
  "dependencies": {
53
- "@applitools/types": "1.0.19",
54
- "@applitools/utils": "1.2.4"
58
+ "@applitools/types": "1.5.6",
59
+ "@applitools/utils": "1.3.10"
55
60
  },
56
61
  "devDependencies": {
57
- "@applitools/api-extractor": "^1.2.2",
58
- "@applitools/scripts": "1.0.1",
59
- "@applitools/sdk-release-kit": "0.13.4",
60
- "@applitools/test-utils": "1.0.9",
62
+ "@applitools/api-extractor": "^1.2.9",
63
+ "@applitools/bongo": "^2.1.6",
64
+ "@applitools/scripts": "1.1.0",
65
+ "@applitools/test-utils": "1.4.2",
61
66
  "@types/mocha": "^9.0.0",
62
- "@types/node": "^16.10.2",
63
- "@typescript-eslint/eslint-plugin": "^4.15.1",
64
- "@typescript-eslint/parser": "^4.15.1",
65
- "eslint": "^7.9.0",
66
- "eslint-config-prettier": "^7.2.0",
67
+ "@types/node": "12",
68
+ "@typescript-eslint/eslint-plugin": "^5.27.0",
69
+ "@typescript-eslint/parser": "^5.27.0",
70
+ "eslint": "^8.16.0",
71
+ "eslint-config-prettier": "^8.5.0",
67
72
  "eslint-plugin-mocha-no-only": "^1.1.1",
68
73
  "eslint-plugin-node": "^11.1.0",
69
- "eslint-plugin-prettier": "^3.3.1",
74
+ "eslint-plugin-prettier": "^4.0.0",
70
75
  "husky": "^4.3.7",
71
- "mocha": "^9.1.2",
72
- "playwright": "^1.15.2",
73
- "prettier": "^2.4.1",
74
- "ts-node": "^10.2.1",
75
- "ttypescript": "^1.5.12",
76
- "typescript": "^4.5.0-beta"
76
+ "mocha": "^9.2.2",
77
+ "playwright": "^1.22.2",
78
+ "prettier": "^2.6.2",
79
+ "ts-node": "^10.8.0",
80
+ "ttypescript": "^1.5.13",
81
+ "typescript": "^4.7.2"
77
82
  },
78
83
  "peerDependencies": {
79
84
  "playwright": ">=1.0.0"
85
+ },
86
+ "engines": {
87
+ "node": ">=12.13.0"
80
88
  }
81
89
  }
package/types/index.d.ts CHANGED
@@ -4,15 +4,16 @@ 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;
6
6
  export function isSelector(selector: any): selector is Selector;
7
- export function transformSelector(selector: Selector | (string | { selector: string | Selector; type?: string; })): Selector;
7
+ export function transformSelector(selector: string | { selector: string | Selector; type?: string; }): Selector;
8
+ export function untransformSelector(selector: Selector): string | { selector: string; type?: string; };
8
9
  export function extractContext(page: Driver | Context): Context;
9
10
  export function isStaleElementError(err: any): boolean;
10
11
  export function executeScript(frame: Context, script: string | ((arg: any) => any), arg: any): Promise<any>;
11
12
  export function mainContext(frame: Context): Promise<Context>;
12
13
  export function parentContext(frame: Context): Promise<Context>;
13
14
  export function childContext(_frame: Context, element: Element): Promise<Context>;
14
- export function findElement(frame: Context, selector: Selector, parent: Element): Promise<Element>;
15
- export function findElements(frame: Context, selector: Selector, parent: Element): Promise<Array<Element>>;
15
+ export function findElement(frame: Context, selector: Selector, parent?: Element): Promise<Element>;
16
+ export function findElements(frame: Context, selector: Selector, parent?: Element): Promise<Array<Element>>;
16
17
  export function getViewportSize(page: Driver): Promise<import('@applitools/types').Size>;
17
18
  export function setViewportSize(page: Driver, size: import('@applitools/types').Size): Promise<void>;
18
19
  export function getCookies(page: Driver): Promise<Array<import('@applitools/types').Cookie>>;
@@ -29,5 +30,5 @@ export function waitUntilDisplayed(frame: Context, selector: Selector): Promise<
29
30
  export function build(env: any): Promise<[Driver, () => Promise<void>]>;
30
31
  export type Driver = import('playwright').Page & { __applitoolsBrand?: never; };
31
32
  export type Context = import('playwright').Frame & { __applitoolsBrand?: never; };
32
- export type Element = import('playwright').ElementHandle<Node> & { __applitoolsBrand?: never; };
33
- export type Selector = string & { __applitoolsBrand?: never; };
33
+ export type Element = import('playwright').ElementHandle & { __applitoolsBrand?: never; };
34
+ export type Selector = (string | import('playwright').Locator) & { __applitoolsBrand?: never; };
package/CHANGELOG.md DELETED
@@ -1,21 +0,0 @@
1
- # Change Log
2
-
3
- ## Unreleased
4
-
5
-
6
- ## 1.2.0 - 2021/11/10
7
-
8
- - updated to @applitools/types@1.0.19 (from 1.0.15)
9
- - updated to @applitools/utils@1.2.4 (from 1.2.3)
10
-
11
- ## 1.1.1 - 2021/10/20
12
-
13
- - fix handle type parser
14
-
15
- ## 1.1.0 - 2021/10/12
16
-
17
- - bump version
18
-
19
- ## 1.0.3 - 2021/10/12
20
-
21
- - spec driver implementation for playwright framework