@applitools/spec-driver-selenium 1.2.0 → 1.3.3

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 CHANGED
@@ -3,6 +3,27 @@
3
3
  ## Unreleased
4
4
 
5
5
 
6
+ ## 1.3.3 - 2022/1/12
7
+
8
+ - add support of selenium 4 `ShadowRoot` objects
9
+
10
+ ## 1.3.2 - 2022/1/12
11
+
12
+ - no changes
13
+
14
+ ## 1.3.1 - 2022/1/12
15
+
16
+ - use chromedriver instead of selenium docker container for testing
17
+ - fix tests for selenium 3
18
+ - fix `getCapabilities` for selenium 3
19
+ - updated to @applitools/types@1.0.23 (from 1.0.20)
20
+ - updated to @applitools/utils@1.2.11 (from 1.2.4)
21
+
22
+ ## 1.3.0 - 2021/11/17
23
+
24
+ - implement `getCapabilities` and `getBarsHeight` instead of `getDriverInfo`
25
+ - updated to @applitools/types@1.0.20 (from 1.0.19)
26
+
6
27
  ## 1.2.0 - 2021/11/10
7
28
 
8
29
  - updated to @applitools/types@1.0.19 (from 1.0.15)
@@ -30,12 +30,18 @@ var __rest = (this && this.__rest) || function (s, e) {
30
30
  return t;
31
31
  };
32
32
  Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.build = exports.performAction = exports.getElementText = exports.getElementAttribute = exports.getElementRegion = exports.getOrientation = exports.waitUntilDisplayed = exports.scrollIntoView = exports.type = exports.hover = exports.click = exports.takeScreenshot = exports.visit = exports.getUrl = exports.getTitle = exports.getDriverInfo = exports.getCookies = exports.setWindowSize = exports.getWindowSize = exports.findElements = exports.findElement = exports.childContext = exports.parentContext = exports.mainContext = exports.executeScript = exports.isEqualElements = exports.isStaleElementError = exports.transformSelector = exports.transformDriver = exports.isSelector = exports.isElement = exports.isDriver = void 0;
33
+ exports.build = exports.performAction = exports.getElementText = exports.getElementAttribute = exports.getElementRegion = exports.getOrientation = exports.getBarsHeight = exports.waitUntilDisplayed = exports.scrollIntoView = exports.type = exports.hover = exports.click = exports.takeScreenshot = exports.visit = exports.getUrl = exports.getTitle = exports.getCapabilities = exports.getDriverInfo = exports.getCookies = exports.setWindowSize = exports.getWindowSize = exports.findElements = exports.findElement = exports.childContext = exports.parentContext = exports.mainContext = exports.executeScript = exports.isEqualElements = exports.isStaleElementError = exports.transformSelector = exports.transformDriver = exports.isSelector = exports.isElement = exports.isDriver = void 0;
34
+ const Selenium = __importStar(require("selenium-webdriver"));
34
35
  const utils = __importStar(require("@applitools/utils"));
35
36
  // #region HELPERS
36
37
  const byHash = ['className', 'css', 'id', 'js', 'linkText', 'name', 'partialLinkText', 'tagName', 'xpath'];
37
38
  function extractElementId(element) {
38
- return element.getId();
39
+ return isElement(element) ? element.getId() : element['shadow-6066-11e4-a52e-4f735466cecf'];
40
+ }
41
+ function transformShadowRoot(driver, shadowRoot) {
42
+ return utils.types.has(shadowRoot, 'shadow-6066-11e4-a52e-4f735466cecf')
43
+ ? new Selenium.WebElement(driver, shadowRoot['shadow-6066-11e4-a52e-4f735466cecf'])
44
+ : shadowRoot;
39
45
  }
40
46
  // #endregion
41
47
  // #region UTILITY
@@ -57,6 +63,9 @@ function transformDriver(driver) {
57
63
  driver.getExecutor().defineCommand('getSessionDetails', 'GET', '/session/:sessionId');
58
64
  driver.getExecutor().defineCommand('getOrientation', 'GET', '/session/:sessionId/orientation');
59
65
  driver.getExecutor().defineCommand('getSystemBars', 'GET', '/session/:sessionId/appium/device/system_bars');
66
+ driver.getExecutor().defineCommand('getWindowSize', 'GET', '/session/:sessionId/window/current/size');
67
+ driver.getExecutor().defineCommand('setWindowSize', 'POST', '/session/:sessionId/window/current/size');
68
+ driver.getExecutor().defineCommand('setWindowPosition', 'POST', '/session/:sessionId/window/current/position');
60
69
  driver.getExecutor().defineCommand('performTouch', 'POST', '/session/:sessionId/touch/perform');
61
70
  driver.getExecutor().defineCommand('executeCdp', 'POST', '/session/:sessionId/chromium/send_command_and_get_result');
62
71
  if (process.env.APPLITOOLS_SELENIUM_MAJOR_VERSION === '3') {
@@ -125,7 +134,7 @@ async function childContext(driver, element) {
125
134
  exports.childContext = childContext;
126
135
  async function findElement(driver, selector, parent) {
127
136
  try {
128
- const root = parent !== null && parent !== void 0 ? parent : driver;
137
+ const root = parent ? transformShadowRoot(driver, parent) : driver;
129
138
  return await root.findElement(selector);
130
139
  }
131
140
  catch (err) {
@@ -137,36 +146,41 @@ async function findElement(driver, selector, parent) {
137
146
  }
138
147
  exports.findElement = findElement;
139
148
  async function findElements(driver, selector, parent) {
140
- const root = parent !== null && parent !== void 0 ? parent : driver;
149
+ const root = parent ? transformShadowRoot(driver, parent) : driver;
141
150
  return root.findElements(selector);
142
151
  }
143
152
  exports.findElements = findElements;
144
153
  async function getWindowSize(driver) {
145
154
  try {
146
- const window = driver.manage().window();
147
- if (utils.types.isFunction(window.getSize)) {
148
- return await window.getSize();
149
- }
150
- else {
151
- const rect = await window.getRect();
152
- return { width: rect.width, height: rect.height };
153
- }
155
+ const rect = await driver.manage().window().getRect();
156
+ return { width: rect.width, height: rect.height };
154
157
  }
155
- catch (err) {
156
- // workaround for Appium
157
- const cmd = require('selenium-webdriver/lib/command');
158
- return driver.execute(new cmd.Command(cmd.Name.GET_WINDOW_SIZE).setParameter('windowHandle', 'current'));
158
+ catch (_a) {
159
+ const { Command } = require('selenium-webdriver/lib/command');
160
+ const getWindowSizeCommand = new Command('getWindowSize');
161
+ const size = driver.manage().window().getSize
162
+ ? await driver.manage().window().getSize()
163
+ : await driver.execute(getWindowSizeCommand);
164
+ return { width: size.width, height: size.height };
159
165
  }
160
166
  }
161
167
  exports.getWindowSize = getWindowSize;
162
168
  async function setWindowSize(driver, size) {
163
- const window = driver.manage().window();
164
- if (utils.types.isFunction(window.setRect)) {
165
- await window.setRect({ x: 0, y: 0, width: size.width, height: size.height });
169
+ try {
170
+ await driver.manage().window().setRect({ x: 0, y: 0, width: size.width, height: size.height });
166
171
  }
167
- else {
168
- await window.setPosition(0, 0);
169
- await window.setSize(size.width, size.height);
172
+ catch (_a) {
173
+ const { Command } = require('selenium-webdriver/lib/command');
174
+ const setWindowPositionCommand = new Command('setWindowPosition').setParameters({ x: 0, y: 0 });
175
+ if (driver.manage().window().setPosition)
176
+ await driver.manage().window().setPosition(0, 0);
177
+ else
178
+ await driver.execute(setWindowPositionCommand);
179
+ const setWindowSizeCommand = new Command('setWindowSize').setParameters(Object.assign({}, size));
180
+ if (driver.manage().window().setSize)
181
+ await driver.manage().window().setSize(size.width, size.height);
182
+ else
183
+ await driver.execute(setWindowSizeCommand);
170
184
  }
171
185
  }
172
186
  exports.setWindowSize = setWindowSize;
@@ -180,7 +194,9 @@ async function getCookies(driver, context) {
180
194
  }
181
195
  else {
182
196
  const { Command } = require('selenium-webdriver/lib/command');
183
- const executeCdpCommand = new Command('executeCdp').setParameters({ cmd: 'Network.getAllCookies', params: {} });
197
+ const executeCdpCommand = new Command('executeCdp')
198
+ .setParameter('cmd', 'Network.getAllCookies')
199
+ .setParameter('params', {});
184
200
  const response = process.env.APPLITOOLS_SELENIUM_MAJOR_VERSION === '3'
185
201
  ? await driver.schedule(executeCdpCommand)
186
202
  : await driver.execute(executeCdpCommand);
@@ -200,56 +216,24 @@ async function getCookies(driver, context) {
200
216
  }
201
217
  exports.getCookies = getCookies;
202
218
  async function getDriverInfo(driver) {
203
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
204
219
  const session = await driver.getSession();
205
- const capabilities = await driver.getCapabilities();
206
- const desiredCapabilities = (_a = capabilities.get('desired')) !== null && _a !== void 0 ? _a : {};
207
- const platformName = (_c = (_b = capabilities.get('platformName')) !== null && _b !== void 0 ? _b : capabilities.get('platform')) !== null && _c !== void 0 ? _c : desiredCapabilities.platformName;
208
- const isMobile = ['android', 'ios'].includes(platformName === null || platformName === void 0 ? void 0 : platformName.toLowerCase());
209
- const info = {
210
- sessionId: session.getId(),
211
- isMobile,
212
- isNative: isMobile && !capabilities.get('browserName'),
213
- deviceName: (_d = desiredCapabilities.deviceName) !== null && _d !== void 0 ? _d : capabilities.get('deviceName'),
214
- platformName,
215
- platformVersion: capabilities.get('platformVersion'),
216
- browserName: (_e = capabilities.get('browserName')) !== null && _e !== void 0 ? _e : desiredCapabilities === null || desiredCapabilities === void 0 ? void 0 : desiredCapabilities.browserName,
217
- browserVersion: (_f = capabilities.get('browserVersion')) !== null && _f !== void 0 ? _f : capabilities.get('version'),
218
- };
219
- if (info.isNative) {
220
+ return { sessionId: session.getId() };
221
+ }
222
+ exports.getDriverInfo = getDriverInfo;
223
+ async function getCapabilities(driver) {
224
+ try {
220
225
  const { Command } = require('selenium-webdriver/lib/command');
221
- let details;
222
- if (capabilities.has('viewportRect') && capabilities.has('pixelRatio') && capabilities.has('statBarHeight')) {
223
- details = {
224
- viewportRect: capabilities.get('viewportRect'),
225
- pixelRatio: capabilities.get('pixelRatio'),
226
- statBarHeight: capabilities.get('statBarHeight'),
227
- };
228
- }
229
- else {
230
- const getSessionDetailsCommand = new Command('getSessionDetails');
231
- details =
232
- process.env.APPLITOOLS_SELENIUM_MAJOR_VERSION === '3'
233
- ? await driver.schedule(getSessionDetailsCommand)
234
- : await driver.execute(getSessionDetailsCommand);
235
- }
236
- info.pixelRatio = details.pixelRatio;
237
- try {
238
- const getSystemBarsCommand = new Command('getSystemBars');
239
- const { statusBar, navigationBar } = process.env.APPLITOOLS_SELENIUM_MAJOR_VERSION === '3'
240
- ? await driver.schedule(getSystemBarsCommand)
241
- : await driver.execute(getSystemBarsCommand);
242
- info.statusBarHeight = statusBar.visible ? statusBar.height : 0;
243
- info.navigationBarHeight = navigationBar.visible ? navigationBar.height : 0;
244
- }
245
- catch (err) {
246
- info.statusBarHeight = (_j = (_g = details.statBarHeight) !== null && _g !== void 0 ? _g : (_h = details.viewportRect) === null || _h === void 0 ? void 0 : _h.top) !== null && _j !== void 0 ? _j : 0;
247
- info.navigationBarHeight = 0;
248
- }
226
+ const getSessionDetailsCommand = new Command('getSessionDetails');
227
+ return process.env.APPLITOOLS_SELENIUM_MAJOR_VERSION === '3'
228
+ ? await driver.schedule(getSessionDetailsCommand)
229
+ : await driver.execute(getSessionDetailsCommand);
230
+ }
231
+ catch (_a) {
232
+ const capabilities = await driver.getCapabilities();
233
+ return Array.from(capabilities.keys()).reduce((obj, key) => Object.assign(obj, { key: capabilities.get(key) }), {});
249
234
  }
250
- return info;
251
235
  }
252
- exports.getDriverInfo = getDriverInfo;
236
+ exports.getCapabilities = getCapabilities;
253
237
  async function getTitle(driver) {
254
238
  return driver.getTitle();
255
239
  }
@@ -298,13 +282,24 @@ async function scrollIntoView(driver, element, align = false) {
298
282
  }
299
283
  exports.scrollIntoView = scrollIntoView;
300
284
  async function waitUntilDisplayed(driver, selector, timeout) {
301
- const { until } = require('selenium-webdriver');
302
285
  const element = await findElement(driver, selector);
303
- await driver.wait(until.elementIsVisible(element), timeout);
286
+ await driver.wait(Selenium.until.elementIsVisible(element), timeout);
304
287
  }
305
288
  exports.waitUntilDisplayed = waitUntilDisplayed;
306
289
  // #endregion
307
290
  // #region MOBILE COMMANDS
291
+ async function getBarsHeight(driver) {
292
+ const { Command } = require('selenium-webdriver/lib/command');
293
+ const getSystemBarsCommand = new Command('getSystemBars');
294
+ const { statusBar, navigationBar } = process.env.APPLITOOLS_SELENIUM_MAJOR_VERSION === '3'
295
+ ? await driver.schedule(getSystemBarsCommand)
296
+ : await driver.execute(getSystemBarsCommand);
297
+ return {
298
+ statusBarHeight: statusBar.visible ? statusBar.height : 0,
299
+ navigationBarHeight: navigationBar.visible ? navigationBar.height : 0,
300
+ };
301
+ }
302
+ exports.getBarsHeight = getBarsHeight;
308
303
  async function getOrientation(driver) {
309
304
  const { Command } = require('selenium-webdriver/lib/command');
310
305
  const getOrientationCommand = new Command('getOrientation');
@@ -357,7 +352,6 @@ const browserOptionsNames = {
357
352
  };
358
353
  async function build(env) {
359
354
  var _a;
360
- const { Builder } = require('selenium-webdriver');
361
355
  const parseEnv = require('@applitools/test-utils/src/parse-env');
362
356
  const { browser, capabilities, url, attach, proxy, configurable = true, appium = false, args = [], headless, } = parseEnv(Object.assign(Object.assign({}, env), { legacy: (_a = env.legacy) !== null && _a !== void 0 ? _a : process.env.APPLITOOLS_SELENIUM_MAJOR_VERSION === '3' }));
363
357
  const desiredCapabilities = Object.assign({}, capabilities);
@@ -379,7 +373,7 @@ async function build(env) {
379
373
  if (appium && browser === 'chrome') {
380
374
  desiredCapabilities['appium:chromeOptions'] = { w3c: false };
381
375
  }
382
- const builder = new Builder().withCapabilities(desiredCapabilities);
376
+ const builder = new Selenium.Builder().withCapabilities(desiredCapabilities);
383
377
  if (url && !attach)
384
378
  builder.usingServer(url.href);
385
379
  if (proxy) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/spec-driver-selenium",
3
- "version": "1.2.0",
3
+ "version": "1.3.3",
4
4
  "keywords": [
5
5
  "selenium",
6
6
  "selenium-webdriver",
@@ -41,9 +41,11 @@
41
41
  "lint": "eslint '**/*.ts'",
42
42
  "build": "ttsc",
43
43
  "test": "mocha ./test/**/*.spec.ts --no-timeouts -r ts-node/register -r @applitools/test-utils/mocha-hooks/docker",
44
- "setup": "yarn docker:setup",
44
+ "setup": "yarn chromedriver:setup",
45
+ "chromedriver:setup": "chromedriver --port=4444 --url-base=/wd/hub &",
45
46
  "docker:setup": "node ../scripts/scripts/generate-docker-compose-config.js && docker-compose up -d",
46
47
  "docker:teardown": "docker-compose down",
48
+ "upgrade:framework": "if [ ! -z $APPLITOOLS_SELENIUM_MAJOR_VERSION ]; then packagejson=`cat package.json`; yarn upgrade --no-lockfile selenium-webdriver@$APPLITOOLS_SELENIUM_MAJOR_VERSION; echo \"$packagejson\" > package.json; fi",
47
49
  "deps": "bongo deps",
48
50
  "gh:test": "gh workflow run test.yml --ref $(git rev-parse --abbrev-ref HEAD) -f packages='spec-selenium spec-selenium@3' -f links='types utils test-utils'",
49
51
  "gh:publish": "gh workflow run publish.yml --ref $(git rev-parse --abbrev-ref HEAD) -f packages='spec-selenium'",
@@ -57,19 +59,20 @@
57
59
  }
58
60
  },
59
61
  "dependencies": {
60
- "@applitools/types": "1.0.19",
61
- "@applitools/utils": "1.2.4"
62
+ "@applitools/types": "1.0.23",
63
+ "@applitools/utils": "1.2.11"
62
64
  },
63
65
  "devDependencies": {
64
- "@applitools/api-extractor": "^1.2.2",
65
- "@applitools/scripts": "1.0.1",
66
- "@applitools/sdk-release-kit": "0.13.4",
67
- "@applitools/test-utils": "1.0.9",
66
+ "@applitools/api-extractor": "^1.2.6",
67
+ "@applitools/scripts": "1.1.0",
68
+ "@applitools/sdk-release-kit": "0.13.10",
69
+ "@applitools/test-utils": "1.0.10",
68
70
  "@types/mocha": "^9.0.0",
69
71
  "@types/node": "^16.10.2",
70
72
  "@types/selenium-webdriver": "^4.0.15",
71
73
  "@typescript-eslint/eslint-plugin": "^4.15.1",
72
74
  "@typescript-eslint/parser": "^4.15.1",
75
+ "chromedriver": "^96",
73
76
  "eslint": "^7.9.0",
74
77
  "eslint-config-prettier": "^7.2.0",
75
78
  "eslint-plugin-mocha-no-only": "^1.1.1",
@@ -78,10 +81,10 @@
78
81
  "husky": "^4.3.7",
79
82
  "mocha": "^9.1.2",
80
83
  "prettier": "^2.4.1",
81
- "selenium-webdriver": "^4.0.0",
84
+ "selenium-webdriver": "^4.1.1",
82
85
  "ts-node": "^10.2.1",
83
86
  "ttypescript": "^1.5.12",
84
- "typescript": "^4.5.1-rc"
87
+ "typescript": "^4.5.4"
85
88
  },
86
89
  "peerDependencies": {
87
90
  "selenium-webdriver": ">=3.6.0"
package/types/index.d.ts CHANGED
@@ -11,12 +11,13 @@ export function executeScript(driver: Driver, script: string | ((arg: any) => an
11
11
  export function mainContext(driver: Driver): Promise<Driver>;
12
12
  export function parentContext(driver: Driver): Promise<Driver>;
13
13
  export function childContext(driver: Driver, element: Element): Promise<Driver>;
14
- export function findElement(driver: Driver, selector: Selector, parent: Element): Promise<Element>;
15
- export function findElements(driver: Driver, selector: Selector, parent: Element): Promise<Array<Element>>;
14
+ export function findElement(driver: Driver, selector: Selector, parent?: Element): Promise<Element>;
15
+ export function findElements(driver: Driver, selector: Selector, parent?: Element): Promise<Array<Element>>;
16
16
  export function getWindowSize(driver: Driver): Promise<import('@applitools/types').Size>;
17
17
  export function setWindowSize(driver: Driver, size: import('@applitools/types').Size): Promise<void>;
18
- export function getCookies(driver: Driver, context: boolean): Promise<Array<import('@applitools/types').Cookie>>;
18
+ export function getCookies(driver: Driver, context?: boolean): Promise<Array<import('@applitools/types').Cookie>>;
19
19
  export function getDriverInfo(driver: Driver): Promise<import('@applitools/types').DriverInfo>;
20
+ export function getCapabilities(driver: Driver): Promise<Record<string, any>>;
20
21
  export function getTitle(driver: Driver): Promise<string>;
21
22
  export function getUrl(driver: Driver): Promise<string>;
22
23
  export function visit(driver: Driver, url: string): Promise<void>;
@@ -26,6 +27,7 @@ export function hover(driver: Driver, element: Element | Selector): Promise<void
26
27
  export function type(driver: Driver, element: Element | Selector, keys: string): Promise<void>;
27
28
  export function scrollIntoView(driver: Driver, element: Element | Selector, align: boolean): Promise<void>;
28
29
  export function waitUntilDisplayed(driver: Driver, selector: Selector, timeout: number): Promise<void>;
30
+ export function getBarsHeight(driver: Driver): Promise<{ statusBarHeight: number; navigationBarHeight: number; }>;
29
31
  export function getOrientation(driver: Driver): Promise<"portrait" | "landscape">;
30
32
  export function getElementRegion(_driver: Driver, element: Element): Promise<import('@applitools/types').Region>;
31
33
  export function getElementAttribute(_driver: Driver, element: Element, attr: string): Promise<string>;