@serenity-js/playwright 3.42.1 → 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.
- package/CHANGELOG.md +28 -0
- package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts +60 -2
- package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts.map +1 -1
- package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.js +74 -2
- package/esm/screenplay/abilities/BrowseTheWebWithPlaywright.js.map +1 -1
- package/esm/screenplay/models/ElectronLaunchOptions.d.ts +55 -0
- package/esm/screenplay/models/ElectronLaunchOptions.d.ts.map +1 -0
- package/esm/screenplay/models/ElectronLaunchOptions.js +2 -0
- package/esm/screenplay/models/ElectronLaunchOptions.js.map +1 -0
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts +3 -2
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts.map +1 -1
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js +6 -5
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js.map +1 -1
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts +52 -0
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.js +103 -0
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithElectron.js.map +1 -0
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts +1 -0
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts.map +1 -1
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.js +3 -0
- package/esm/screenplay/models/PlaywrightBrowsingSessionWithPage.js.map +1 -1
- package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts +52 -0
- package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
- package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js +70 -0
- package/esm/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js.map +1 -0
- package/esm/screenplay/models/index.d.ts +3 -0
- package/esm/screenplay/models/index.d.ts.map +1 -1
- package/esm/screenplay/models/index.js +3 -0
- package/esm/screenplay/models/index.js.map +1 -1
- package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts +60 -2
- package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.d.ts.map +1 -1
- package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.js +73 -1
- package/lib/screenplay/abilities/BrowseTheWebWithPlaywright.js.map +1 -1
- package/lib/screenplay/models/ElectronLaunchOptions.d.ts +55 -0
- package/lib/screenplay/models/ElectronLaunchOptions.d.ts.map +1 -0
- package/lib/screenplay/models/ElectronLaunchOptions.js +3 -0
- package/lib/screenplay/models/ElectronLaunchOptions.js.map +1 -0
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts +3 -2
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.d.ts.map +1 -1
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js +6 -5
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithBrowser.js.map +1 -1
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts +52 -0
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.js +107 -0
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithElectron.js.map +1 -0
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts +1 -0
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.d.ts.map +1 -1
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.js +3 -0
- package/lib/screenplay/models/PlaywrightBrowsingSessionWithPage.js.map +1 -1
- package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts +52 -0
- package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.d.ts.map +1 -0
- package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js +107 -0
- package/lib/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.js.map +1 -0
- package/lib/screenplay/models/index.d.ts +3 -0
- package/lib/screenplay/models/index.d.ts.map +1 -1
- package/lib/screenplay/models/index.js +3 -0
- package/lib/screenplay/models/index.js.map +1 -1
- package/package.json +21 -9
- package/src/screenplay/abilities/BrowseTheWebWithPlaywright.ts +112 -7
- package/src/screenplay/models/ElectronLaunchOptions.ts +55 -0
- package/src/screenplay/models/PlaywrightBrowsingSessionWithBrowser.ts +13 -8
- package/src/screenplay/models/PlaywrightBrowsingSessionWithElectron.ts +129 -0
- package/src/screenplay/models/PlaywrightBrowsingSessionWithPage.ts +4 -0
- package/src/screenplay/models/SelfLaunchingPlaywrightBrowsingSessionWithElectron.ts +85 -0
- package/src/screenplay/models/index.ts +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,34 @@
|
|
|
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
|
+
|
|
23
|
+
## [3.42.2](https://github.com/serenity-js/serenity-js/compare/v3.42.1...v3.42.2) (2026-04-26)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Bug Fixes
|
|
27
|
+
|
|
28
|
+
* **playwright:** aligned package.json exports to use conditional import/require types ([a8966e9](https://github.com/serenity-js/serenity-js/commit/a8966e94d74c24b3d2821e99e51bf3b24121b55e))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
6
34
|
## [3.42.1](https://github.com/serenity-js/serenity-js/compare/v3.42.0...v3.42.1) (2026-04-08)
|
|
7
35
|
|
|
8
36
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
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,
|
|
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
|
-
|
|
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":"
|
|
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 @@
|
|
|
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,
|
|
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":"
|
|
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;
|
|
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"}
|
|
@@ -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"}
|