From 6caa57a2d71a7fdcec7c0406c6e808ccd95376ad Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Tue, 1 Mar 2022 13:47:15 +0100 Subject: [PATCH] feat: emulate automation mode (#35) --- package.json | 2 +- src/PuppeteerRunnerExtension.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 395542c6..2134faa3 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "mime": "3.0.0", "mocha": "9.2.0", "prettier": "2.5.1", - "puppeteer": "13.1.3", + "puppeteer": "13.4.1", "rimraf": "3.0.2", "standard-version": "git+https://github.com:conventional-changelog/standard-version.git#v9.4.0", "ts-node": "10.4.0", diff --git a/src/PuppeteerRunnerExtension.ts b/src/PuppeteerRunnerExtension.ts index 5c289148..d37f7545 100644 --- a/src/PuppeteerRunnerExtension.ts +++ b/src/PuppeteerRunnerExtension.ts @@ -33,6 +33,16 @@ export class PuppeteerRunnerExtension extends RunnerExtension { this.timeout = opts?.timeout || 5000; } + async #ensureAutomationEmulatation(pageOrFrame: Page | Frame) { + try { + await pageOrFrame + .client() + .send('Emulation.setAutomationOverride', { enabled: true }); + } catch { + // ignore errors as not all versions support this command. + } + } + async runStep(step: Step, flow: UserFlow): Promise { const timeout = step.timeout || this.timeout; const page = this.page; @@ -58,6 +68,8 @@ export class PuppeteerRunnerExtension extends RunnerExtension { throw new Error('Target is not found for step: ' + JSON.stringify(step)); } + await this.#ensureAutomationEmulatation(pageOrFrame); + const frame = await getFrame(pageOrFrame, step); const assertedEventsPromise = waitForEvents(pageOrFrame, step, timeout); @@ -568,6 +580,10 @@ interface ElementHandle asElement(): ElementHandle | null; } +interface CDPSession { + send(command: string, opts: { enabled: boolean }): Promise; +} + interface Page { setDefaultTimeout(timeout: number): void; frames(): Frame[]; @@ -586,6 +602,7 @@ interface Page { selector: string ): Promise>>; waitForFrame(url: string, opts: { timeout: number }): Promise; + client(): CDPSession; } interface Frame { @@ -606,4 +623,5 @@ interface Frame { $$( selector: string ): Promise>>; + client(): CDPSession; }