diff --git a/src/PuppeteerRunnerExtension.ts b/src/PuppeteerRunnerExtension.ts index 4c7f41fd..792a1264 100644 --- a/src/PuppeteerRunnerExtension.ts +++ b/src/PuppeteerRunnerExtension.ts @@ -22,20 +22,20 @@ import { } from './SchemaUtils.js'; export class PuppeteerRunnerExtension implements RunnerExtension { - #browser: Browser; - #page: Page; - #timeout: number; + protected browser: Browser; + protected page: Page; + protected timeout: number; constructor(browser: Browser, page: Page, opts?: { timeout?: number }) { - this.#browser = browser; - this.#page = page; - this.#timeout = opts?.timeout || 5000; + this.browser = browser; + this.page = page; + this.timeout = opts?.timeout || 5000; } async runStep(step: Step, flow: UserFlow): Promise { - const timeout = step.timeout || this.#timeout; - const page = this.#page; - const browser = this.#browser; + const timeout = step.timeout || this.timeout; + const page = this.page; + const browser = this.browser; const waitForVisible = true; const targetPage = await getTargetPageForStep(browser, page, step, timeout); @@ -197,6 +197,12 @@ export class PuppeteerRunnerExtension implements RunnerExtension { } } +export class PuppeteerRunnerExtensionOwningBrowser extends PuppeteerRunnerExtension { + async afterAllSteps() { + await this.browser.close(); + } +} + async function getFrame(pageOrFrame: Page | Frame, step: Step): Promise { let frame = 'mainFrame' in pageOrFrame ? pageOrFrame.mainFrame() : pageOrFrame; @@ -492,6 +498,7 @@ export interface WaitForTargetOptions { } interface Browser { + close(): Promise; waitForTarget( predicate: (x: Target) => boolean, options?: WaitForTargetOptions @@ -539,9 +546,9 @@ interface Page { frames(): Frame[]; emulateNetworkConditions(conditions: any): void; keyboard: { - type(value: string): void; - down(key: Key): void; - up(key: Key): void; + type(value: string): Promise; + down(key: Key): Promise; + up(key: Key): Promise; }; waitForTimeout(timeout: number): Promise; close(): Promise; diff --git a/src/Runner.ts b/src/Runner.ts index 863e34ac..93dfbbaa 100644 --- a/src/Runner.ts +++ b/src/Runner.ts @@ -14,7 +14,7 @@ limitations under the License. */ -import { PuppeteerRunnerExtension } from './PuppeteerRunnerExtension.js'; +import { PuppeteerRunnerExtensionOwningBrowser } from './PuppeteerRunnerExtension.js'; import { RunnerExtension } from './RunnerExtension.js'; import { UserFlow } from './Schema.js'; @@ -54,6 +54,7 @@ export class Runner { this.#flow.steps[this.#nextStep], this.#flow ); + this.#nextStep++; } if (this.#nextStep >= this.#flow.steps.length) { await this.#extension.afterAllSteps?.(this.#flow); @@ -66,12 +67,12 @@ export async function createRunner( extension?: RunnerExtension ) { if (!extension) { - const puppeteer = await import('puppeteer'); + const { default: puppeteer } = await import('puppeteer'); const browser = await puppeteer.launch({ headless: true, }); const page = await browser.newPage(); - extension = new PuppeteerRunnerExtension(browser, page); + extension = new PuppeteerRunnerExtensionOwningBrowser(browser, page); } return new Runner(flow, extension); } diff --git a/test/runner_test.ts b/test/runner_test.ts index edb74fd3..2bc4bbdf 100644 --- a/test/runner_test.ts +++ b/test/runner_test.ts @@ -40,7 +40,7 @@ describe('Runner', () => { await browser.close(); }); - it('should run an empty flow using Puppeteer', async () => { + it('should run an empty flow using provided Puppeteer', async () => { const runner = await createRunner( { title: 'test', @@ -50,4 +50,12 @@ describe('Runner', () => { ); await runner.run(); }); + + it('should run an empty flow auto-imported Puppeteer', async () => { + const runner = await createRunner({ + title: 'test', + steps: [], + }); + await runner.run(); + }); });