@serenity-js/playwright 3.42.2 → 3.43.0

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.
Files changed (65) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts +60 -2
  3. package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts.map +1 -1
  4. package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.js +74 -2
  5. package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.js.map +1 -1
  6. package/esm/screenplay/models/ElectronLaunchOptions.d.ts +55 -0
  7. package/esm/screenplay/models/ElectronLaunchOptions.d.ts.map +1 -0
  8. package/esm/screenplay/models/ElectronLaunchOptions.js +2 -0
  9. package/esm/screenplay/models/ElectronLaunchOptions.js.map +1 -0
  10. package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts +3 -2
  11. package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts.map +1 -1
  12. package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js +6 -5
  13. package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js.map +1 -1
  14. package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts +52 -0
  15. package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
  16. package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.js +103 -0
  17. package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.js.map +1 -0
  18. package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts +1 -0
  19. package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts.map +1 -1
  20. package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.js +3 -0
  21. package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.js.map +1 -1
  22. package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts +52 -0
  23. package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
  24. package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js +70 -0
  25. package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js.map +1 -0
  26. package/esm/screenplay/models/index.d.ts +3 -0
  27. package/esm/screenplay/models/index.d.ts.map +1 -1
  28. package/esm/screenplay/models/index.js +3 -0
  29. package/esm/screenplay/models/index.js.map +1 -1
  30. package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts +60 -2
  31. package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts.map +1 -1
  32. package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.js +73 -1
  33. package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.js.map +1 -1
  34. package/lib/screenplay/models/ElectronLaunchOptions.d.ts +55 -0
  35. package/lib/screenplay/models/ElectronLaunchOptions.d.ts.map +1 -0
  36. package/lib/screenplay/models/ElectronLaunchOptions.js +3 -0
  37. package/lib/screenplay/models/ElectronLaunchOptions.js.map +1 -0
  38. package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts +3 -2
  39. package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts.map +1 -1
  40. package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js +6 -5
  41. package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js.map +1 -1
  42. package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts +52 -0
  43. package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
  44. package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.js +107 -0
  45. package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.js.map +1 -0
  46. package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts +1 -0
  47. package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts.map +1 -1
  48. package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.js +3 -0
  49. package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.js.map +1 -1
  50. package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts +52 -0
  51. package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
  52. package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js +107 -0
  53. package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js.map +1 -0
  54. package/lib/screenplay/models/index.d.ts +3 -0
  55. package/lib/screenplay/models/index.d.ts.map +1 -1
  56. package/lib/screenplay/models/index.js +3 -0
  57. package/lib/screenplay/models/index.js.map +1 -1
  58. package/package.json +13 -6
  59. package/src/screenplay/abilities/BrowseTheWebWithPlaywright.ts +112 -7
  60. package/src/screenplay/models/ElectronLaunchOptions.ts +55 -0
  61. package/src/screenplay/models/PlaywrightBrowsingSessionWithBrowser.ts +13 -8
  62. package/src/screenplay/models/PlaywrightBrowsingSessionWithElectron.ts +129 -0
  63. package/src/screenplay/models/PlaywrightBrowsingSessionWithPage.ts +4 -0
  64. package/src/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.ts +85 -0
  65. package/src/screenplay/models/index.ts +3 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,23 @@
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.43.0](https://github.com/serenity-js/serenity-js/compare/v3.42.2...v3.43.0) (2026-05-11)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **core:** introduced Initialisable.isInitialisable and Discardable.isDiscardable ([a8c260d](https://github.com/serenity-js/serenity-js/commit/a8c260db850f8d50f8b289d123fe95c9aa859a5e))
12
+
13
+
14
+ ### Features
15
+
16
+ * **playwright:** add Electron app integration support (Phase 1) ([cb90f5b](https://github.com/serenity-js/serenity-js/commit/cb90f5be4e42f5d16dadd0f4171c58acbe499ac2)), closes [serenity-js/serenity-js#1488](https://github.com/serenity-js/serenity-js/issues/1488)
17
+ * **playwright:** add self-launching Electron session support (Phase 2) ([965ea08](https://github.com/serenity-js/serenity-js/commit/965ea088393702e0efaffef5a67be9b2b603853d)), closes [serenity-js/serenity-js#1488](https://github.com/serenity-js/serenity-js/issues/1488)
18
+
19
+
20
+
21
+
22
+
6
23
  ## [3.42.2](https://github.com/serenity-js/serenity-js/compare/v3.42.1...v3.42.2) (2026-04-26)
7
24
 
8
25
 
@@ -1,7 +1,8 @@
1
- import type { Discardable } from '@serenity-js/core';
1
+ import { Discardable, Initialisable } from '@serenity-js/core';
2
2
  import { BrowseTheWeb } from '@serenity-js/web';
3
3
  import * as playwright from 'playwright-core';
4
4
  import type { ExtraBrowserContextOptions } from '../../ExtraBrowserContextOptions.js';
5
+ import { type ElectronLaunchOptions } from '../models/index.js';
5
6
  /**
6
7
  * This implementation of the [ability](https://serenity-js.org/api/core/class/Ability/) to [`BrowseTheWeb`](https://serenity-js.org/api/web/class/BrowseTheWeb/)
7
8
  * enables the [`Actor`](https://serenity-js.org/api/core/class/Actor/) to interact with web front-ends using [Playwright](https://playwright.dev/).
@@ -148,12 +149,69 @@ import type { ExtraBrowserContextOptions } from '../../ExtraBrowserContextOption
148
149
  *
149
150
  * @group Abilities
150
151
  */
151
- export declare class BrowseTheWebWithPlaywright extends BrowseTheWeb<playwright.Locator> implements Discardable {
152
+ export declare class BrowseTheWebWithPlaywright extends BrowseTheWeb<playwright.Locator> implements Initialisable, Discardable {
152
153
  static using(browser: playwright.Browser, browserContextOptions?: playwright.BrowserContextOptions, extraBrowserContextOptions?: ExtraBrowserContextOptions): BrowseTheWebWithPlaywright;
153
154
  static usingPage(page: playwright.Page, extraBrowserContextOptions?: ExtraBrowserContextOptions): BrowseTheWebWithPlaywright;
155
+ /**
156
+ * Creates an ability to browse the web using an already-launched Electron application.
157
+ *
158
+ * Use this method when the Electron application lifecycle is managed externally,
159
+ * such as in Playwright Test where the app is launched per-worker.
160
+ *
161
+ * ## Example
162
+ *
163
+ * ```ts
164
+ * import { _electron as electron } from 'playwright';
165
+ * import { actorCalled } from '@serenity-js/core';
166
+ * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright';
167
+ *
168
+ * const electronApp = await electron.launch({ args: ['main.js'] });
169
+ *
170
+ * const actor = actorCalled('Tester').whoCan(
171
+ * BrowseTheWebWithPlaywright.usingElectronApp(electronApp)
172
+ * );
173
+ *
174
+ * // After tests, close the app manually
175
+ * await electronApp.close();
176
+ * ```
177
+ *
178
+ * @param electronApp - An already-launched Playwright ElectronApplication instance
179
+ * @param extraBrowserContextOptions - Optional configuration for timeouts and navigation
180
+ */
181
+ static usingElectronApp(electronApp: playwright.ElectronApplication, extraBrowserContextOptions?: ExtraBrowserContextOptions): BrowseTheWebWithPlaywright;
182
+ /**
183
+ * Creates an ability to browse the web by launching and managing an Electron application.
184
+ *
185
+ * Use this method when you want Serenity/JS to manage the Electron application lifecycle.
186
+ * The app is launched on first use and closed when the ability is discarded.
187
+ *
188
+ * ## Example
189
+ *
190
+ * ```typescript
191
+ * import { actorCalled } from '@serenity-js/core';
192
+ * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright';
193
+ *
194
+ * const actor = actorCalled('Tester').whoCan(
195
+ * BrowseTheWebWithPlaywright.launchingElectronApp({
196
+ * args: ['path/to/main.js'],
197
+ * cwd: 'path/to/app',
198
+ * })
199
+ * );
200
+ *
201
+ * // The app is automatically closed when the actor is dismissed
202
+ * ```
203
+ *
204
+ * @param launchOptions - Options for launching the Electron application
205
+ * @param extraBrowserContextOptions - Optional configuration for timeouts and navigation
206
+ */
207
+ static launchingElectronApp(launchOptions: ElectronLaunchOptions, extraBrowserContextOptions?: ExtraBrowserContextOptions): BrowseTheWebWithPlaywright;
208
+ initialise(): Promise<void>;
209
+ isInitialised(): boolean;
154
210
  /**
155
211
  * Automatically closes any open [pages](https://serenity-js.org/api/web/class/Page/) when the [SceneFinishes](https://serenity-js.org/api/core-events/class/SceneFinishes/)
156
212
  *
213
+ * For self-launching Electron sessions, also closes the Electron application.
214
+ *
157
215
  * #### Learn more
158
216
  * - [`PlaywrightBrowsingSession.closeAllPages`](https://serenity-js.org/api/playwright/class/PlaywrightBrowsingSession/#closeAllPages)
159
217
  * - [`Discardable`](https://serenity-js.org/api/core/interface/Discardable/)
@@ -1 +1 @@
1
- {"version":3,"file":"BrowseTheWebWithPlaywright.d.ts","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithPlaywright.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAMtF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiJG;AACH,qBAAa,0BAA2B,SAAQ,YAAY,CAAC,UAAU,CAAC,OAAO,CAAE,YAAW,WAAW;IAEnG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,UAAU,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,EAAE,0BAA0B,GAAG,0BAA0B;IAIxL,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,0BAA0B,CAAC,EAAE,0BAA0B,GAAG,0BAA0B;IAI5H;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
1
+ {"version":3,"file":"BrowseTheWebWithPlaywright.d.ts","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithPlaywright.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EACH,KAAK,qBAAqB,EAK7B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiJG;AACH,qBAAa,0BACT,SAAQ,YAAY,CAAC,UAAU,CAAC,OAAO,CACvC,YAAW,aAAa,EAAE,WAAW;IAErC,MAAM,CAAC,KAAK,CACR,OAAO,EAAE,UAAU,CAAC,OAAO,EAC3B,qBAAqB,CAAC,EAAE,UAAU,CAAC,qBAAqB,EACxD,0BAA0B,CAAC,EAAE,0BAA0B,GACxD,0BAA0B;IAI7B,MAAM,CAAC,SAAS,CACZ,IAAI,EAAE,UAAU,CAAC,IAAI,EACrB,0BAA0B,CAAC,EAAE,0BAA0B,GACxD,0BAA0B;IAI7B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,gBAAgB,CACnB,WAAW,EAAE,UAAU,CAAC,mBAAmB,EAC3C,0BAA0B,CAAC,EAAE,0BAA0B,GACxD,0BAA0B;IAU7B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,CAAC,oBAAoB,CACvB,aAAa,EAAE,qBAAqB,EACpC,0BAA0B,CAAC,EAAE,0BAA0B,GACxD,0BAA0B;IAUvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,aAAa,IAAI,OAAO;IAMxB;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAKjC"}
@@ -1,6 +1,7 @@
1
+ import { Discardable, Initialisable } from '@serenity-js/core';
1
2
  import { BrowseTheWeb } from '@serenity-js/web';
2
3
  import * as playwright from 'playwright-core';
3
- import { PlaywrightBrowsingSessionWithBrowser, PlaywrightBrowsingSessionWithPage } from '../models/index.js';
4
+ import { PlaywrightBrowsingSessionWithBrowser, PlaywrightBrowsingSessionWithElectron, PlaywrightBrowsingSessionWithPage, SelfLaunchingPlaywrightBrowsingSessionWithElectron } from '../models/index.js';
4
5
  /**
5
6
  * This implementation of the [ability](https://serenity-js.org/api/core/class/Ability/) to [`BrowseTheWeb`](https://serenity-js.org/api/web/class/BrowseTheWeb/)
6
7
  * enables the [`Actor`](https://serenity-js.org/api/core/class/Actor/) to interact with web front-ends using [Playwright](https://playwright.dev/).
@@ -154,15 +155,86 @@ export class BrowseTheWebWithPlaywright extends BrowseTheWeb {
154
155
  static usingPage(page, extraBrowserContextOptions) {
155
156
  return new BrowseTheWebWithPlaywright(new PlaywrightBrowsingSessionWithPage(page, extraBrowserContextOptions, playwright.selectors));
156
157
  }
158
+ /**
159
+ * Creates an ability to browse the web using an already-launched Electron application.
160
+ *
161
+ * Use this method when the Electron application lifecycle is managed externally,
162
+ * such as in Playwright Test where the app is launched per-worker.
163
+ *
164
+ * ## Example
165
+ *
166
+ * ```ts
167
+ * import { _electron as electron } from 'playwright';
168
+ * import { actorCalled } from '@serenity-js/core';
169
+ * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright';
170
+ *
171
+ * const electronApp = await electron.launch({ args: ['main.js'] });
172
+ *
173
+ * const actor = actorCalled('Tester').whoCan(
174
+ * BrowseTheWebWithPlaywright.usingElectronApp(electronApp)
175
+ * );
176
+ *
177
+ * // After tests, close the app manually
178
+ * await electronApp.close();
179
+ * ```
180
+ *
181
+ * @param electronApp - An already-launched Playwright ElectronApplication instance
182
+ * @param extraBrowserContextOptions - Optional configuration for timeouts and navigation
183
+ */
184
+ static usingElectronApp(electronApp, extraBrowserContextOptions) {
185
+ return new BrowseTheWebWithPlaywright(new PlaywrightBrowsingSessionWithElectron(electronApp, extraBrowserContextOptions ?? {}, playwright.selectors));
186
+ }
187
+ /**
188
+ * Creates an ability to browse the web by launching and managing an Electron application.
189
+ *
190
+ * Use this method when you want Serenity/JS to manage the Electron application lifecycle.
191
+ * The app is launched on first use and closed when the ability is discarded.
192
+ *
193
+ * ## Example
194
+ *
195
+ * ```typescript
196
+ * import { actorCalled } from '@serenity-js/core';
197
+ * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright';
198
+ *
199
+ * const actor = actorCalled('Tester').whoCan(
200
+ * BrowseTheWebWithPlaywright.launchingElectronApp({
201
+ * args: ['path/to/main.js'],
202
+ * cwd: 'path/to/app',
203
+ * })
204
+ * );
205
+ *
206
+ * // The app is automatically closed when the actor is dismissed
207
+ * ```
208
+ *
209
+ * @param launchOptions - Options for launching the Electron application
210
+ * @param extraBrowserContextOptions - Optional configuration for timeouts and navigation
211
+ */
212
+ static launchingElectronApp(launchOptions, extraBrowserContextOptions) {
213
+ return new BrowseTheWebWithPlaywright(new SelfLaunchingPlaywrightBrowsingSessionWithElectron(launchOptions, extraBrowserContextOptions ?? {}, playwright.selectors));
214
+ }
215
+ async initialise() {
216
+ if (Initialisable.isInitialisable(this.session)) {
217
+ await this.session.initialise();
218
+ }
219
+ }
220
+ isInitialised() {
221
+ return Initialisable.isInitialisable(this.session)
222
+ ? this.session.isInitialised()
223
+ : true;
224
+ }
157
225
  /**
158
226
  * Automatically closes any open [pages](https://serenity-js.org/api/web/class/Page/) when the [SceneFinishes](https://serenity-js.org/api/core-events/class/SceneFinishes/)
159
227
  *
228
+ * For self-launching Electron sessions, also closes the Electron application.
229
+ *
160
230
  * #### Learn more
161
231
  * - [`PlaywrightBrowsingSession.closeAllPages`](https://serenity-js.org/api/playwright/class/PlaywrightBrowsingSession/#closeAllPages)
162
232
  * - [`Discardable`](https://serenity-js.org/api/core/interface/Discardable/)
163
233
  */
164
234
  async discard() {
165
- await this.session.closeAllPages();
235
+ if (Discardable.isDiscardable(this.session)) {
236
+ await this.session.discard();
237
+ }
166
238
  }
167
239
  }
168
240
  //# sourceMappingURL=BrowseTheWebWithPlaywright.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrowseTheWebWithPlaywright.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithPlaywright.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EACH,oCAAoC,EACpC,iCAAiC,EACpC,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiJG;AACH,MAAM,OAAO,0BAA2B,SAAQ,YAAgC;IAE5E,MAAM,CAAC,KAAK,CAAC,OAA2B,EAAE,qBAAwD,EAAE,0BAAuD;QACvJ,OAAO,IAAI,0BAA0B,CAAC,IAAI,oCAAoC,CAAC,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACtK,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,IAAqB,EAAE,0BAAuD;QAC3F,OAAO,IAAI,0BAA0B,CAAC,IAAI,iCAAiC,CAAC,IAAI,EAAE,0BAA0B,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACzI,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;CACJ"}
1
+ {"version":3,"file":"BrowseTheWebWithPlaywright.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithPlaywright.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAEH,oCAAoC,EACpC,qCAAqC,EACrC,iCAAiC,EACjC,kDAAkD,EACrD,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiJG;AACH,MAAM,OAAO,0BACT,SAAQ,YAAgC;IAGxC,MAAM,CAAC,KAAK,CACR,OAA2B,EAC3B,qBAAwD,EACxD,0BAAuD;QAEvD,OAAO,IAAI,0BAA0B,CAAC,IAAI,oCAAoC,CAAC,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACtK,CAAC;IAED,MAAM,CAAC,SAAS,CACZ,IAAqB,EACrB,0BAAuD;QAEvD,OAAO,IAAI,0BAA0B,CAAC,IAAI,iCAAiC,CAAC,IAAI,EAAE,0BAA0B,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACzI,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,gBAAgB,CACnB,WAA2C,EAC3C,0BAAuD;QAEvD,OAAO,IAAI,0BAA0B,CACjC,IAAI,qCAAqC,CACrC,WAAW,EACX,0BAA0B,IAAI,EAAE,EAChC,UAAU,CAAC,SAAS,CACvB,CACJ,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,CAAC,oBAAoB,CACvB,aAAoC,EACpC,0BAAuD;QAEvD,OAAO,IAAI,0BAA0B,CACjC,IAAI,kDAAkD,CAClD,aAAa,EACb,0BAA0B,IAAI,EAAE,EAChC,UAAU,CAAC,SAAS,CACvB,CACJ,CAAC;IACN,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,IAAI,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACpC,CAAC;IACL,CAAC;IAED,aAAa;QACT,OAAO,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YAC9B,CAAC,CAAC,IAAI,CAAC;IACf,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO;QACT,IAAI,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,55 @@
1
+ import type * as playwright from 'playwright-core';
2
+ /**
3
+ * Options for launching an Electron application via Playwright.
4
+ *
5
+ * This type re-exports Playwright's Electron launch options with additional documentation
6
+ * for commonly used properties.
7
+ *
8
+ * ## Example
9
+ *
10
+ * ```typescript
11
+ * import { actorCalled } from '@serenity-js/core';
12
+ * import { BrowseTheWebWithPlaywright, ElectronLaunchOptions } from '@serenity-js/playwright';
13
+ *
14
+ * const options: ElectronLaunchOptions = {
15
+ * executablePath: '/path/to/electron',
16
+ * args: ['main.js'],
17
+ * cwd: '/path/to/app',
18
+ * env: { NODE_ENV: 'test' },
19
+ * timeout: 30000,
20
+ * };
21
+ *
22
+ * const actor = actorCalled('Tester').whoCan(
23
+ * BrowseTheWebWithPlaywright.launchingElectronApp(options)
24
+ * );
25
+ * ```
26
+ *
27
+ * ## Common Options
28
+ *
29
+ * - **executablePath**: Path to the Electron executable. If not specified, uses the default
30
+ * Electron installed in `node_modules/.bin/electron`.
31
+ * - **args**: Command-line arguments passed to the application. Typically includes the path
32
+ * to the main script (e.g., `['main.js']`).
33
+ * - **cwd**: Current working directory for the Electron process.
34
+ * - **env**: Environment variables visible to the Electron process. Defaults to `process.env`.
35
+ * - **timeout**: Maximum time in milliseconds to wait for the application to start.
36
+ * Defaults to 30000 (30 seconds). Pass 0 to disable timeout.
37
+ *
38
+ * ## Additional Options
39
+ *
40
+ * - **acceptDownloads**: Whether to automatically download all attachments. Defaults to `true`.
41
+ * - **bypassCSP**: Toggles bypassing page's Content-Security-Policy. Defaults to `false`.
42
+ * - **colorScheme**: Emulates `prefers-colors-scheme` media feature. Supported values are `'light'`, `'dark'`, and `'no-preference'`.
43
+ * - **locale**: Specify user locale, for example `en-GB`, `de-DE`, etc.
44
+ * - **offline**: Whether to emulate network being offline. Defaults to `false`.
45
+ * - **recordVideo**: Enables video recording for all pages.
46
+ * - **timezoneId**: Changes the timezone of the context.
47
+ *
48
+ * ## Learn more
49
+ * - [Playwright Electron API](https://playwright.dev/docs/api/class-electron)
50
+ * - [Electron Testing with Playwright](https://playwright.dev/docs/electron)
51
+ *
52
+ * @group Configuration
53
+ */
54
+ export type ElectronLaunchOptions = Parameters<typeof playwright._electron.launch>[0];
55
+ //# sourceMappingURL=ElectronLaunchOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElectronLaunchOptions.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/ElectronLaunchOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ElectronLaunchOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElectronLaunchOptions.js","sourceRoot":"","sources":["../../../src/screenplay/models/ElectronLaunchOptions.ts"],"names":[],"mappings":""}
@@ -1,3 +1,4 @@
1
+ import type { Discardable } from '@serenity-js/core';
1
2
  import type { BrowserCapabilities } from '@serenity-js/web';
2
3
  import type * as playwright from 'playwright-core';
3
4
  import type { ExtraBrowserContextOptions } from '../../ExtraBrowserContextOptions.js';
@@ -6,13 +7,13 @@ import type { PlaywrightPage } from './PlaywrightPage.js';
6
7
  /**
7
8
  * @group Models
8
9
  */
9
- export declare class PlaywrightBrowsingSessionWithBrowser extends PlaywrightBrowsingSession {
10
+ export declare class PlaywrightBrowsingSessionWithBrowser extends PlaywrightBrowsingSession implements Discardable {
10
11
  protected readonly browser: playwright.Browser;
11
12
  protected readonly browserContextOptions: playwright.BrowserContextOptions;
12
13
  constructor(browser: playwright.Browser, browserContextOptions: playwright.BrowserContextOptions, extraBrowserContextOptions: ExtraBrowserContextOptions, selectors: playwright.Selectors);
13
14
  protected createBrowserContext(): Promise<playwright.BrowserContext>;
14
15
  protected registerCurrentPage(): Promise<PlaywrightPage>;
15
- closeAllPages(): Promise<void>;
16
16
  browserCapabilities(): Promise<BrowserCapabilities>;
17
+ discard(): Promise<void>;
17
18
  }
18
19
  //# sourceMappingURL=PlaywrightBrowsingSessionWithBrowser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightBrowsingSessionWithBrowser.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,qBAAa,oCAAqC,SAAQ,yBAAyB;IAG3E,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO;IAC9C,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBADvD,OAAO,EAAE,UAAU,CAAC,OAAO,EAC3B,qBAAqB,EAAE,UAAU,CAAC,qBAAqB,EAC1E,0BAA0B,EAAE,0BAA0B,EACtD,SAAS,EAAE,UAAU,CAAC,SAAS;cAKV,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;cAI1D,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC;IAcxD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAOrE"}
1
+ {"version":3,"file":"PlaywrightBrowsingSessionWithBrowser.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,qBAAa,oCACT,SAAQ,yBACR,YAAW,WAAW;IAIlB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO;IAC9C,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBADvD,OAAO,EAAE,UAAU,CAAC,OAAO,EAC3B,qBAAqB,EAAE,UAAU,CAAC,qBAAqB,EAC1E,0BAA0B,EAAE,0BAA0B,EACtD,SAAS,EAAE,UAAU,CAAC,SAAS;cAKV,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;cAK1D,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC;IAcxD,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAQ5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAMjC"}
@@ -11,6 +11,7 @@ export class PlaywrightBrowsingSessionWithBrowser extends PlaywrightBrowsingSess
11
11
  this.browserContextOptions = browserContextOptions;
12
12
  }
13
13
  async createBrowserContext() {
14
+ // todo: move to initialise?
14
15
  return this.browser.newContext(this.browserContextOptions);
15
16
  }
16
17
  async registerCurrentPage() {
@@ -22,11 +23,6 @@ export class PlaywrightBrowsingSessionWithBrowser extends PlaywrightBrowsingSess
22
23
  const allPages = await this.allPages();
23
24
  return allPages.at(-1);
24
25
  }
25
- async closeAllPages() {
26
- await super.closeAllPages();
27
- const context = await this.browserContext();
28
- await context.close();
29
- }
30
26
  async browserCapabilities() {
31
27
  return {
32
28
  browserName: this.browser._initializer.name, // todo: raise a PR to Playwright to expose this information
@@ -34,5 +30,10 @@ export class PlaywrightBrowsingSessionWithBrowser extends PlaywrightBrowsingSess
34
30
  browserVersion: this.browser.version()
35
31
  };
36
32
  }
33
+ async discard() {
34
+ await this.closeAllPages();
35
+ const context = await this.browserContext();
36
+ await context.close();
37
+ }
37
38
  }
38
39
  //# sourceMappingURL=PlaywrightBrowsingSessionWithBrowser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightBrowsingSessionWithBrowser.js","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithBrowser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E;;GAEG;AACH,MAAM,OAAO,oCAAqC,SAAQ,yBAAyB;IAGxD;IACA;IAFvB,YACuB,OAA2B,EAC3B,qBAAuD,EAC1E,0BAAsD,EACtD,SAA+B;QAE/B,KAAK,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;QAL1B,YAAO,GAAP,OAAO,CAAoB;QAC3B,0BAAqB,GAArB,qBAAqB,CAAkC;IAK9E,CAAC;IAEkB,KAAK,CAAC,oBAAoB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/D,CAAC;IAEkB,KAAK,CAAC,mBAAmB;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAExB,iFAAiF;QACjF,iFAAiF;QACjF,8BAA8B;QAE9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;QAEtC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAEQ,KAAK,CAAC,aAAa;QACxB,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC;QAE5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAEQ,KAAK,CAAC,mBAAmB;QAC9B,OAAO;YACH,WAAW,EAAG,IAAI,CAAC,OAAe,CAAC,YAAY,CAAC,IAAI,EAAI,4DAA4D;YACpH,YAAY,EAAE,OAAO,CAAC,QAAQ,EAA0B,gDAAgD;YACxG,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;SACzC,CAAA;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"PlaywrightBrowsingSessionWithBrowser.js","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithBrowser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E;;GAEG;AACH,MAAM,OAAO,oCACT,SAAQ,yBAAyB;IAKV;IACA;IAFvB,YACuB,OAA2B,EAC3B,qBAAuD,EAC1E,0BAAsD,EACtD,SAA+B;QAE/B,KAAK,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;QAL1B,YAAO,GAAP,OAAO,CAAoB;QAC3B,0BAAqB,GAArB,qBAAqB,CAAkC;IAK9E,CAAC;IAEkB,KAAK,CAAC,oBAAoB;QACzC,4BAA4B;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/D,CAAC;IAEkB,KAAK,CAAC,mBAAmB;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAExB,iFAAiF;QACjF,iFAAiF;QACjF,8BAA8B;QAE9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;QAEtC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAEQ,KAAK,CAAC,mBAAmB;QAC9B,OAAO;YACH,WAAW,EAAG,IAAI,CAAC,OAAe,CAAC,YAAY,CAAC,IAAI,EAAI,4DAA4D;YACpH,YAAY,EAAE,OAAO,CAAC,QAAQ,EAA0B,gDAAgD;YACxG,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;SACzC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACJ"}
@@ -0,0 +1,52 @@
1
+ import type { BrowserCapabilities } from '@serenity-js/web';
2
+ import type * as playwright from 'playwright-core';
3
+ import type { ExtraBrowserContextOptions } from '../../ExtraBrowserContextOptions.js';
4
+ import { PlaywrightBrowsingSession } from './PlaywrightBrowsingSession.js';
5
+ import { PlaywrightPage } from './PlaywrightPage.js';
6
+ /**
7
+ * Playwright-specific implementation of [`BrowsingSession`](https://serenity-js.org/api/web/class/BrowsingSession/)
8
+ * for Electron applications.
9
+ *
10
+ * Use this class when you have an already-launched `ElectronApplication` instance,
11
+ * typically in Playwright Test scenarios where the app is managed per-worker.
12
+ *
13
+ * ## Example
14
+ *
15
+ * ```ts
16
+ * import { _electron as electron } from 'playwright';
17
+ * import { actorCalled } from '@serenity-js/core';
18
+ * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright';
19
+ *
20
+ * const electronApp = await electron.launch({ args: ['main.js'] });
21
+ *
22
+ * const actor = actorCalled('Tester').whoCan(
23
+ * BrowseTheWebWithPlaywright.usingElectronApp(electronApp)
24
+ * );
25
+ *
26
+ * // After tests, close the app manually
27
+ * await electronApp.close();
28
+ * ```
29
+ *
30
+ * @group Models
31
+ */
32
+ export declare class PlaywrightBrowsingSessionWithElectron extends PlaywrightBrowsingSession {
33
+ protected electronApp: playwright.ElectronApplication;
34
+ constructor(electronApp: playwright.ElectronApplication, extraBrowserContextOptions: Partial<ExtraBrowserContextOptions>, selectors: playwright.Selectors);
35
+ protected createBrowserContext(): Promise<playwright.BrowserContext>;
36
+ protected registerCurrentPage(): Promise<PlaywrightPage>;
37
+ /**
38
+ * Closes all Electron windows but does NOT close the Electron application itself.
39
+ * The application lifecycle is managed externally.
40
+ */
41
+ closeAllPages(): Promise<void>;
42
+ /**
43
+ * Returns [basic meta-data](https://serenity-js.org/api/web/interface/BrowserCapabilities/) about the Electron application.
44
+ *
45
+ * **Please note** that since Playwright does not expose information about the operating system
46
+ * the tests are running on, **Serenity/JS assumes that the tests are running locally**
47
+ * and therefore returns the value of Node.js `process.platform` for `platformName`.
48
+ */
49
+ browserCapabilities(): Promise<BrowserCapabilities>;
50
+ private getElectronVersion;
51
+ }
52
+ //# sourceMappingURL=PlaywrightBrowsingSessionWithElectron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightBrowsingSessionWithElectron.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithElectron.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,qCAAsC,SAAQ,yBAAyB;IAG5E,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,mBAAmB;gBAA3C,WAAW,EAAE,UAAU,CAAC,mBAAmB,EACrD,0BAA0B,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC/D,SAAS,EAAE,UAAU,CAAC,SAAS;cAKV,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;cAI1D,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC;IA2CvE;;;OAGG;IACY,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7C;;;;;;OAMG;IACY,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;YAQpD,kBAAkB;CAWnC"}
@@ -0,0 +1,103 @@
1
+ import { CorrelationId } from '@serenity-js/core/model';
2
+ import { PlaywrightBrowsingSession } from './PlaywrightBrowsingSession.js';
3
+ import { PlaywrightPage } from './PlaywrightPage.js';
4
+ /**
5
+ * Playwright-specific implementation of [`BrowsingSession`](https://serenity-js.org/api/web/class/BrowsingSession/)
6
+ * for Electron applications.
7
+ *
8
+ * Use this class when you have an already-launched `ElectronApplication` instance,
9
+ * typically in Playwright Test scenarios where the app is managed per-worker.
10
+ *
11
+ * ## Example
12
+ *
13
+ * ```ts
14
+ * import { _electron as electron } from 'playwright';
15
+ * import { actorCalled } from '@serenity-js/core';
16
+ * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright';
17
+ *
18
+ * const electronApp = await electron.launch({ args: ['main.js'] });
19
+ *
20
+ * const actor = actorCalled('Tester').whoCan(
21
+ * BrowseTheWebWithPlaywright.usingElectronApp(electronApp)
22
+ * );
23
+ *
24
+ * // After tests, close the app manually
25
+ * await electronApp.close();
26
+ * ```
27
+ *
28
+ * @group Models
29
+ */
30
+ export class PlaywrightBrowsingSessionWithElectron extends PlaywrightBrowsingSession {
31
+ electronApp;
32
+ constructor(electronApp, extraBrowserContextOptions, selectors) {
33
+ super(extraBrowserContextOptions, selectors);
34
+ this.electronApp = electronApp;
35
+ }
36
+ async createBrowserContext() {
37
+ return this.electronApp.context();
38
+ }
39
+ async registerCurrentPage() {
40
+ // Ensure browser context is initialized before accessing windows
41
+ await this.browserContext();
42
+ const windows = this.electronApp.windows();
43
+ let targetPage;
44
+ if (windows.length === 0) {
45
+ // Wait for the first window to open
46
+ targetPage = await this.electronApp.firstWindow();
47
+ }
48
+ else {
49
+ // Use the last opened window
50
+ targetPage = windows.at(-1);
51
+ }
52
+ // Check if this window is already registered
53
+ const allPages = await this.allPages();
54
+ for (const page of allPages) {
55
+ const nativePage = await page.nativePage();
56
+ if (nativePage === targetPage) {
57
+ return page;
58
+ }
59
+ }
60
+ // Create and register a new PlaywrightPage
61
+ const playwrightPage = new PlaywrightPage(this, targetPage, this.extraBrowserContextOptions, CorrelationId.create());
62
+ this.register(playwrightPage);
63
+ // Set up close handler for automatic deregistration
64
+ targetPage.on('close', () => {
65
+ this.deregister(playwrightPage.id);
66
+ });
67
+ return playwrightPage;
68
+ }
69
+ /**
70
+ * Closes all Electron windows but does NOT close the Electron application itself.
71
+ * The application lifecycle is managed externally.
72
+ */
73
+ async closeAllPages() {
74
+ const pages = await this.allPages();
75
+ for (const page of pages) {
76
+ await page.close();
77
+ }
78
+ }
79
+ /**
80
+ * Returns [basic meta-data](https://serenity-js.org/api/web/interface/BrowserCapabilities/) about the Electron application.
81
+ *
82
+ * **Please note** that since Playwright does not expose information about the operating system
83
+ * the tests are running on, **Serenity/JS assumes that the tests are running locally**
84
+ * and therefore returns the value of Node.js `process.platform` for `platformName`.
85
+ */
86
+ async browserCapabilities() {
87
+ return {
88
+ browserName: 'electron',
89
+ platformName: process.platform,
90
+ browserVersion: await this.getElectronVersion(),
91
+ };
92
+ }
93
+ async getElectronVersion() {
94
+ try {
95
+ const version = await this.electronApp.evaluate(() => process.versions.electron);
96
+ return version || 'unknown';
97
+ }
98
+ catch {
99
+ return 'unknown';
100
+ }
101
+ }
102
+ }
103
+ //# sourceMappingURL=PlaywrightBrowsingSessionWithElectron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightBrowsingSessionWithElectron.js","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithElectron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,qCAAsC,SAAQ,yBAAyB;IAGlE;IADd,YACc,WAA2C,EACrD,0BAA+D,EAC/D,SAA+B;QAE/B,KAAK,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;QAJnC,gBAAW,GAAX,WAAW,CAAgC;IAKzD,CAAC;IAEkB,KAAK,CAAC,oBAAoB;QACzC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;IAEkB,KAAK,CAAC,mBAAmB;QACxC,iEAAiE;QACjE,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAE3C,IAAI,UAA2B,CAAC;QAEhC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,oCAAoC;YACpC,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QACtD,CAAC;aACI,CAAC;YACF,6BAA6B;YAC7B,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QACjC,CAAC;QAED,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,2CAA2C;QAC3C,MAAM,cAAc,GAAG,IAAI,cAAc,CACrC,IAAI,EACJ,UAAU,EACV,IAAI,CAAC,0BAA0B,EAC/B,aAAa,CAAC,MAAM,EAAE,CACzB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAE9B,oDAAoD;QACpD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACM,KAAK,CAAC,aAAa;QACxB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACM,KAAK,CAAC,mBAAmB;QAC9B,OAAO;YACH,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,OAAO,CAAC,QAAQ;YAC9B,cAAc,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;SAClD,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC5B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAC3C,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAClC,CAAC;YACF,OAAO,OAAO,IAAI,SAAS,CAAC;QAChC,CAAC;QACD,MAAM,CAAC;YACH,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;CACJ"}
@@ -17,5 +17,6 @@ export declare class PlaywrightBrowsingSessionWithPage extends PlaywrightBrowsin
17
17
  */
18
18
  closeAllPages(): Promise<void>;
19
19
  browserCapabilities(): Promise<BrowserCapabilities>;
20
+ discard(): Promise<void>;
20
21
  }
21
22
  //# sourceMappingURL=PlaywrightBrowsingSessionWithPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightBrowsingSessionWithPage.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithPage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,qBAAa,iCAAkC,SAAQ,yBAAyB;IAIxE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI;IAH5C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAyC;gBAG1D,IAAI,EAAE,UAAU,CAAC,IAAI,EACxC,qBAAqB,EAAE,0BAA0B,EACjD,SAAS,EAAE,UAAU,CAAC,SAAS;cAKV,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC;cAU9C,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;IAInF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAQrE"}
1
+ {"version":3,"file":"PlaywrightBrowsingSessionWithPage.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithPage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,qBAAa,iCAAkC,SAAQ,yBAAyB;IAIxE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI;IAH5C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAyC;gBAG1D,IAAI,EAAE,UAAU,CAAC,IAAI,EACxC,qBAAqB,EAAE,0BAA0B,EACjD,SAAS,EAAE,UAAU,CAAC,SAAS;cAKV,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC;cAU9C,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;IAInF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAS5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
@@ -40,5 +40,8 @@ export class PlaywrightBrowsingSessionWithPage extends PlaywrightBrowsingSession
40
40
  browserVersion: browser.version()
41
41
  };
42
42
  }
43
+ async discard() {
44
+ await this.closeAllPages();
45
+ }
43
46
  }
44
47
  //# sourceMappingURL=PlaywrightBrowsingSessionWithPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightBrowsingSessionWithPage.js","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,iCAAkC,SAAQ,yBAAyB;IAIrD;IAHN,uBAAuB,GAAkB,aAAa,CAAC,MAAM,EAAE,CAAC;IAEjF,YACuB,IAAqB,EACxC,qBAAiD,EACjD,SAA+B;QAE/B,KAAK,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;QAJrB,SAAI,GAAJ,IAAI,CAAiB;IAK5C,CAAC;IAEkB,KAAK,CAAC,mBAAmB;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAE1H,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAE9B,OAAO,cAAc,CAAC;IAC1B,CAAC;IAEkB,KAAK,CAAC,oBAAoB;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,IAAI,CAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACxC,CAAC;IAEQ,KAAK,CAAC,mBAAmB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;QAC9C,OAAO;YACH,WAAW,EAAG,OAAe,CAAC,YAAY,CAAC,IAAI,EAAI,4DAA4D;YAC/G,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAqB,gDAAgD;YACnG,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE;SACpC,CAAA;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"PlaywrightBrowsingSessionWithPage.js","sourceRoot":"","sources":["../../../src/screenplay/models/PlaywrightBrowsingSessionWithPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,iCAAkC,SAAQ,yBAAyB;IAIrD;IAHN,uBAAuB,GAAkB,aAAa,CAAC,MAAM,EAAE,CAAC;IAEjF,YACuB,IAAqB,EACxC,qBAAiD,EACjD,SAA+B;QAE/B,KAAK,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;QAJrB,SAAI,GAAJ,IAAI,CAAiB;IAK5C,CAAC;IAEkB,KAAK,CAAC,mBAAmB;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAE1H,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAE9B,OAAO,cAAc,CAAC;IAC1B,CAAC;IAEkB,KAAK,CAAC,oBAAoB;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,IAAI,CAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACxC,CAAC;IAEQ,KAAK,CAAC,mBAAmB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;QAC9C,OAAO;YACH,WAAW,EAAG,OAAe,CAAC,YAAY,CAAC,IAAI,EAAI,4DAA4D;YAC/G,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAqB,gDAAgD;YACnG,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE;SACpC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;CACJ"}
@@ -0,0 +1,52 @@
1
+ import type { Discardable, Initialisable } from '@serenity-js/core';
2
+ import * as playwright from 'playwright-core';
3
+ import type { ExtraBrowserContextOptions } from '../../ExtraBrowserContextOptions.js';
4
+ import type { ElectronLaunchOptions } from './ElectronLaunchOptions.js';
5
+ import { PlaywrightBrowsingSessionWithElectron } from './PlaywrightBrowsingSessionWithElectron.js';
6
+ /**
7
+ * Self-launching implementation of [`PlaywrightBrowsingSession`](https://serenity-js.org/api/playwright/class/PlaywrightBrowsingSession/)
8
+ * for Electron applications.
9
+ *
10
+ * This class launches the Electron application on first use and closes it when discarded.
11
+ * Use this for test runners like Mocha or Jasmine that don't manage Electron lifecycle.
12
+ *
13
+ * ## Example
14
+ *
15
+ * ```typescript
16
+ * import { actorCalled } from '@serenity-js/core';
17
+ * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright';
18
+ *
19
+ * const actor = actorCalled('Tester').whoCan(
20
+ * BrowseTheWebWithPlaywright.launchingElectronApp({
21
+ * args: ['path/to/main.js'],
22
+ * cwd: 'path/to/app',
23
+ * })
24
+ * );
25
+ *
26
+ * // The app is automatically closed when the actor is dismissed
27
+ * ```
28
+ *
29
+ * @group Models
30
+ */
31
+ export declare class SelfLaunchingPlaywrightBrowsingSessionWithElectron extends PlaywrightBrowsingSessionWithElectron implements Initialisable, Discardable {
32
+ private readonly launchOptions;
33
+ constructor(launchOptions: ElectronLaunchOptions, extraBrowserContextOptions: Partial<ExtraBrowserContextOptions>, selectors: playwright.Selectors);
34
+ /**
35
+ * Launches the Electron application using the configured launch options.
36
+ *
37
+ * This method is idempotent - calling it multiple times will only launch
38
+ * the application once.
39
+ */
40
+ initialise(): Promise<void>;
41
+ /**
42
+ * Returns `true` if the Electron application has been launched.
43
+ */
44
+ isInitialised(): boolean;
45
+ /**
46
+ * Closes the Electron application that was launched by this session.
47
+ * Called when the ability is discarded.
48
+ */
49
+ closeElectronApp(): Promise<void>;
50
+ discard(): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,qCAAqC,EAAE,MAAM,4CAA4C,CAAC;AAEnG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,kDACT,SAAQ,qCACR,YAAW,aAAa,EAAE,WAAW;IAGjC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,qBAAqB,EACrD,0BAA0B,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC/D,SAAS,EAAE,UAAU,CAAC,SAAS;IAMnC;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAMjC"}