@cloudscape-design/browser-test-tools 3.0.76 → 3.0.77

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.
@@ -1,6 +1,4 @@
1
- /// <reference types="webdriverio/async" />
2
- import { RemoteOptions } from 'webdriverio';
3
- import { Capabilities } from './capabilities';
1
+ import { Options } from '@wdio/types';
4
2
  export interface WebDriverOptions {
5
3
  width: number;
6
4
  height: number;
@@ -8,7 +6,7 @@ export interface WebDriverOptions {
8
6
  implicitTimeout: number;
9
7
  scriptTimeout: number;
10
8
  baseUrl?: string;
11
- logLevel: RemoteOptions['logLevel'];
9
+ logLevel: Options.WebDriverLogTypes;
12
10
  capabilities?: Record<string, any>;
13
11
  }
14
12
  export default abstract class BrowserCreator {
@@ -18,5 +16,5 @@ export default abstract class BrowserCreator {
18
16
  protected setupBrowser(overrides: Partial<WebDriverOptions>): Promise<WebdriverIO.Browser>;
19
17
  getBrowser(options: Partial<WebDriverOptions>): Promise<WebdriverIO.Browser>;
20
18
  protected abstract __getBrowserUrl(): Promise<URL>;
21
- protected abstract __getCapabilities(): Capabilities;
19
+ protected abstract __getCapabilities(): WebdriverIO.Capabilities;
22
20
  }
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ // SPDX-License-Identifier: Apache-2.0
2
4
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
5
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
6
  };
5
7
  Object.defineProperty(exports, "__esModule", { value: true });
6
- // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
- // SPDX-License-Identifier: Apache-2.0
8
8
  const webdriverio_1 = require("webdriverio");
9
9
  const merge_1 = __importDefault(require("lodash/merge"));
10
10
  const exceptions_1 = require("../exceptions");
@@ -41,7 +41,8 @@ class BrowserCreator {
41
41
  });
42
42
  await browser.setTimeout({ implicit: options.implicitTimeout, script: options.scriptTimeout });
43
43
  if (!browser.isMobile) {
44
- await browser.$('body').then(body => body.moveTo({ xOffset: 0, yOffset: 0 }));
44
+ const body = await browser.$('body');
45
+ await body.moveTo({ xOffset: 0, yOffset: 0 });
45
46
  await browser.setWindowSize(options.width, options.height);
46
47
  }
47
48
  return browser;
@@ -1,8 +1,6 @@
1
- /// <reference types="webdriverio/async" />
2
1
  /// <reference types="node" />
3
2
  import { URL } from 'url';
4
3
  import BrowserCreator, { WebDriverOptions } from './browser-creator';
5
- import { Capabilities } from './capabilities';
6
4
  type BrowserstackCredentials = {
7
5
  user: string;
8
6
  key: string;
@@ -16,6 +14,6 @@ export type BrowserstackOptions = {
16
14
  export default class BrowserStackBrowserCreator extends BrowserCreator {
17
15
  getBrowser(options: Partial<WebDriverOptions>): Promise<WebdriverIO.Browser>;
18
16
  __getBrowserUrl(): Promise<URL>;
19
- protected __getCapabilities(): Capabilities;
17
+ protected __getCapabilities(): WebdriverIO.Capabilities;
20
18
  }
21
19
  export {};
@@ -41,7 +41,7 @@ const browsers = {
41
41
  // Leave blank so we get the latest version. 'beta' is also a valid option
42
42
  // browserVersion: '69.0',
43
43
  'bstack:options': {
44
- seleniumVersion: '3.14.0',
44
+ seleniumVersion: '4.25.0',
45
45
  os: 'Windows',
46
46
  osVersion: '10',
47
47
  },
@@ -1,6 +1,4 @@
1
- import { RemoteOptions } from 'webdriverio';
2
- export type Capabilities = RemoteOptions['capabilities'];
3
- declare const defaultCapabilities: Record<string, Capabilities>;
4
- export declare function getCapability(browserName: string, capabilities: Record<string, Capabilities>): Capabilities;
1
+ declare const defaultCapabilities: Record<string, WebdriverIO.Capabilities>;
2
+ export declare function getCapability(browserName: string, capabilities: Record<string, WebdriverIO.Capabilities>): WebdriverIO.Capabilities;
5
3
  export declare function mergeCapabilities<T>(src: T, overrides: Partial<T>): T;
6
4
  export default defaultCapabilities;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ // SPDX-License-Identifier: Apache-2.0
2
4
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
5
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
6
  };
5
7
  Object.defineProperty(exports, "__esModule", { value: true });
6
8
  exports.mergeCapabilities = exports.getCapability = void 0;
7
- // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
8
- // SPDX-License-Identifier: Apache-2.0
9
9
  const lodash_1 = __importDefault(require("lodash"));
10
10
  const exceptions_1 = require("../exceptions");
11
11
  const defaultCapabilities = {
@@ -64,6 +64,7 @@ const defaultCapabilities = {
64
64
  Firefox: {
65
65
  browserName: 'firefox',
66
66
  'moz:firefoxOptions': {
67
+ args: ['-headless'],
67
68
  prefs: {
68
69
  'fission.webContentIsolationStrategy': 0,
69
70
  'fission.bfcacheInParent': false,
@@ -1,8 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { URL } from 'url';
3
3
  import BrowserCreator from './browser-creator';
4
- import { Capabilities } from './capabilities';
5
4
  export default class MobileBrowserCreator extends BrowserCreator {
6
5
  __getBrowserUrl(): Promise<URL>;
7
- __getCapabilities(): Capabilities;
6
+ __getCapabilities(): WebdriverIO.Capabilities;
8
7
  }
@@ -1,7 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { URL } from 'url';
3
3
  import BrowserCreator from './browser-creator';
4
- import { Capabilities } from './capabilities';
5
4
  export interface DevicefarmOptions {
6
5
  retryCount?: number;
7
6
  projectArn: string;
@@ -9,5 +8,5 @@ export interface DevicefarmOptions {
9
8
  }
10
9
  export default class DevicefarmBrowserCreator extends BrowserCreator {
11
10
  protected __getBrowserUrl(): Promise<URL>;
12
- protected __getCapabilities(): Capabilities;
11
+ protected __getCapabilities(): WebdriverIO.Capabilities;
13
12
  }
@@ -1,8 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { URL } from 'url';
3
3
  import BrowserCreator from './browser-creator';
4
- import { Capabilities } from './capabilities';
5
4
  export default class LocalBrowserCreator extends BrowserCreator {
6
5
  __getBrowserUrl(): Promise<URL>;
7
- __getCapabilities(): Capabilities;
6
+ __getCapabilities(): WebdriverIO.Capabilities;
8
7
  }
package/browsers/local.js CHANGED
@@ -42,15 +42,23 @@ const localBrowsers = {
42
42
  },
43
43
  },
44
44
  },
45
+ // Workaround for https://github.com/webdriverio/webdriverio/issues/13440
46
+ // Reference: https://webdriver.io/blog/2024/08/15/webdriverio-v9-release/#new-features
47
+ 'wdio:enforceWebDriverClassic': true,
45
48
  }),
46
49
  ChromeHeadlessIntegration: (0, capabilities_1.mergeCapabilities)(capabilities_1.default.ChromeHeadless, {
47
50
  'goog:chromeOptions': {
48
51
  args: ['--force-prefers-reduced-motion'],
49
52
  },
53
+ // Workaround for https://github.com/webdriverio/webdriverio/issues/13440
54
+ // Reference: https://webdriver.io/blog/2024/08/15/webdriverio-v9-release/#new-features
55
+ 'wdio:enforceWebDriverClassic': true,
50
56
  }),
51
57
  Firefox: (0, capabilities_1.mergeCapabilities)(capabilities_1.default.Firefox, {
52
- // https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html
53
58
  'moz:debuggerAddress': true,
59
+ // Workaround for failing internal tests
60
+ // Reference: https://webdriver.io/blog/2024/08/15/webdriverio-v9-release/#new-features
61
+ 'wdio:enforceWebDriverClassic': true,
54
62
  }),
55
63
  };
56
64
  class LocalBrowserCreator extends browser_creator_1.default {
@@ -1,3 +1,3 @@
1
1
  {
2
- "commit": "28d57aa7afbb9bf4e2da341447c6fa4812fd62bf"
2
+ "commit": "b569393b252cab88cd1d801c72801362b694e6a5"
3
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudscape-design/browser-test-tools",
3
- "version": "3.0.76",
3
+ "version": "3.0.77",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/cloudscape-design/browser-test-tools.git"
@@ -18,13 +18,15 @@
18
18
  "dependencies": {
19
19
  "@aws-sdk/client-device-farm": "^3.623.0",
20
20
  "@types/pngjs": "^6.0.4",
21
+ "@wdio/globals": "^9.7.0",
22
+ "@wdio/types": "^9.6.3",
21
23
  "get-stream": "^6.0.1",
22
24
  "lodash": "^4.17.21",
23
25
  "p-retry": "^4.6.2",
24
26
  "pixelmatch": "^5.3.0",
25
27
  "pngjs": "^6.0.0",
26
28
  "wait-on": "^7.2.0",
27
- "webdriverio": "^7.25.2"
29
+ "webdriverio": "^9.7.0"
28
30
  },
29
31
  "exports": {
30
32
  "./chrome-launcher": "./chrome-launcher.js",
@@ -1,10 +1,10 @@
1
- /// <reference types="webdriverio/async" />
2
1
  import { ScrollPosition } from '../browser-scripts';
3
2
  import EventsSpy from './events-spy';
4
3
  import { ElementRect } from './types';
4
+ import { Browser } from 'webdriverio';
5
5
  export default class BasePageObject {
6
- protected browser: WebdriverIO.Browser;
7
- constructor(browser: WebdriverIO.Browser);
6
+ protected browser: Browser;
7
+ constructor(browser: Browser);
8
8
  pause(milliseconds: number): Promise<void>;
9
9
  keys(keys: string | string[]): Promise<void>;
10
10
  setWindowSize({ width, height }: {
@@ -18,7 +18,7 @@ export default class BasePageObject {
18
18
  buttonUp(): Promise<void>;
19
19
  dragAndDrop(sourceSelector: string, xOffset?: number, yOffset?: number): Promise<void>;
20
20
  getValue(selector: string): Promise<string>;
21
- setValue(selector: string, value: number | string | string[]): Promise<void>;
21
+ setValue(selector: string, value: number | string): Promise<void>;
22
22
  getViewportSize(): Promise<import("./types").ViewportSize>;
23
23
  getWindowScroll(): Promise<ScrollPosition>;
24
24
  windowScrollTo({ top, left }: Partial<ScrollPosition>): Promise<void>;
@@ -34,7 +34,7 @@ export default class BasePageObject {
34
34
  isDisplayedInViewport(selector: string): Promise<boolean>;
35
35
  isClickable(selector: string): Promise<boolean>;
36
36
  getElementAttribute(selector: string, attributeName: string): Promise<string>;
37
- getElementProperty(selector: string, propertyName: string): Promise<any>;
37
+ getElementProperty(selector: string, propertyName: string): Promise<unknown>;
38
38
  getElementsCount(selector: string): Promise<number>;
39
39
  getFocusedElementText(): Promise<string>;
40
40
  getBoundingBox(selector: string): Promise<ElementRect>;
@@ -61,56 +61,43 @@ class BasePageObject {
61
61
  await element.moveTo({ xOffset, yOffset });
62
62
  }
63
63
  async buttonDownOnElement(selector) {
64
- // buttonDown exists only in JSON Wire protocol
65
- if (this.browser.buttonDown) {
66
- await this.hoverElement(selector);
67
- await this.browser.buttonDown();
68
- }
69
- else {
70
- // Clean up all previous actions before stating a new batch. Without this line Safari emits extra "mouseup" events
71
- await this.browser.releaseActions();
72
- const box = await this.getBoundingBox(selector);
73
- const center = (0, utils_1.getElementCenter)(box);
74
- // W3C alternative is `performActions`. All consecutive actions have to be a part of a single call
75
- await this.browser.performActions([
76
- {
77
- type: 'pointer',
78
- id: 'mouse',
79
- parameters: { pointerType: 'mouse' },
80
- actions: [
81
- { type: 'pointerMove', duration: 0, x: center.x, y: center.y },
82
- { type: 'pointerDown', button: 0 },
83
- // extra delay to let event listeners to be fired
84
- { type: 'pause', duration: 10 },
85
- ],
86
- },
87
- ]);
88
- }
64
+ // Clean up all previous actions before stating a new batch. Without this line Safari emits extra "mouseup" events
65
+ await this.browser.releaseActions();
66
+ const box = await this.getBoundingBox(selector);
67
+ const center = (0, utils_1.getElementCenter)(box);
68
+ // W3C alternative is `performActions`. All consecutive actions have to be a part of a single call
69
+ await this.browser.performActions([
70
+ {
71
+ type: 'pointer',
72
+ id: 'mouse',
73
+ parameters: { pointerType: 'mouse' },
74
+ actions: [
75
+ { type: 'pointerMove', duration: 0, x: center.x, y: center.y },
76
+ { type: 'pointerDown', button: 0 },
77
+ // extra delay to let event listeners to be fired
78
+ { type: 'pause', duration: 10 },
79
+ ],
80
+ },
81
+ ]);
89
82
  }
90
83
  async buttonUp() {
91
- // buttonUp exists only in JSON Wire protocol
92
- if (this.browser.buttonUp) {
93
- await this.browser.buttonUp();
94
- }
95
- else {
96
- // W3C alternative is `performActions`
97
- await this.browser.performActions([
98
- {
99
- type: 'pointer',
100
- id: 'mouse',
101
- parameters: { pointerType: 'mouse' },
102
- actions: [
103
- { type: 'pointerUp', button: 0 },
104
- // extra delay for Safari to process the event before moving the cursor away
105
- { type: 'pause', duration: 10 },
106
- // return cursor back to the corner to avoid hover effects on screenshots
107
- { type: 'pointerMove', duration: 0, x: 0, y: 0 },
108
- ],
109
- },
110
- ]);
111
- // make sure all controls are properly released to avoid conflicts with further actions
112
- await this.browser.releaseActions();
113
- }
84
+ // W3C alternative is `performActions`
85
+ await this.browser.performActions([
86
+ {
87
+ type: 'pointer',
88
+ id: 'mouse',
89
+ parameters: { pointerType: 'mouse' },
90
+ actions: [
91
+ { type: 'pointerUp', button: 0 },
92
+ // extra delay for Safari to process the event before moving the cursor away
93
+ { type: 'pause', duration: 10 },
94
+ // return cursor back to the corner to avoid hover effects on screenshots
95
+ { type: 'pointerMove', duration: 0, x: 0, y: 0 },
96
+ ],
97
+ },
98
+ ]);
99
+ // make sure all controls are properly released to avoid conflicts with further actions
100
+ await this.browser.releaseActions();
114
101
  }
115
102
  async dragAndDrop(sourceSelector, xOffset = 0, yOffset = 0) {
116
103
  const element = await this.browser.$(sourceSelector);
@@ -168,7 +155,7 @@ class BasePageObject {
168
155
  return element.isSelected();
169
156
  }
170
157
  async isExisting(selector) {
171
- const elements = await this.browser.$$(selector);
158
+ const elements = await this.browser.$$(selector).map(element => element);
172
159
  return elements.length > 0;
173
160
  }
174
161
  async isDisplayed(selector) {
@@ -177,7 +164,7 @@ class BasePageObject {
177
164
  }
178
165
  async isDisplayedInViewport(selector) {
179
166
  const element = await this.browser.$(selector);
180
- return element.isDisplayedInViewport();
167
+ return element.isDisplayed({ withinViewport: true });
181
168
  }
182
169
  async isClickable(selector) {
183
170
  const element = await this.browser.$(selector);
@@ -208,7 +195,7 @@ class BasePageObject {
208
195
  return element.getText();
209
196
  }
210
197
  async getElementsText(selector) {
211
- const elements = await this.browser.$$(selector);
198
+ const elements = await this.browser.$$(selector).map(element => element);
212
199
  return Promise.all(elements.map(async (element) => element.getText()));
213
200
  }
214
201
  /**
@@ -228,10 +215,10 @@ class BasePageObject {
228
215
  return callback();
229
216
  }
230
217
  const iframeEl = await this.browser.$(iframeSelector);
231
- await this.browser.switchToFrame(iframeEl);
218
+ await this.browser.switchFrame(iframeEl);
232
219
  await callback();
233
220
  // go back to top
234
- await this.browser.switchToFrame(null);
221
+ await this.browser.switchFrame(null);
235
222
  }
236
223
  }
237
224
  exports.default = BasePageObject;
@@ -1,4 +1,3 @@
1
- /// <reference types="webdriverio/async" />
2
1
  export default class EventsSpy {
3
2
  private browser;
4
3
  private selector;
@@ -1,4 +1,3 @@
1
- /// <reference types="webdriverio/async" />
2
1
  import type { Browser as PuppeteerBrowser } from 'puppeteer-core';
3
2
  export declare function scrollAndMergeStrategy(browser: WebdriverIO.Browser): Promise<string>;
4
3
  export default function fullPageScreenshot(browser: WebdriverIO.Browser, forceScrollAndMerge?: boolean): Promise<string>;
@@ -44,6 +44,10 @@ async function scrollAndMergeStrategy(browser) {
44
44
  }
45
45
  exports.scrollAndMergeStrategy = scrollAndMergeStrategy;
46
46
  async function fullPageScreenshot(browser, forceScrollAndMerge = false) {
47
+ var _a;
48
+ if ((_a = browser.capabilities.browserName) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes('firefox')) {
49
+ return scrollAndMergeStrategy(browser);
50
+ }
47
51
  const puppeteer = await (0, utils_1.getPuppeteer)(browser);
48
52
  if (puppeteer && !forceScrollAndMerge) {
49
53
  // casting due to mismatch in NodeJS types of EventEmitter
@@ -1,4 +1,3 @@
1
- /// <reference types="webdriverio/async" />
2
1
  import BasePageObject from './base';
3
2
  import { ScreenshotCapturingOptions, ScreenshotWithOffset } from './types';
4
3
  export default class ScreenshotPageObject extends BasePageObject {
@@ -1,8 +1,7 @@
1
- /// <reference types="webdriverio/async" />
2
1
  import { ViewportSize, ElementRect } from './types';
3
2
  export declare function getElementCenter(rect: ElementRect): {
4
3
  x: number;
5
4
  y: number;
6
5
  };
7
6
  export declare function calculateIosTopOffset(dimensions: Pick<ViewportSize, 'screenWidth' | 'screenHeight' | 'pixelRatio'>): number;
8
- export declare function getPuppeteer(browser: WebdriverIO.Browser): Promise<import("puppeteer-core/lib/cjs/puppeteer/common/Browser").Browser | null>;
7
+ export declare function getPuppeteer(browser: WebdriverIO.Browser): Promise<import("puppeteer-core").Browser | null>;
package/use-browser.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- /// <reference types="webdriverio/async" />
2
1
  import { WebDriverOptions } from './browsers/browser-creator';
2
+ import { Browser } from 'webdriverio';
3
3
  type BrowserOptions = {
4
4
  browserName: string;
5
5
  seleniumType: string;
@@ -8,7 +8,7 @@ type BrowserOptions = {
8
8
  skipConsoleErrorsCheck: boolean;
9
9
  };
10
10
  interface TestFunction {
11
- (browser: WebdriverIO.Browser): Promise<void> | void;
11
+ (browser: Browser): Promise<void> | void;
12
12
  }
13
13
  declare function useBrowser(optionsOverride: Partial<WebDriverOptions>, testFn: TestFunction): () => Promise<void>;
14
14
  declare function useBrowser(testFn: TestFunction): () => Promise<void>;