@camperaid/watest 2.3.9 → 2.4.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/core/base.js CHANGED
@@ -123,7 +123,11 @@ function contains(
123
123
  })
124
124
  )
125
125
  ) {
126
- fail_(`${msg}, array has no expected item ${stringify(e)}`);
126
+ fail_(
127
+ `${msg}, array has no expected item ${stringify(e)}, got: ${stringify(
128
+ got
129
+ )}`
130
+ );
127
131
  return false;
128
132
  }
129
133
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camperaid/watest",
3
- "version": "2.3.9",
3
+ "version": "2.4.2",
4
4
  "description": "Web Application Testsuite",
5
5
  "engines": {
6
6
  "node": ">=14.15.1"
@@ -47,7 +47,7 @@ module.exports.test = async () => {
47
47
  await is_output(
48
48
  () => contains([0, 1], [1, 3], `Array contains`),
49
49
  [],
50
- [`Failed: Array contains, array has no expected item 3`],
50
+ [`Failed: Array contains, array has no expected item 3, got: [0, 1]`],
51
51
  `failure`
52
52
  );
53
53
  };
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ const { do_self_tests, is_failure_output, is_ok_output } = require('./test.js');
4
+
5
+ const snippet = `
6
+ <html><body>
7
+ <input id='input-not-visible' hidden>
8
+ <input id='input-visible' value='hey'>
9
+ </body></html>
10
+ `;
11
+
12
+ module.exports.test = do_self_tests(snippet, async ({ driver }) => {
13
+ // noElementsOrNotVisible: no elements: success
14
+ await is_ok_output(
15
+ () =>
16
+ driver.noElementsOrNotVisible(
17
+ '#input-doesnot-exist',
18
+ `noElementsOrNotVisible`
19
+ ),
20
+ [
21
+ `Test: noElementsOrNotVisible. Selector: '#input-doesnot-exist'`,
22
+ `Ok: noElementsOrNotVisible`,
23
+ ],
24
+ [],
25
+ `noElementsOrNotVisible:no elements: success`
26
+ );
27
+
28
+ // noElementsOrNotVisible: not visible: success
29
+ await is_ok_output(
30
+ () =>
31
+ driver.noElementsOrNotVisible(
32
+ '#input-not-visible',
33
+ `noElementsOrNotVisible`
34
+ ),
35
+ [
36
+ `Test: noElementsOrNotVisible. Selector: '#input-not-visible'`,
37
+ `Ok: noElementsOrNotVisible`,
38
+ ],
39
+ [],
40
+ `noElementsOrNotVisible:not visible:success`
41
+ );
42
+
43
+ // noElementsOrNotVisible: visible: failure
44
+ await is_failure_output(
45
+ driver,
46
+ () =>
47
+ driver.noElementsOrNotVisible('#input-visible', `noElementsOrNotVisible`),
48
+ [`Test: noElementsOrNotVisible. Selector: '#input-visible'`],
49
+ [
50
+ `Failed: noElementsOrNotVisible, timeout while waiting to meet criteria`,
51
+ `Failed: noElementsOrNotVisible. Failure details: Got elements count: 1, elements visibility [true], expected: not visible`,
52
+ ],
53
+ `noElementsOrNotVisible:visible:failure`
54
+ );
55
+ });
@@ -76,7 +76,7 @@ unexpected character: 'y' at 2 pos, expected: 'o' at '' line`,
76
76
  ),
77
77
  [`Test: scriptRetvalContains. Expected: ['heo']`],
78
78
  [
79
- `Failed: script retval contains ['heo'], array has no expected item 'heo'`,
79
+ `Failed: script retval contains ['heo'], array has no expected item 'heo', got: ['hey', 'bo']`,
80
80
  `Failed: scriptRetvalContains, timeout while waiting to meet criteria`,
81
81
  `Failed: scriptRetvalContains`,
82
82
  ],
@@ -34,7 +34,8 @@ class Driver extends DriverBase {
34
34
  url = url_or_snippet;
35
35
  }
36
36
  } catch (e) {
37
- if (e.code != 'ERR_INVALID_URL') {
37
+ // Non standard Error.code may not be set to 'ERR_INVALID_URL'.
38
+ if (!(e instanceof TypeError) || !e.message.startsWith('Invalid URL')) {
38
39
  throw e;
39
40
  }
40
41
  }
@@ -485,21 +486,25 @@ class Driver extends DriverBase {
485
486
  * Picks file(s) in a file input.
486
487
  */
487
488
  pickFile(selector, path, msg) {
488
- assert(selector, `pickFile: no selector`);
489
- assert(path, `pickFile: no path`);
490
- assert(msg, `pickFile: no msg`);
491
- return this.waitForElementToInvoke(selector, el => el.sendKeys(path), msg);
489
+ return this.pickFiles(selector, [path], msg);
492
490
  }
493
491
 
494
492
  pickFiles(selector, paths, msg) {
495
493
  assert(selector, `pickFiles: no selector`);
496
494
  assert(paths, `pickFiles: no paths`);
497
495
  assert(msg, `pickFiles: no msg`);
498
- return this.waitForElementToInvoke(
499
- selector,
500
- el => el.sendKeys(paths.join('\n')),
501
- msg
502
- );
496
+
497
+ return this.chain(async () => {
498
+ // Clear previosly set value if any.
499
+ await this.setProperty(selector, 'value', '', msg);
500
+
501
+ // Send keys to upload files.
502
+ await this.waitForElementToInvoke(
503
+ selector,
504
+ el => el.sendKeys(paths.join('\n')),
505
+ msg
506
+ );
507
+ });
503
508
  }
504
509
 
505
510
  //
@@ -929,6 +934,39 @@ else {
929
934
  return this.elementsCount(selector, 0, msg);
930
935
  }
931
936
 
937
+ /**
938
+ * Waits until no elements in DOM or no elements is visible.
939
+ */
940
+ noElementsOrNotVisible(selector, msg) {
941
+ assert(selector, `noElementsOrNotVisible: no selector`);
942
+ assert(msg, `noElementsOrNotVisible: no msg`);
943
+
944
+ let breadcrumbs = '';
945
+ let cond = new Condition(`until no elements or not visible`, async () => {
946
+ let els = await this.dvr.findElements(By.css(selector));
947
+ breadcrumbs = `Got elements count: ${els.length}, expected 0`;
948
+ if (els.length == 0) {
949
+ return true;
950
+ }
951
+ let isDisplayedArray = await Promise.all(
952
+ Array.from(els).map(el => el.isDisplayed())
953
+ );
954
+ breadcrumbs = `Got elements count: ${
955
+ els.length
956
+ }, elements visibility [${isDisplayedArray.join(
957
+ ' ,'
958
+ )}], expected: not visible`;
959
+ return isDisplayedArray.every(isDisplayed => !isDisplayed);
960
+ });
961
+
962
+ return this.run(
963
+ () => this.waitForCondition(cond, () => breadcrumbs),
964
+ msg,
965
+ `Selector: '${selector}'`,
966
+ () => breadcrumbs
967
+ );
968
+ }
969
+
932
970
  /**
933
971
  * Waits until elements count is not zero.
934
972
  */
@@ -686,7 +686,7 @@ class DriverBase {
686
686
  e instanceof error.ScriptTimeoutError
687
687
  ) {
688
688
  this.checkBreadcrumbs(get_breadcrumbs);
689
- if (e.message.startsWith(`Waiting until meet criteria`)) {
689
+ if (e.message.startsWith(`Waiting until`)) {
690
690
  throw new CriteriaTimeoutError();
691
691
  }
692
692
  }