mirror of
https://github.com/microsoft/playwright.git
synced 2024-09-11 20:37:54 +03:00
chore(test): move electron tests to typescript (#3379)
This commit is contained in:
parent
d8d845afcc
commit
77e75b447b
@ -11,6 +11,7 @@ src/firefox/protocol.ts
|
|||||||
src/webkit/protocol.ts
|
src/webkit/protocol.ts
|
||||||
/types/*
|
/types/*
|
||||||
/index.d.ts
|
/index.d.ts
|
||||||
|
/electron-types.d.ts
|
||||||
utils/generate_types/overrides.d.ts
|
utils/generate_types/overrides.d.ts
|
||||||
utils/generate_types/test/test.ts
|
utils/generate_types/test/test.ts
|
||||||
test/
|
test/
|
||||||
|
@ -14,6 +14,7 @@ lib/injected/
|
|||||||
#types
|
#types
|
||||||
!types/*
|
!types/*
|
||||||
!index.d.ts
|
!index.d.ts
|
||||||
|
!electron-types.d.ts
|
||||||
|
|
||||||
!index.js
|
!index.js
|
||||||
!index.mjs
|
!index.mjs
|
||||||
|
52
electron-types.d.ts
vendored
Normal file
52
electron-types.d.ts
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Microsoft Corporation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Logger, Page, JSHandle, ChromiumBrowserContext } from './types/types';
|
||||||
|
import { BrowserWindow, BrowserWindowConstructorOptions } from 'electron';
|
||||||
|
|
||||||
|
export type ElectronLaunchOptions = {
|
||||||
|
args?: string[],
|
||||||
|
cwd?: string,
|
||||||
|
env?: {[key: string]: string|number|boolean},
|
||||||
|
handleSIGINT?: boolean,
|
||||||
|
handleSIGTERM?: boolean,
|
||||||
|
handleSIGHUP?: boolean,
|
||||||
|
timeout?: number,
|
||||||
|
logger?: Logger,
|
||||||
|
};
|
||||||
|
export interface ElectronLauncher {
|
||||||
|
launch(executablePath: string, options?: ElectronLaunchOptions): Promise<ElectronApplication>;
|
||||||
|
}
|
||||||
|
export interface ElectronApplication {
|
||||||
|
on(event: 'window', listener: (page : ElectronPage) => void): this;
|
||||||
|
addListener(event: 'window', listener: (page : ElectronPage) => void): this;
|
||||||
|
waitForEvent(event: 'window', optionsOrPredicate?: { predicate?: (page : ElectronPage) => boolean, timeout?: number }): Promise<ElectronPage>;
|
||||||
|
|
||||||
|
on(event: 'close', listener: (exitCode? : number) => void): this;
|
||||||
|
addListener(event: 'close', listener: (exitCode? : number) => void): this;
|
||||||
|
waitForEvent(event: 'close', optionsOrPredicate?: { predicate?: (exitCode? : number) => boolean, timeout?: number }): Promise<number|undefined>;
|
||||||
|
|
||||||
|
context(): ChromiumBrowserContext;
|
||||||
|
windows(): ElectronPage[];
|
||||||
|
firstWindow(): Promise<ElectronPage>;
|
||||||
|
newBrowserWindow(options?: BrowserWindowConstructorOptions): Promise<ElectronPage>;
|
||||||
|
close(): Promise<void>;
|
||||||
|
evaluate: JSHandle<typeof import('electron')>['evaluate'];
|
||||||
|
evaluateHandle: JSHandle<typeof import('electron')>['evaluateHandle'];
|
||||||
|
}
|
||||||
|
export interface ElectronPage extends Page {
|
||||||
|
browserWindow: JSHandle<BrowserWindow>;
|
||||||
|
}
|
38
packages/playwright-electron/index.d.ts
vendored
38
packages/playwright-electron/index.d.ts
vendored
@ -14,41 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Logger, Page, JSHandle, ChromiumBrowserContext } from 'playwright-core/types/types';
|
import { ElectronLauncher } from 'playwright-core/electron-types';
|
||||||
import { BrowserWindow, BrowserWindowConstructorOptions } from 'electron';
|
|
||||||
|
|
||||||
export * from 'playwright-core/types/types';
|
export * from 'playwright-core/types/types';
|
||||||
export type ElectronLaunchOptions = {
|
export * from 'playwright-core/electron-types';
|
||||||
args?: string[],
|
|
||||||
cwd?: string,
|
|
||||||
env?: {[key: string]: string|number|boolean},
|
|
||||||
handleSIGINT?: boolean,
|
|
||||||
handleSIGTERM?: boolean,
|
|
||||||
handleSIGHUP?: boolean,
|
|
||||||
timeout?: number,
|
|
||||||
logger?: Logger,
|
|
||||||
};
|
|
||||||
export interface ElectronLauncher {
|
|
||||||
launch(executablePath: string, options?: ElectronLaunchOptions): Promise<ElectronApplication>;
|
|
||||||
}
|
|
||||||
export interface ElectronApplication {
|
|
||||||
on(event: 'window', listener: (page : ElectronPage) => void): this;
|
|
||||||
addListener(event: 'window', listener: (page : ElectronPage) => void): this;
|
|
||||||
waitForEvent(event: 'window', optionsOrPredicate?: { predicate?: (page : ElectronPage) => boolean, timeout?: number }): Promise<ElectronPage>;
|
|
||||||
|
|
||||||
on(event: 'close', listener: (exitCode? : number) => void): this;
|
|
||||||
addListener(event: 'close', listener: (exitCode? : number) => void): this;
|
|
||||||
waitForEvent(event: 'close', optionsOrPredicate?: { predicate?: (exitCode? : number) => boolean, timeout?: number }): Promise<number|undefined>;
|
|
||||||
|
|
||||||
context(): ChromiumBrowserContext;
|
|
||||||
windows(): ElectronPage[];
|
|
||||||
firstWindow(): Promise<ElectronPage>;
|
|
||||||
newBrowserWindow(options?: BrowserWindowConstructorOptions): Promise<ElectronPage>;
|
|
||||||
close(): Promise<void>;
|
|
||||||
evaluate: JSHandle<typeof import('electron')>['evaluate'];
|
|
||||||
evaluateHandle: JSHandle<typeof import('electron')>['evaluateHandle'];
|
|
||||||
}
|
|
||||||
export interface ElectronPage extends Page {
|
|
||||||
browserWindow: JSHandle<BrowserWindow>;
|
|
||||||
}
|
|
||||||
export const electron: ElectronLauncher;
|
export const electron: ElectronLauncher;
|
||||||
|
@ -13,24 +13,13 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
require('../base.fixture');
|
import './electron.fixture';
|
||||||
|
|
||||||
const path = require('path');
|
import path from 'path';
|
||||||
const electronName = process.platform === 'win32' ? 'electron.cmd' : 'electron';
|
const electronName = process.platform === 'win32' ? 'electron.cmd' : 'electron';
|
||||||
|
|
||||||
const { CHROMIUM } = testOptions;
|
const { CHROMIUM } = testOptions;
|
||||||
|
|
||||||
registerFixture('application', async ({playwright}, test) => {
|
|
||||||
const electronPath = path.join(__dirname, '..', '..', 'node_modules', '.bin', electronName);
|
|
||||||
const application = await playwright.electron.launch(electronPath, {
|
|
||||||
args: [path.join(__dirname, 'testApp.js')],
|
|
||||||
});
|
|
||||||
try {
|
|
||||||
await test(application);
|
|
||||||
} finally {
|
|
||||||
await application.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should fire close event', async ({ playwright }) => {
|
it.skip(!CHROMIUM)('should fire close event', async ({ playwright }) => {
|
||||||
const electronPath = path.join(__dirname, '..', '..', 'node_modules', '.bin', electronName);
|
const electronPath = path.join(__dirname, '..', '..', 'node_modules', '.bin', electronName);
|
||||||
@ -108,16 +97,15 @@ it.skip(!CHROMIUM)('should support init script', async ({ application }) => {
|
|||||||
await application.context().addInitScript('window.magic = 42;')
|
await application.context().addInitScript('window.magic = 42;')
|
||||||
const page = await application.newBrowserWindow({ width: 800, height: 600 });
|
const page = await application.newBrowserWindow({ width: 800, height: 600 });
|
||||||
await page.goto('data:text/html,<script>window.copy = magic</script>');
|
await page.goto('data:text/html,<script>window.copy = magic</script>');
|
||||||
expect(await page.evaluate(() => copy)).toBe(42);
|
expect(await page.evaluate(() => window['copy'])).toBe(42);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should expose function', async ({ application }) => {
|
it.skip(!CHROMIUM)('should expose function', async ({ application }) => {
|
||||||
const result = new Promise(f => callback = f);
|
|
||||||
const t = Date.now();
|
const t = Date.now();
|
||||||
await application.context().exposeFunction('add', (a, b) => a + b);
|
await application.context().exposeFunction('add', (a, b) => a + b);
|
||||||
const page = await application.newBrowserWindow({ width: 800, height: 600 });
|
const page = await application.newBrowserWindow({ width: 800, height: 600 });
|
||||||
await page.goto('data:text/html,<script>window.result = add(20, 22);</script>');
|
await page.goto('data:text/html,<script>window.result = add(20, 22);</script>');
|
||||||
expect(await page.evaluate(() => result)).toBe(42);
|
expect(await page.evaluate(() => window['result'])).toBe(42);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should wait for first window', async ({ application }) => {
|
it.skip(!CHROMIUM)('should wait for first window', async ({ application }) => {
|
@ -13,50 +13,26 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
require('../base.fixture');
|
import './electron.fixture';
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
const electronName = process.platform === 'win32' ? 'electron.cmd' : 'electron';
|
|
||||||
|
|
||||||
const { CHROMIUM } = testOptions;
|
const { CHROMIUM } = testOptions;
|
||||||
|
|
||||||
registerFixture('application', async ({playwright}, test) => {
|
|
||||||
const electronPath = path.join(__dirname, '..', '..', 'node_modules', '.bin', electronName);
|
|
||||||
const application = await playwright.electron.launch(electronPath, {
|
|
||||||
args: [path.join(__dirname, 'testApp.js')],
|
|
||||||
});
|
|
||||||
try {
|
|
||||||
await test(application);
|
|
||||||
} finally {
|
|
||||||
await application.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
registerFixture('window', async ({application}, test) => {
|
|
||||||
const page = await application.newBrowserWindow({ width: 800, height: 600 });
|
|
||||||
try {
|
|
||||||
await test(page);
|
|
||||||
} finally {
|
|
||||||
await page.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should click the button', async({window, server}) => {
|
it.skip(!CHROMIUM)('should click the button', async({window, server}) => {
|
||||||
await window.goto(server.PREFIX + '/input/button.html');
|
await window.goto(server.PREFIX + '/input/button.html');
|
||||||
await window.click('button');
|
await window.click('button');
|
||||||
expect(await window.evaluate(() => result)).toBe('Clicked');
|
expect(await window.evaluate('result')).toBe('Clicked');
|
||||||
});
|
});
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should check the box', async({window}) => {
|
it.skip(!CHROMIUM)('should check the box', async({window}) => {
|
||||||
await window.setContent(`<input id='checkbox' type='checkbox'></input>`);
|
await window.setContent(`<input id='checkbox' type='checkbox'></input>`);
|
||||||
await window.check('input');
|
await window.check('input');
|
||||||
expect(await window.evaluate(() => checkbox.checked)).toBe(true);
|
expect(await window.evaluate('checkbox.checked')).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should not check the checked box', async({window}) => {
|
it.skip(!CHROMIUM)('should not check the checked box', async({window}) => {
|
||||||
await window.setContent(`<input id='checkbox' type='checkbox' checked></input>`);
|
await window.setContent(`<input id='checkbox' type='checkbox' checked></input>`);
|
||||||
await window.check('input');
|
await window.check('input');
|
||||||
expect(await window.evaluate(() => checkbox.checked)).toBe(true);
|
expect(await window.evaluate('checkbox.checked')).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.skip(!CHROMIUM)('should type into a textarea', async({window, server}) => {
|
it.skip(!CHROMIUM)('should type into a textarea', async({window, server}) => {
|
37
test/electron/electron.fixture.ts
Normal file
37
test/electron/electron.fixture.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import '../base.fixture';
|
||||||
|
import {ElectronApplication, ElectronLauncher, ElectronPage} from '../../electron-types';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
const electronName = process.platform === 'win32' ? 'electron.cmd' : 'electron';
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface FixtureState {
|
||||||
|
application: ElectronApplication;
|
||||||
|
window: ElectronPage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module '../../index' {
|
||||||
|
const electron: ElectronLauncher
|
||||||
|
}
|
||||||
|
|
||||||
|
registerFixture('application', async ({playwright}, test) => {
|
||||||
|
const electronPath = path.join(__dirname, '..', '..', 'node_modules', '.bin', electronName);
|
||||||
|
const application = await playwright.electron.launch(electronPath, {
|
||||||
|
args: [path.join(__dirname, 'testApp.js')],
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
await test(application);
|
||||||
|
} finally {
|
||||||
|
await application.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
registerFixture('window', async ({application}, test) => {
|
||||||
|
const page = await application.newBrowserWindow({ width: 800, height: 600 });
|
||||||
|
try {
|
||||||
|
await test(page);
|
||||||
|
} finally {
|
||||||
|
await page.close();
|
||||||
|
}
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user