webdriverio 8.29.1 → 8.29.7

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/README.md CHANGED
@@ -20,30 +20,32 @@ WebdriverIO by default uses Puppeteer to automate a browser like Chrome, Firefox
20
20
  ```js
21
21
  import { remote } from 'webdriverio'
22
22
 
23
- let browser
24
-
25
- ;(async () => {
26
- browser = await remote({
27
- capabilities: { browserName: 'chrome' }
28
- })
23
+ const browser = await remote({
24
+ capabilities: { browserName: 'chrome' }
25
+ })
29
26
 
30
- await browser.navigateTo('https://www.google.com/ncr')
27
+ await browser.navigateTo('https://www.google.com/ncr')
31
28
 
32
- const searchInput = await browser.$('#lst-ib')
33
- await searchInput.setValue('WebdriverIO')
29
+ const searchInput = await browser.$('#lst-ib')
30
+ await searchInput.setValue('WebdriverIO')
34
31
 
35
- const searchBtn = await browser.$('input[value="Google Search"]')
36
- await searchBtn.click()
32
+ const searchBtn = await browser.$('input[value="Google Search"]')
33
+ await searchBtn.click()
37
34
 
38
- console.log(await browser.getTitle()) // outputs "WebdriverIO - Google Search"
35
+ console.log(await browser.getTitle()) // outputs "WebdriverIO - Google Search"
39
36
 
40
- await browser.deleteSession()
41
- })().catch((err) => {
42
- console.error(err)
43
- return browser.deleteSession()
44
- })
37
+ await browser.deleteSession()
45
38
  ```
46
39
 
47
40
  See the raw [protocol example](https://www.npmjs.com/package/webdriver#example) using the `webdriver` package to get a glance at the differences.
48
41
 
49
42
  For more information on [options](https://webdriver.io/docs/options#webdriver-options), [multiremote usage](https://webdriver.io/docs/multiremote) or integration into [cloud services](https://webdriver.io/docs/cloudservices) please check out the [docs](https://webdriver.io/docs/gettingstarted).
43
+
44
+ ---
45
+
46
+ <center>Package Sponsors:</center>
47
+ <p align="center">
48
+ <a href="https://www.browserstack.com/automation-webdriverio">
49
+ <img src="https://www.browserstack.com/images/layout/browserstack-logo-600x315.png" alt="BrowserStack" width="300" />
50
+ </a>
51
+ </p>
@@ -20,7 +20,7 @@ import type { Selector } from '../../types.js';
20
20
  * ```js
21
21
  * // print all image sources
22
22
  * for await (const img of $$('img')) {
23
- * console.log(await img.getAttribute('src))
23
+ * console.log(await img.getAttribute('src'))
24
24
  * }
25
25
  * ```
26
26
  *
@@ -1 +1 @@
1
- {"version":3,"file":"$$.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/$$.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAIvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAsB,EAAE,CACpB,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,EAC/C,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,WAAW,EAAE,qCAkBlF"}
1
+ {"version":3,"file":"$$.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/$$.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAIvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAsB,EAAE,CACpB,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,EAC/C,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,WAAW,EAAE,qCAmBlF"}
@@ -20,7 +20,7 @@ import { getElements } from '../../utils/getElementObject.js';
20
20
  * ```js
21
21
  * // print all image sources
22
22
  * for await (const img of $$('img')) {
23
- * console.log(await img.getAttribute('src))
23
+ * console.log(await img.getAttribute('src'))
24
24
  * }
25
25
  * ```
26
26
  *
@@ -50,7 +50,8 @@ export async function $$(selector) {
50
50
  if (Array.isArray(selector) && isElement(selector[0])) {
51
51
  res = [];
52
52
  for (const el of selector) {
53
- res.push(await findElement.call(this, el));
53
+ const $el = await findElement.call(this, el);
54
+ $el && res.push($el);
54
55
  }
55
56
  }
56
57
  const elements = await getElements.call(this, selector, res);
@@ -1,7 +1,7 @@
1
1
  import { ELEMENT_KEY } from 'webdriver';
2
2
  import refetchElement from './utils/refetchElement.js';
3
3
  import implicitWait from './utils/implicitWait.js';
4
- import { getBrowserObject } from './utils/index.js';
4
+ import { getBrowserObject, isStaleElementError } from './utils/index.js';
5
5
  /**
6
6
  * This method is an command wrapper for elements that checks if a command is called
7
7
  * that wasn't found on the page and automatically waits for it
@@ -31,7 +31,7 @@ export const elementErrorHandler = (fn) => (commandName, commandFn) => {
31
31
  return result;
32
32
  }
33
33
  catch (err) {
34
- if (err.name === 'stale element reference') {
34
+ if (err.name === 'stale element reference' || isStaleElementError(err)) {
35
35
  const element = await refetchElement(this, commandName);
36
36
  this.elementId = element.elementId;
37
37
  this.parent = element.parent;
@@ -14,7 +14,7 @@ export declare const getPrototype: (scope: 'browser' | 'element') => Record<stri
14
14
  * @param {?Object|undefined} res body object from response or null
15
15
  * @return {?string} element id or null if element couldn't be found
16
16
  */
17
- export declare const getElementFromResponse: (res: ElementReference) => string | null;
17
+ export declare const getElementFromResponse: (res?: ElementReference) => string | null;
18
18
  /**
19
19
  * traverse up the scope chain until browser element was reached
20
20
  */
@@ -33,10 +33,11 @@ export declare function parseCSS(cssPropertyValue: string, cssProperty?: string)
33
33
  */
34
34
  export declare function checkUnicode(value: string, isDevTools?: boolean): string[];
35
35
  export declare function isElement(o: Selector): boolean | "";
36
+ export declare function isStaleElementError(err: Error): boolean;
36
37
  /**
37
38
  * logic to find an element
38
39
  */
39
- export declare function findElement(this: WebdriverIO.Browser | WebdriverIO.Element, selector: Selector): Promise<Error | ElementReference>;
40
+ export declare function findElement(this: WebdriverIO.Browser | WebdriverIO.Element, selector: Selector): Promise<Error | ElementReference | undefined>;
40
41
  /**
41
42
  * logic to find a elements
42
43
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAOvD,OAAO,KAAK,EAAmB,QAAQ,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAOtG,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QAAG,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;KAAE;CACnE;AAiBD;;GAEG;AACH,eAAO,MAAM,YAAY,UAAW,SAAS,GAAG,SAAS,uCAexD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAS,gBAAgB,kBAuB3D,CAAA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAGtG;AAWD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,kBAkDvE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAE,KAAK,EAAE,MAAM,EAAE,UAAU,UAAQ,YAoB9D;AAuBD,wBAAgB,SAAS,CAAE,CAAC,EAAE,QAAQ,gBAMrC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC7B,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,EAC/C,QAAQ,EAAE,QAAQ,qCAsErB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAC9B,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,EAC/C,QAAQ,EAAE,QAAQ,+BAkDrB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,GAAG,OAkBpD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,iDAuC9D;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,UAInD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,iBAK3D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAcnE;AAED,wBAAsB,YAAY,CAAE,OAAO,EAAE,WAAW,CAAC,OAAO,oBAoB/D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB,UACnF,MAAM,mBAAmB,MAAM,SAAS,WAAW,KAAK,wBAAwB,UAOjG;AAMD;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,aACnB,mBAAmB,EAAE,UACvB,YAAY,OAAO,GAAG,mBAAmB,YACvC,QAAQ,GAAG,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,8BAExD,GAAG,EAAE,6BAuCf,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,wBAAyB,MAAM,YAAgD,CAAA;AAElG;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,SACvB,OAAO,MAAM,EAAE,MAAM,CAAC,SACrB,OAAO,MAAM,EAAE,MAAM,CAAC,YAShC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAOvD,OAAO,KAAK,EAAmB,QAAQ,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAOtG,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QAAG,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;KAAE;CACnE;AAiBD;;GAEG;AACH,eAAO,MAAM,YAAY,UAAW,SAAS,GAAG,SAAS,uCAexD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,SAAU,gBAAgB,kBAuB5D,CAAA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAGtG;AAWD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,kBAkDvE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAE,KAAK,EAAE,MAAM,EAAE,UAAU,UAAQ,YAoB9D;AAuBD,wBAAgB,SAAS,CAAE,CAAC,EAAE,QAAQ,gBAMrC;AAED,wBAAgB,mBAAmB,CAAE,GAAG,EAAE,KAAK,WAS9C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC7B,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,EAC/C,QAAQ,EAAE,QAAQ,iDA+ErB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAC9B,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,EAC/C,QAAQ,EAAE,QAAQ,+BAkDrB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,GAAG,OAkBpD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,iDAuC9D;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,UAInD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,iBAK3D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAcnE;AAED,wBAAsB,YAAY,CAAE,OAAO,EAAE,WAAW,CAAC,OAAO,oBAoB/D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB,UACnF,MAAM,mBAAmB,MAAM,SAAS,WAAW,KAAK,wBAAwB,UAOjG;AAMD;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,aACnB,mBAAmB,EAAE,UACvB,YAAY,OAAO,GAAG,mBAAmB,YACvC,QAAQ,GAAG,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,8BAExD,GAAG,EAAE,6BAuCf,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,wBAAyB,MAAM,YAAgD,CAAA;AAElG;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,SACvB,OAAO,MAAM,EAAE,MAAM,CAAC,SACrB,OAAO,MAAM,EAAE,MAAM,CAAC,YAShC,CAAA"}
@@ -182,6 +182,15 @@ export function isElement(o) {
182
182
  ? o instanceof HTMLElement
183
183
  : o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string');
184
184
  }
185
+ export function isStaleElementError(err) {
186
+ return (
187
+ // Chrome
188
+ err.message.includes('stale element reference') ||
189
+ // Firefox
190
+ err.message.includes('is no longer attached to the DOM') ||
191
+ // Safari
192
+ err.message.includes('Stale element found'));
193
+ }
185
194
  /**
186
195
  * logic to find an element
187
196
  */
@@ -239,7 +248,16 @@ export async function findElement(selector) {
239
248
  const uid = Math.random().toString().slice(2);
240
249
  window.__wdio_element[uid] = selector;
241
250
  selector = ((id) => window.__wdio_element[id]);
242
- let elem = await fetchElementByJSFunction(selector, this, uid);
251
+ let elem = await fetchElementByJSFunction(selector, this, uid).catch((err) => {
252
+ /**
253
+ * WebDriver throws a stale element reference error if the element is not found
254
+ * and therefor can't be serialized
255
+ */
256
+ if (isStaleElementError(err)) {
257
+ return undefined;
258
+ }
259
+ throw err;
260
+ });
243
261
  elem = Array.isArray(elem) ? elem[0] : elem;
244
262
  return getElementFromResponse(elem) ? elem : notFoundError;
245
263
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "webdriverio",
3
3
  "description": "Next-gen browser and mobile automation test framework for Node.js",
4
- "version": "8.29.1",
4
+ "version": "8.29.7",
5
5
  "homepage": "https://webdriver.io",
6
6
  "author": "Christian Bromann <mail@bromann.dev>",
7
7
  "license": "MIT",
@@ -69,12 +69,12 @@
69
69
  },
70
70
  "dependencies": {
71
71
  "@types/node": "^20.1.0",
72
- "@wdio/config": "8.29.1",
72
+ "@wdio/config": "8.29.3",
73
73
  "@wdio/logger": "8.28.0",
74
- "@wdio/protocols": "8.24.12",
74
+ "@wdio/protocols": "8.29.7",
75
75
  "@wdio/repl": "8.24.12",
76
76
  "@wdio/types": "8.29.1",
77
- "@wdio/utils": "8.29.1",
77
+ "@wdio/utils": "8.29.3",
78
78
  "archiver": "^6.0.0",
79
79
  "aria-query": "^5.0.0",
80
80
  "css-shorthand-properties": "^1.1.1",
@@ -91,7 +91,7 @@
91
91
  "resq": "^1.9.1",
92
92
  "rgb2hex": "0.2.5",
93
93
  "serialize-error": "^11.0.1",
94
- "webdriver": "8.29.1"
94
+ "webdriver": "8.29.7"
95
95
  },
96
96
  "peerDependencies": {
97
97
  "devtools": "^8.14.0"
@@ -101,5 +101,5 @@
101
101
  "optional": true
102
102
  }
103
103
  },
104
- "gitHead": "d434fcf0aaaa9d835789c4c335d319f94a899687"
104
+ "gitHead": "1c7195268663df56856494c69d7bd655c834a368"
105
105
  }