@applitools/spec-driver-playwright 1.1.1 → 1.3.1

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,13 +1,31 @@
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];
8
12
  }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
9
25
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
26
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
27
  };
12
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
+ const spec = __importStar(require("./spec-driver"));
13
30
  __exportStar(require("./spec-driver"), exports);
31
+ exports.default = spec;
@@ -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.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.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) {
@@ -81,7 +90,12 @@ function extractContext(page) {
81
90
  }
82
91
  exports.extractContext = extractContext;
83
92
  function isStaleElementError(err) {
84
- return err && err.message && err.message.includes('Protocol error (DOM.describeNode)');
93
+ var _a, _b, _c, _d;
94
+ 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
95
+ ((_b = err === null || err === void 0 ? void 0 : err.message) === null || _b === void 0 ? void 0 : _b.includes('Protocol error (DOM.describeNode)')) || // chrome message
96
+ ((_c = err === null || err === void 0 ? void 0 : err.message) === null || _c === void 0 ? void 0 : _c.includes('Protocol error (Page.adoptNode)')) || // firefox message
97
+ ((_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
98
+ );
85
99
  }
86
100
  exports.isStaleElementError = isStaleElementError;
87
101
  // #endregion
@@ -111,11 +125,15 @@ async function childContext(_frame, element) {
111
125
  }
112
126
  exports.childContext = childContext;
113
127
  async function findElement(frame, selector, parent) {
128
+ if (utils.types.instanceOf(selector, 'Locator'))
129
+ return selector.elementHandle();
114
130
  const root = parent !== null && parent !== void 0 ? parent : frame;
115
131
  return root.$(selector);
116
132
  }
117
133
  exports.findElement = findElement;
118
134
  async function findElements(frame, selector, parent) {
135
+ if (utils.types.instanceOf(selector, 'Locator'))
136
+ return selector.elementHandles();
119
137
  const root = parent !== null && parent !== void 0 ? parent : frame;
120
138
  return root.$$(selector);
121
139
  }
@@ -128,6 +146,19 @@ async function setViewportSize(page, size) {
128
146
  return page.setViewportSize(size);
129
147
  }
130
148
  exports.setViewportSize = setViewportSize;
149
+ async function getCookies(page) {
150
+ const cookies = await page.context().cookies();
151
+ return cookies.map(cookie => {
152
+ const copy = Object.assign(Object.assign({}, cookie), { expiry: cookie.expires });
153
+ delete copy.expires;
154
+ return copy;
155
+ });
156
+ }
157
+ exports.getCookies = getCookies;
158
+ async function getDriverInfo(_page) {
159
+ return { features: { allCookies: true } };
160
+ }
161
+ exports.getDriverInfo = getDriverInfo;
131
162
  async function getTitle(page) {
132
163
  return page.title();
133
164
  }
@@ -170,6 +201,8 @@ async function scrollIntoView(frame, element, align = false) {
170
201
  }
171
202
  exports.scrollIntoView = scrollIntoView;
172
203
  async function waitUntilDisplayed(frame, selector) {
204
+ if (utils.types.instanceOf(selector, 'Locator'))
205
+ return selector.waitFor();
173
206
  await frame.waitForSelector(selector);
174
207
  }
175
208
  exports.waitUntilDisplayed = waitUntilDisplayed;
@@ -183,7 +216,7 @@ const browserNames = {
183
216
  async function build(env) {
184
217
  const playwright = require('playwright');
185
218
  const parseEnv = require('@applitools/test-utils/src/parse-env');
186
- const { browser, device, url, attach, proxy, args = [], headless } = parseEnv(env, 'cdp');
219
+ const { browser, device, url, attach, proxy, args = [], headless, extension } = parseEnv(env, 'cdp');
187
220
  const launcher = playwright[browserNames[browser] || browser];
188
221
  if (!launcher)
189
222
  throw new Error(`Browser "${browser}" is not supported.`);
@@ -191,30 +224,38 @@ async function build(env) {
191
224
  throw new Error(`Attaching to the existed browser doesn't supported by playwright`);
192
225
  const options = {
193
226
  args,
194
- headless,
227
+ headless: headless && !extension,
195
228
  ignoreDefaultArgs: ['--hide-scrollbars'],
196
229
  };
230
+ if (extension) {
231
+ options.args.push(`--load-extension=${extension}`, `--disable-extensions-except=${extension}`);
232
+ }
197
233
  if (proxy) {
198
234
  options.proxy = {
199
235
  server: proxy.https || proxy.http || proxy.server,
200
236
  bypass: proxy.bypass.join(','),
201
237
  };
202
238
  }
203
- let driver;
204
- if (url) {
205
- if (utils.types.isArray(options.ignoreDefaultArgs)) {
206
- url.searchParams.set('ignoreDefaultArgs', options.ignoreDefaultArgs.join(','));
207
- }
208
- url.searchParams.set('headless', options.headless);
209
- options.args.forEach((arg) => url.searchParams.set(...arg.split('=')));
210
- driver = await launcher.connect({ wsEndpoint: url.href });
239
+ let driver, context;
240
+ if (extension) {
241
+ 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] : {})));
211
242
  }
212
243
  else {
213
- driver = await launcher.launch(options);
244
+ if (url) {
245
+ if (utils.types.isArray(options.ignoreDefaultArgs)) {
246
+ url.searchParams.set('ignoreDefaultArgs', options.ignoreDefaultArgs.join(','));
247
+ }
248
+ url.searchParams.set('headless', options.headless);
249
+ options.args.forEach((arg) => url.searchParams.set(...arg.split('=')));
250
+ driver = await launcher.connect({ wsEndpoint: url.href });
251
+ }
252
+ else {
253
+ driver = await launcher.launch(options);
254
+ }
255
+ context = await driver.newContext(device ? playwright.devices[device] : {});
214
256
  }
215
- const context = await driver.newContext(device ? playwright.devices[device] : {});
216
257
  const page = await context.newPage();
217
- return [page, () => driver.close()];
258
+ return [page, () => (driver ? driver.close() : context.close())];
218
259
  }
219
260
  exports.build = build;
220
261
  // #endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/spec-driver-playwright",
3
- "version": "1.1.1",
3
+ "version": "1.3.1",
4
4
  "keywords": [
5
5
  "playwright",
6
6
  "chrome devtools protocol",
@@ -17,7 +17,8 @@
17
17
  },
18
18
  "repository": {
19
19
  "type": "git",
20
- "url": "git://github.com/applitools/eyes.sdk.javascript1.git"
20
+ "url": "git://github.com/applitools/eyes.sdk.javascript1.git",
21
+ "directory": "packages/spec-driver-playwright"
21
22
  },
22
23
  "license": "SEE LICENSE IN LICENSE",
23
24
  "author": {
@@ -32,12 +33,14 @@
32
33
  ],
33
34
  "scripts": {
34
35
  "lint": "eslint '**/*.ts'",
35
- "build": "yarn build:dist",
36
- "build:dist": "tsc",
36
+ "build": "ttsc",
37
37
  "test": "mocha ./test/**/*.spec.ts --no-timeouts -r ts-node/register",
38
+ "setup": "yarn playwright:setup",
39
+ "playwright:setup": "sudo npx playwright install-deps",
40
+ "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",
38
41
  "deps": "bongo deps",
39
- "gh:test": "gh workflow run test.yml --ref $(git rev-parse --abbrev-ref HEAD) -f packages='spec-playwright' -f links='test-utils utils'",
40
- "gh:publish": "gh workflow run publish.yml --ref $(git rev-parse --abbrev-ref HEAD) -f packages='spec-playwright'",
42
+ "gh:test": "gh workflow run test.yml --ref $(git rev-parse --abbrev-ref HEAD) -f packages='spec-playwright' -f links='types utils test-utils'",
43
+ "gh:publish": "gh workflow run publish-spec-playwright.yml --ref $(git rev-parse --abbrev-ref HEAD)",
41
44
  "preversion": "bongo preversion",
42
45
  "version": "bongo version",
43
46
  "postversion": "bongo postversion --skip-release-notification"
@@ -48,29 +51,35 @@
48
51
  }
49
52
  },
50
53
  "dependencies": {
51
- "@applitools/utils": "1.2.3"
54
+ "@applitools/types": "1.4.4",
55
+ "@applitools/utils": "1.3.1"
52
56
  },
53
57
  "devDependencies": {
54
- "@applitools/scripts": "1.0.1",
55
- "@applitools/sdk-release-kit": "0.13.3",
56
- "@applitools/test-utils": "1.0.9",
58
+ "@applitools/api-extractor": "^1.2.7",
59
+ "@applitools/bongo": "^2.1.0",
60
+ "@applitools/scripts": "1.1.0",
61
+ "@applitools/test-utils": "1.3.2",
57
62
  "@types/mocha": "^9.0.0",
58
- "@types/node": "^16.10.2",
59
- "@typescript-eslint/eslint-plugin": "^4.15.1",
60
- "@typescript-eslint/parser": "^4.15.1",
61
- "eslint": "^7.9.0",
62
- "eslint-config-prettier": "^7.2.0",
63
+ "@types/node": "17.0.36",
64
+ "@typescript-eslint/eslint-plugin": "^5.27.0",
65
+ "@typescript-eslint/parser": "^5.27.0",
66
+ "eslint": "^8.16.0",
67
+ "eslint-config-prettier": "^8.5.0",
63
68
  "eslint-plugin-mocha-no-only": "^1.1.1",
64
69
  "eslint-plugin-node": "^11.1.0",
65
- "eslint-plugin-prettier": "^3.3.1",
70
+ "eslint-plugin-prettier": "^4.0.0",
66
71
  "husky": "^4.3.7",
67
- "mocha": "^9.1.2",
68
- "playwright": "^1.15.2",
69
- "prettier": "^2.4.1",
70
- "ts-node": "^10.2.1",
71
- "typescript": "^4.4.3"
72
+ "mocha": "^9.2.2",
73
+ "playwright": "^1.22.2",
74
+ "prettier": "^2.6.2",
75
+ "ts-node": "^10.8.0",
76
+ "ttypescript": "^1.5.13",
77
+ "typescript": "^4.7.2"
72
78
  },
73
79
  "peerDependencies": {
74
80
  "playwright": ">=1.0.0"
81
+ },
82
+ "engines": {
83
+ "node": ">=12.13.0"
75
84
  }
76
85
  }
package/types/index.d.ts CHANGED
@@ -1 +1,33 @@
1
- export * from './spec-driver';
1
+ declare const _default: import('@applitools/types').SpecDriver<Driver, Context, Element, Selector>;
2
+ export default _default;
3
+ export function isDriver(page: any): page is Driver;
4
+ export function isContext(frame: any): frame is Context;
5
+ export function isElement(element: any): element is Element;
6
+ export function isSelector(selector: any): selector is Selector;
7
+ export function transformSelector(selector: Selector | (string | { selector: string | Selector; type?: string; })): Selector;
8
+ export function extractContext(page: Driver | Context): Context;
9
+ export function isStaleElementError(err: any): boolean;
10
+ export function executeScript(frame: Context, script: string | ((arg: any) => any), arg: any): Promise<any>;
11
+ export function mainContext(frame: Context): Promise<Context>;
12
+ export function parentContext(frame: Context): Promise<Context>;
13
+ 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>>;
16
+ export function getViewportSize(page: Driver): Promise<import('@applitools/types').Size>;
17
+ export function setViewportSize(page: Driver, size: import('@applitools/types').Size): Promise<void>;
18
+ export function getCookies(page: Driver): Promise<Array<import('@applitools/types').Cookie>>;
19
+ export function getDriverInfo(_page: Driver): Promise<import('@applitools/types').DriverInfo>;
20
+ export function getTitle(page: Driver): Promise<string>;
21
+ export function getUrl(page: Driver): Promise<string>;
22
+ export function visit(page: Driver, url: string): Promise<void>;
23
+ export function takeScreenshot(page: Driver): Promise<Buffer>;
24
+ export function click(frame: Context, element: Element | Selector): Promise<void>;
25
+ export function type(frame: Context, element: Element | Selector, keys: string): Promise<void>;
26
+ export function hover(frame: Context, element: Element | Selector): Promise<void>;
27
+ export function scrollIntoView(frame: Context, element: Element | Selector, align: boolean): Promise<void>;
28
+ export function waitUntilDisplayed(frame: Context, selector: Selector): Promise<void>;
29
+ export function build(env: any): Promise<[Driver, () => Promise<void>]>;
30
+ export type Driver = import('playwright').Page & { __applitoolsBrand?: never; };
31
+ export type Context = import('playwright').Frame & { __applitoolsBrand?: never; };
32
+ export type Element = import('playwright').ElementHandle & { __applitoolsBrand?: never; };
33
+ export type Selector = (string | import('playwright').Locator) & { __applitoolsBrand?: never; };
package/CHANGELOG.md DELETED
@@ -1,16 +0,0 @@
1
- # Change Log
2
-
3
- ## Unreleased
4
-
5
-
6
- ## 1.1.1 - 2021/10/20
7
-
8
- - fix handle type parser
9
-
10
- ## 1.1.0 - 2021/10/12
11
-
12
- - bump version
13
-
14
- ## 1.0.3 - 2021/10/12
15
-
16
- - spec driver implementation for playwright framework
@@ -1,42 +0,0 @@
1
- /// <reference types="node" />
2
- import type * as Playwright from 'playwright';
3
- export declare type Driver = Playwright.Page;
4
- export declare type Context = Playwright.Frame;
5
- export declare type Element = Playwright.ElementHandle;
6
- export declare type Selector = string;
7
- declare type CommonSelector = string | {
8
- selector: Selector | string;
9
- type?: string;
10
- };
11
- export declare function isDriver(page: any): page is Driver;
12
- export declare function isContext(frame: any): frame is Context;
13
- export declare function isElement(element: any): element is Element;
14
- export declare function isSelector(selector: any): selector is Selector;
15
- export declare function transformSelector(selector: Selector | CommonSelector): Selector;
16
- export declare function extractContext(page: Driver | Context): Context;
17
- export declare function isStaleElementError(err: any): boolean;
18
- export declare function executeScript(frame: Context, script: ((arg: any) => any) | string, arg: any): Promise<any>;
19
- export declare function mainContext(frame: Context): Promise<Context>;
20
- export declare function parentContext(frame: Context): Promise<Context>;
21
- export declare function childContext(_frame: Context, element: Element): Promise<Context>;
22
- export declare function findElement(frame: Context, selector: Selector, parent?: Element): Promise<Element>;
23
- export declare function findElements(frame: Context, selector: Selector, parent?: Element): Promise<Element[]>;
24
- export declare function getViewportSize(page: Driver): Promise<{
25
- width: number;
26
- height: number;
27
- }>;
28
- export declare function setViewportSize(page: Driver, size: {
29
- width: number;
30
- height: number;
31
- }): Promise<void>;
32
- export declare function getTitle(page: Driver): Promise<string>;
33
- export declare function getUrl(page: Driver): Promise<string>;
34
- export declare function visit(page: Driver, url: string): Promise<void>;
35
- export declare function takeScreenshot(page: Driver): Promise<Buffer>;
36
- export declare function click(frame: Context, element: Element | Selector): Promise<void>;
37
- export declare function type(frame: Context, element: Element | Selector, keys: string): Promise<void>;
38
- export declare function hover(frame: Context, element: Element | Selector): Promise<void>;
39
- export declare function scrollIntoView(frame: Context, element: Element | Selector, align?: boolean): Promise<void>;
40
- export declare function waitUntilDisplayed(frame: Context, selector: Selector): Promise<void>;
41
- export declare function build(env: any): Promise<[Driver, () => Promise<void>]>;
42
- export {};