@serenity-js/web 3.0.0-rc.29 → 3.0.0-rc.30

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,24 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.0.0-rc.30](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.29...v3.0.0-rc.30) (2022-10-05)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **web:** all web modules now correctly support handling iframe context for the current page ([bcb8672](https://github.com/serenity-js/serenity-js/commit/bcb86722dfcaa023613e63fb8bd2e14d6d546efd)), closes [#1310](https://github.com/serenity-js/serenity-js/issues/1310)
12
+ * **web:** corrected interaction to Clear to avoid issues with elements that have no value attribute ([37ae809](https://github.com/serenity-js/serenity-js/commit/37ae8092a36091db528024b99695905982ef8284)), closes [#1306](https://github.com/serenity-js/serenity-js/issues/1306)
13
+ * **web:** interaction to Clear now supports "contenteditable" elements ([d090458](https://github.com/serenity-js/serenity-js/commit/d090458845c23af59561d74421c16160ccc4ff64)), closes [#1306](https://github.com/serenity-js/serenity-js/issues/1306)
14
+
15
+
16
+ ### Features
17
+
18
+ * **web:** interaction to Clear works with "contenteditable" elements across all the web tools ([c53b00d](https://github.com/serenity-js/serenity-js/commit/c53b00dac512977c00e5eadc101e281997f8e0de)), closes [#1306](https://github.com/serenity-js/serenity-js/issues/1306)
19
+
20
+
21
+
22
+
23
+
6
24
  # [3.0.0-rc.29](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.28...v3.0.0-rc.29) (2022-10-01)
7
25
 
8
26
  **Note:** Version bump only for package @serenity-js/web
@@ -68,7 +68,7 @@ export declare class Clear extends PageElementInteraction {
68
68
  * @inheritDoc
69
69
  */
70
70
  performAs(actor: UsesAbilities & AnswersQuestions): Promise<void>;
71
- private ensureElementCanBeCleared;
71
+ private isClearable;
72
72
  private capitaliseFirstLetter;
73
73
  }
74
74
  //# sourceMappingURL=Clear.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Clear.d.ts","sourceRoot":"","sources":["../../../src/screenplay/interactions/Clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAK,WAAW,EAAc,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5G,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,KAAM,SAAQ,sBAAsB;IAcvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAZ5C;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,WAAW;IAI9D,SAAS,aAA8B,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC;IAIrE;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAQzD,yBAAyB;IAmBvC,OAAO,CAAC,qBAAqB;CAGhC"}
1
+ {"version":3,"file":"Clear.d.ts","sourceRoot":"","sources":["../../../src/screenplay/interactions/Clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAK,WAAW,EAAc,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5G,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,KAAM,SAAQ,sBAAsB;IAcvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAZ5C;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,WAAW;IAI9D,SAAS,aAA8B,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC;IAIrE;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAczD,WAAW;IAmBzB,OAAO,CAAC,qBAAqB;CAGhC"}
@@ -75,20 +75,25 @@ class Clear extends PageElementInteraction_1.PageElementInteraction {
75
75
  */
76
76
  async performAs(actor) {
77
77
  const element = await this.resolve(actor, this.field);
78
- await this.ensureElementCanBeCleared(element);
79
- return element.clearValue();
78
+ const isClearable = await this.isClearable(element);
79
+ if (!isClearable) {
80
+ throw new core_1.LogicError(this.capitaliseFirstLetter((0, core_1.d) `${this.field} doesn't seem like an element that could be cleared.`));
81
+ }
82
+ await element.clearValue();
80
83
  }
81
- async ensureElementCanBeCleared(element) {
82
- let threwError, hasValueAttribute = false;
84
+ async isClearable(element) {
85
+ const contentEditable = await element.attribute('contenteditable');
86
+ const hasContentEditableAttribute = contentEditable !== null && contentEditable !== undefined && contentEditable !== 'false'; // true or empty string mean content is editable
87
+ if (hasContentEditableAttribute) {
88
+ return true;
89
+ }
83
90
  try {
84
91
  const value = await element.value();
85
- hasValueAttribute = value !== null && value !== undefined;
86
- }
87
- catch (error) {
88
- threwError = error;
92
+ const hasValueAttribute = value !== null && value !== undefined;
93
+ return hasValueAttribute;
89
94
  }
90
- if (!hasValueAttribute || threwError) {
91
- throw new core_1.LogicError(this.capitaliseFirstLetter((0, core_1.d) `${this.field} doesn't seem to have a 'value' attribute that could be cleared.`), threwError);
95
+ catch {
96
+ return false;
92
97
  }
93
98
  }
94
99
  capitaliseFirstLetter(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"Clear.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/Clear.ts"],"names":[],"mappings":";;;AAAA,4CAA4G;AAG5G,qEAAkE;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAa,KAAM,SAAQ,+CAAsB;IAc7C,YAAuC,KAA8B;QACjE,KAAK,CAAC,IAAA,QAAC,EAAA,8BAA+B,KAAM,EAAE,CAAC,CAAC;QADb,UAAK,GAAL,KAAK,CAAyB;IAErE,CAAC;IAdD;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,KAA8B;QAC5C,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAMD;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAuC;QACnD,MAAM,OAAO,GAAK,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAExD,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAE9C,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,OAAoB;QACxD,IAAI,UAAiB,EACjB,iBAAiB,GAAG,KAAK,CAAC;QAE9B,IAAI;YACA,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,iBAAiB,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;SAC7D;QAAC,OAAO,KAAK,EAAE;YACZ,UAAU,GAAG,KAAK,CAAC;SACtB;QAED,IAAI,CAAE,iBAAiB,IAAI,UAAU,EAAE;YACnC,MAAM,IAAI,iBAAU,CAChB,IAAI,CAAC,qBAAqB,CAAC,IAAA,QAAC,EAAA,GAAI,IAAI,CAAC,KAAM,kEAAkE,CAAC,EAC9G,UAAU,CACb,CAAC;SACL;IACL,CAAC;IAEO,qBAAqB,CAAC,IAAY;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;CACJ;AAnDD,sBAmDC"}
1
+ {"version":3,"file":"Clear.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/Clear.ts"],"names":[],"mappings":";;;AAAA,4CAA4G;AAG5G,qEAAkE;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAa,KAAM,SAAQ,+CAAsB;IAc7C,YAAuC,KAA8B;QACjE,KAAK,CAAC,IAAA,QAAC,EAAA,8BAA+B,KAAM,EAAE,CAAC,CAAC;QADb,UAAK,GAAL,KAAK,CAAyB;IAErE,CAAC;IAdD;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,KAA8B;QAC5C,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAMD;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAuC;QACnD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,WAAW,EAAE;YACd,MAAM,IAAI,iBAAU,CAChB,IAAI,CAAC,qBAAqB,CAAC,IAAA,QAAC,EAAA,GAAI,IAAI,CAAC,KAAM,sDAAsD,CAAC,CACrG,CAAC;SACL;QAED,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAAoB;QAC1C,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACnE,MAAM,2BAA2B,GAAG,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,OAAO,CAAC,CAAE,gDAAgD;QAE/K,IAAI,2BAA2B,EAAE;YAC7B,OAAO,IAAI,CAAC;SACf;QAED,IAAI;YACA,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,iBAAiB,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;YAEhE,OAAO,iBAAiB,CAAC;SAC5B;QACD,MAAM;YACF,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;IAEO,qBAAqB,CAAC,IAAY;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;CACJ;AAzDD,sBAyDC"}
@@ -14,10 +14,10 @@ class BrowsingSession {
14
14
  this.pages = new Map();
15
15
  }
16
16
  async closePagesOtherThan(pageOfInterest) {
17
- for (const [pageId, page] of this.pages) {
18
- if (page !== pageOfInterest) {
17
+ for (const page of await this.allPages()) {
18
+ if (!page.id.equals(pageOfInterest.id)) {
19
19
  await page.close();
20
- this.pages.delete(pageId);
20
+ this.pages.delete(page.id);
21
21
  }
22
22
  }
23
23
  await this.changeCurrentPageTo(pageOfInterest);
@@ -1 +1 @@
1
- {"version":3,"file":"BrowsingSession.js","sourceRoot":"","sources":["../../../src/screenplay/models/BrowsingSession.ts"],"names":[],"mappings":";;;AAIA;;;;;;;GAOG;AACH,MAAsB,eAAe;IAArC;QAEuB,UAAK,GAAkC,IAAI,GAAG,EAA4B,CAAC;IAoGlG,CAAC;IAlGG,KAAK,CAAC,mBAAmB,CAAC,cAAyB;QAC/C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;YACrC,IAAI,IAAI,KAAK,cAAc,EAAE;gBACzB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aAC7B;SACJ;QAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC;IAOD;;OAEG;IACH,KAAK,CAAC,WAAW;QACb,IAAI,CAAE,IAAI,CAAC,kBAAkB,IAAI,CAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE;YAC1E,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;SAC9D;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,GAAG,KAAkB;QAC1B,KAAI,MAAM,IAAI,IAAI,KAAK,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SACjC;IACL,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,GAAG,OAAwB;QAClC,KAAI,MAAM,MAAM,IAAI,OAAO,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7B;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAgB,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,iBAAiB;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,mBAAmB,CAAC,IAAe;QACrC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACpC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACxC,CAAC;CACJ;AAtGD,0CAsGC"}
1
+ {"version":3,"file":"BrowsingSession.js","sourceRoot":"","sources":["../../../src/screenplay/models/BrowsingSession.ts"],"names":[],"mappings":";;;AAIA;;;;;;;GAOG;AACH,MAAsB,eAAe;IAArC;QAEuB,UAAK,GAAkC,IAAI,GAAG,EAA4B,CAAC;IAoGlG,CAAC;IAlGG,KAAK,CAAC,mBAAmB,CAAC,cAAyB;QAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC,IAAI,CAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE;gBACrC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC9B;SACJ;QAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC;IAOD;;OAEG;IACH,KAAK,CAAC,WAAW;QACb,IAAI,CAAE,IAAI,CAAC,kBAAkB,IAAI,CAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE;YAC1E,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;SAC9D;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,GAAG,KAAkB;QAC1B,KAAI,MAAM,IAAI,IAAI,KAAK,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;SACjC;IACL,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,GAAG,OAAwB;QAClC,KAAI,MAAM,MAAM,IAAI,OAAO,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7B;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAgB,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,iBAAiB;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,mBAAmB,CAAC,IAAe;QACrC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACpC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACxC,CAAC;CACJ;AAtGD,0CAsGC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serenity-js/web",
3
- "version": "3.0.0-rc.29",
3
+ "version": "3.0.0-rc.30",
4
4
  "description": "Serenity/JS Screenplay Pattern APIs for the Web",
5
5
  "author": {
6
6
  "name": "Jan Molak",
@@ -44,8 +44,8 @@
44
44
  "npm": "^6 || ^7 || ^8"
45
45
  },
46
46
  "dependencies": {
47
- "@serenity-js/assertions": "3.0.0-rc.29",
48
- "@serenity-js/core": "3.0.0-rc.29",
47
+ "@serenity-js/assertions": "3.0.0-rc.30",
48
+ "@serenity-js/core": "3.0.0-rc.30",
49
49
  "tiny-types": "^1.19.0"
50
50
  },
51
51
  "devDependencies": {
@@ -57,5 +57,5 @@
57
57
  "ts-node": "^10.9.1",
58
58
  "typescript": "^4.8.4"
59
59
  },
60
- "gitHead": "c7db9619128025b61ab99fc530f3b0ae731374a7"
60
+ "gitHead": "fa832ca71c7fb142db468a433a1c51a2bffe4667"
61
61
  }
@@ -76,29 +76,35 @@ export class Clear extends PageElementInteraction {
76
76
  * @inheritDoc
77
77
  */
78
78
  async performAs(actor: UsesAbilities & AnswersQuestions): Promise<void> {
79
- const element = await this.resolve(actor, this.field);
79
+ const element = await this.resolve(actor, this.field);
80
80
 
81
- await this.ensureElementCanBeCleared(element);
81
+ const isClearable = await this.isClearable(element);
82
82
 
83
- return element.clearValue();
83
+ if (!isClearable) {
84
+ throw new LogicError(
85
+ this.capitaliseFirstLetter(d`${ this.field } doesn't seem like an element that could be cleared.`),
86
+ );
87
+ }
88
+
89
+ await element.clearValue();
84
90
  }
85
91
 
86
- private async ensureElementCanBeCleared(element: PageElement): Promise<void> {
87
- let threwError: Error,
88
- hasValueAttribute = false;
92
+ private async isClearable(element: PageElement): Promise<boolean> {
93
+ const contentEditable = await element.attribute('contenteditable');
94
+ const hasContentEditableAttribute = contentEditable !== null && contentEditable !== undefined && contentEditable !== 'false'; // true or empty string mean content is editable
95
+
96
+ if (hasContentEditableAttribute) {
97
+ return true;
98
+ }
89
99
 
90
100
  try {
91
101
  const value = await element.value();
92
- hasValueAttribute = value !== null && value !== undefined;
93
- } catch (error) {
94
- threwError = error;
95
- }
102
+ const hasValueAttribute = value !== null && value !== undefined;
96
103
 
97
- if (! hasValueAttribute || threwError) {
98
- throw new LogicError(
99
- this.capitaliseFirstLetter(d`${ this.field } doesn't seem to have a 'value' attribute that could be cleared.`),
100
- threwError
101
- );
104
+ return hasValueAttribute;
105
+ }
106
+ catch {
107
+ return false;
102
108
  }
103
109
  }
104
110
 
@@ -15,10 +15,10 @@ export abstract class BrowsingSession<Page_Type extends Page> {
15
15
  protected readonly pages: Map<CorrelationId, Page_Type> = new Map<CorrelationId, Page_Type>();
16
16
 
17
17
  async closePagesOtherThan(pageOfInterest: Page_Type): Promise<void> {
18
- for (const [pageId, page] of this.pages) {
19
- if (page !== pageOfInterest) {
18
+ for (const page of await this.allPages()) {
19
+ if (! page.id.equals(pageOfInterest.id)) {
20
20
  await page.close();
21
- this.pages.delete(pageId);
21
+ this.pages.delete(page.id);
22
22
  }
23
23
  }
24
24