Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/test/automation/src/playwrightElectron.ts
5241 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as playwright from '@playwright/test';
7
import type { LaunchOptions } from './code';
8
import { PlaywrightDriver } from './playwrightDriver';
9
import { IElectronConfiguration, resolveElectronConfiguration } from './electron';
10
import { measureAndLog } from './logger';
11
import { ChildProcess } from 'child_process';
12
13
export async function launch(options: LaunchOptions): Promise<{ electronProcess: ChildProcess; driver: PlaywrightDriver }> {
14
15
// Resolve electron config and update
16
const { electronPath, args, env } = await resolveElectronConfiguration(options);
17
args.push('--enable-smoke-test-driver');
18
19
// Launch electron via playwright
20
const { electron, context, page } = await launchElectron({ electronPath, args, env }, options);
21
const electronProcess = electron.process();
22
23
return {
24
electronProcess,
25
driver: new PlaywrightDriver(electron, context, page, undefined /* no server process */, Promise.resolve() /* Window is open already */, options)
26
};
27
}
28
29
async function launchElectron(configuration: IElectronConfiguration, options: LaunchOptions) {
30
const { logger, tracing, snapshots } = options;
31
32
const playwrightImpl = options.playwright ?? playwright;
33
const electron = await measureAndLog(() => playwrightImpl._electron.launch({
34
executablePath: configuration.electronPath,
35
args: configuration.args,
36
recordVideo: options.videosPath
37
? {
38
dir: options.videosPath,
39
size: { width: 1920, height: 1080 }
40
} : undefined,
41
env: configuration.env as { [key: string]: string },
42
timeout: 0
43
}), 'playwright-electron#launch', logger);
44
45
let window = electron.windows()[0];
46
if (!window) {
47
window = await measureAndLog(() => electron.waitForEvent('window', { timeout: 0 }), 'playwright-electron#firstWindow', logger);
48
}
49
50
const context = window.context();
51
52
if (tracing) {
53
try {
54
await measureAndLog(() => context.tracing.start({ screenshots: true, snapshots }), 'context.tracing.start()', logger);
55
} catch (error) {
56
logger.log(`Playwright (Electron): Failed to start playwright tracing (${error})`); // do not fail the build when this fails
57
}
58
}
59
60
if (options.verbose) {
61
electron.on('window', () => logger.log(`Playwright (Electron): electron.on('window')`));
62
electron.on('close', () => logger.log(`Playwright (Electron): electron.on('close')`));
63
64
context.on('page', () => logger.log(`Playwright (Electron): context.on('page')`));
65
context.on('requestfailed', e => logger.log(`Playwright (Electron): context.on('requestfailed') [${e.failure()?.errorText} for ${e.url()}]`));
66
67
window.on('dialog', () => logger.log(`Playwright (Electron): window.on('dialog')`));
68
window.on('domcontentloaded', () => logger.log(`Playwright (Electron): window.on('domcontentloaded')`));
69
window.on('load', () => logger.log(`Playwright (Electron): window.on('load')`));
70
window.on('popup', () => logger.log(`Playwright (Electron): window.on('popup')`));
71
window.on('framenavigated', () => logger.log(`Playwright (Electron): window.on('framenavigated')`));
72
window.on('requestfailed', e => logger.log(`Playwright (Electron): window.on('requestfailed') [${e.failure()?.errorText} for ${e.url()}]`));
73
}
74
75
window.on('console', e => logger.log(`Playwright (Electron): window.on('console') [${e.text()}]`));
76
window.on('pageerror', async (error) => logger.log(`Playwright (Electron) ERROR: page error: ${error}`));
77
window.on('crash', () => logger.log('Playwright (Electron) ERROR: page crash'));
78
window.on('close', () => logger.log('Playwright (Electron): page close'));
79
window.on('response', async (response) => {
80
if (response.status() >= 400) {
81
logger.log(`Playwright (Electron) ERROR: HTTP status ${response.status()} for ${response.url()}`);
82
}
83
});
84
85
return { electron, context, page: window };
86
}
87
88