test: move remaining tests to jest (#3009)

This commit is contained in:
Pavel Feldman 2020-07-17 13:02:50 -07:00 committed by GitHub
parent 9790cf2291
commit 24f6d19e27
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 230 additions and 239 deletions

View file

@ -14,17 +14,17 @@
* limitations under the License.
*/
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = require('../utils').testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = testOptions;
describe('Service Worker', function() {
it('should create a worker from a service worker', async({browser, page, server, context}) => {
describe.skip(!CHROMIUM)('Service Worker', function() {
it('should create a worker from a service worker', async({page, server, context}) => {
const [worker] = await Promise.all([
context.waitForEvent('serviceworker'),
page.goto(server.PREFIX + '/serviceworkers/empty/sw.html')
]);
expect(await worker.evaluate(() => self.toString())).toBe('[object ServiceWorkerGlobalScope]');
});
it('serviceWorkers() should return current workers', async({browser, page, server, context}) => {
it('serviceWorkers() should return current workers', async({page, server, context}) => {
const [worker1] = await Promise.all([
context.waitForEvent('serviceworker'),
page.goto(server.PREFIX + '/serviceworkers/empty/sw.html')
@ -41,7 +41,7 @@ describe('Service Worker', function() {
expect(workers).toContain(worker1);
expect(workers).toContain(worker2);
});
it('should not create a worker from a shared worker', async({browser, page, server, context}) => {
it('should not create a worker from a shared worker', async({page, server, context}) => {
await page.goto(server.EMPTY_PAGE);
let serviceWorkerCreated;
context.once('serviceworker', () => serviceWorkerCreated = true);
@ -65,7 +65,7 @@ describe('Service Worker', function() {
});
});
describe('Chromium-Specific Page Tests', function() {
describe.skip(!CHROMIUM)('Chromium-Specific Page Tests', function() {
it('Page.route should work with intervention headers', async({server, page}) => {
server.setRoute('/intervention', (req, res) => res.end(`
<script>

View file

@ -17,9 +17,9 @@
const path = require('path');
const utils = require('../utils');
const {makeUserDataDir, removeUserDataDir} = utils;
const {FFOX, CHROMIUM, WEBKIT, WIN, USES_HOOKS} = utils.testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, WIN, USES_HOOKS} = testOptions;
describe('launcher', function() {
describe.skip(!CHROMIUM)('launcher', function() {
it('should throw with remote-debugging-pipe argument', async({browserType, defaultBrowserOptions}) => {
const options = Object.assign({}, defaultBrowserOptions);
options.args = ['--remote-debugging-pipe'].concat(options.args || []);
@ -49,7 +49,7 @@ describe('launcher', function() {
});
});
describe('extensions', () => {
describe.skip(!CHROMIUM)('extensions', () => {
it('should return background pages', async({browserType, defaultBrowserOptions}) => {
const userDataDir = await makeUserDataDir();
const extensionPath = path.join(__dirname, '..', 'assets', 'simple-extension');
@ -73,7 +73,7 @@ describe('extensions', () => {
});
});
describe('BrowserContext', function() {
describe.skip(!CHROMIUM)('BrowserContext', function() {
it('should not create pages automatically', async ({browserType, defaultBrowserOptions}) => {
const browser = await browserType.launch(defaultBrowserOptions);
const browserSession = await browser.newBrowserCDPSession();

View file

@ -14,34 +14,47 @@
* limitations under the License.
*/
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = require('../utils').testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = testOptions;
describe('OOPIF', function() {
beforeAll(async function(state) {
state.browser = await state.browserType.launch(Object.assign({}, state.defaultBrowserOptions, {
args: (state.defaultBrowserOptions.args || []).concat(['--site-per-process']),
}));
registerFixture('sppBrowser', async ({browserType, defaultBrowserOptions}, test) => {
const browser = await browserType.launch({
...defaultBrowserOptions,
args: (defaultBrowserOptions.args || []).concat(['--site-per-process'])
});
beforeEach(async function(state) {
state.context = await state.browser.newContext();
state.page = await state.context.newPage();
});
afterEach(async function(state) {
await state.context.close();
state.page = null;
state.context = null;
});
afterAll(async function(state) {
await state.browser.close();
state.browser = null;
});
it('should report oopif frames', async function({browser, page, server, context}) {
try {
await test(browser);
} finally {
await browser.close();
}
});
registerFixture('sppContext', async ({sppBrowser}, test) => {
const context = await sppBrowser.newContext();
try {
await test(context);
} finally {
await context.close();
}
});
registerFixture('sppPage', async ({sppContext}, test) => {
const page = await sppContext.newPage();
await test(page);
});
describe.skip(!CHROMIUM)('OOPIF', function() {
it('should report oopif frames', async function({sppBrowser, sppPage, server}) {
const browser = sppBrowser;
const page = sppPage;
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(await countOOPIFs(browser)).toBe(1);
expect(page.frames().length).toBe(2);
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
});
it('should handle oopif detach', async function({browser, page, server, context}) {
it('should handle oopif detach', async function({sppBrowser, sppPage, server}) {
const browser = sppBrowser;
const page = sppPage;
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(await countOOPIFs(browser)).toBe(1);
expect(page.frames().length).toBe(2);
@ -53,7 +66,9 @@ describe('OOPIF', function() {
]);
expect(detachedFrame).toBe(frame);
});
it('should handle remote -> local -> remote transitions', async function({browser, page, server, context}) {
it('should handle remote -> local -> remote transitions', async function({sppBrowser, sppPage, server}) {
const browser = sppBrowser;
const page = sppPage;
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
expect(await countOOPIFs(browser)).toBe(1);
@ -71,7 +86,9 @@ describe('OOPIF', function() {
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
expect(await countOOPIFs(browser)).toBe(1);
});
it.fail(CHROMIUM)('should get the proper viewport', async({browser, page, server}) => {
it.fail(true)('should get the proper viewport', async({sppBrowser, sppPage, server}) => {
const browser = sppBrowser;
const page = sppPage;
expect(page.viewportSize()).toEqual({width: 1280, height: 720});
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
@ -89,7 +106,9 @@ describe('OOPIF', function() {
expect(await oopif.evaluate(() => matchMedia('(device-height: 456px)').matches)).toBe(true);
expect(await oopif.evaluate(() => 'ontouchstart' in window)).toBe(false);
});
it('should expose function', async({browser, page, server}) => {
it('should expose function', async({sppBrowser, sppPage, server}) => {
const browser = sppBrowser;
const page = sppPage;
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
expect(await countOOPIFs(browser)).toBe(1);
@ -100,7 +119,9 @@ describe('OOPIF', function() {
});
expect(result).toBe(36);
});
it('should emulate media', async({browser, page, server}) => {
it('should emulate media', async({sppBrowser, sppPage, server}) => {
const browser = sppBrowser;
const page = sppPage;
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
expect(await countOOPIFs(browser)).toBe(1);
@ -109,7 +130,10 @@ describe('OOPIF', function() {
await page.emulateMedia({ colorScheme: 'dark' });
expect(await oopif.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches)).toBe(true);
});
it('should emulate offline', async({browser, page, context, server}) => {
it('should emulate offline', async({sppBrowser, sppPage, sppContext, server}) => {
const browser = sppBrowser;
const context = sppContext;
const page = sppPage;
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
expect(await countOOPIFs(browser)).toBe(1);
@ -118,7 +142,8 @@ describe('OOPIF', function() {
await context.setOffline(true);
expect(await oopif.evaluate(() => navigator.onLine)).toBe(false);
});
it('should support context options', async({browser, server}) => {
it('should support context options', async({sppBrowser, server, playwright}) => {
const browser = sppBrowser;
const iPhone = playwright.devices['iPhone 6']
const context = await browser.newContext({ ...iPhone, timezoneId: 'America/Jamaica', locale: 'fr-CH', userAgent: 'UA' });
const page = await context.newPage();
@ -139,7 +164,9 @@ describe('OOPIF', function() {
await context.close();
});
it('should respect route', async({browser, page, server}) => {
it('should respect route', async({sppBrowser, sppPage, server}) => {
const browser = sppBrowser;
const page = sppPage;
let intercepted = false;
await page.route('**/digits/0.png', route => {
intercepted = true;
@ -150,19 +177,25 @@ describe('OOPIF', function() {
expect(await countOOPIFs(browser)).toBe(1);
expect(intercepted).toBe(true);
});
it('should take screenshot', async({browser, page, server, golden}) => {
it('should take screenshot', async({sppBrowser, sppPage, server}) => {
const browser = sppBrowser;
const page = sppPage;
await page.setViewportSize({width: 500, height: 500});
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
expect(await countOOPIFs(browser)).toBe(1);
expect(await page.screenshot()).toBeGolden(golden('screenshot-oopif.png'));
expect(await page.screenshot()).toBeGolden('screenshot-oopif.png');
});
it('should load oopif iframes with subresources and request interception', async function({browser, page, server, context}) {
it('should load oopif iframes with subresources and request interception', async function({sppBrowser, sppPage, server, context}) {
const browser = sppBrowser;
const page = sppPage;
await page.route('**/*', route => route.continue());
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(await countOOPIFs(browser)).toBe(1);
});
it('should report main requests', async function({browser, page, server, context}) {
it('should report main requests', async function({sppBrowser, sppPage, server}) {
const browser = sppBrowser;
const page = sppPage;
const requestFrames = [];
page.on('request', r => requestFrames.push(r.frame()));
const finishedFrames = [];
@ -199,7 +232,10 @@ describe('OOPIF', function() {
expect(requestFrames[2]).toBe(grandChild);
expect(finishedFrames[2]).toBe(grandChild);
});
it('should support exposeFunction', async function({browser, page, server, context}) {
it('should support exposeFunction', async function({sppBrowser, sppContext, sppPage, server}) {
const browser = sppBrowser;
const context = sppContext;
const page = sppPage;
await context.exposeFunction('dec', a => a - 1);
await page.exposeFunction('inc', a => a + 1);
await page.goto(server.PREFIX + '/dynamic-oopif.html');
@ -210,7 +246,10 @@ describe('OOPIF', function() {
expect(await page.frames()[0].evaluate(() => dec(3))).toBe(2);
expect(await page.frames()[1].evaluate(() => dec(4))).toBe(3);
});
it('should support addInitScript', async function({browser, page, server, context}) {
it('should support addInitScript', async function({sppBrowser, sppContext, sppPage, server}) {
const browser = sppBrowser;
const context = sppContext;
const page = sppPage;
await context.addInitScript(() => window.bar = 17);
await page.addInitScript(() => window.foo = 42);
await page.goto(server.PREFIX + '/dynamic-oopif.html');
@ -222,7 +261,9 @@ describe('OOPIF', function() {
expect(await page.frames()[1].evaluate(() => window.bar)).toBe(17);
});
// @see https://github.com/microsoft/playwright/issues/1240
it('should click a button when it overlays oopif', async function({browser, page, server, context}) {
it('should click a button when it overlays oopif', async function({sppBrowser, sppPage, server}) {
const browser = sppBrowser;
const page = sppPage;
await page.goto(server.PREFIX + '/button-overlay-oopif.html');
expect(await countOOPIFs(browser)).toBe(1);
await page.click('button');

View file

@ -14,10 +14,10 @@
* limitations under the License.
*/
const {FFOX, CHROMIUM, WEBKIT, CHANNEL, USES_HOOKS} = require('../utils').testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, CHANNEL, USES_HOOKS} = testOptions;
describe('ChromiumBrowserContext.createSession', function() {
it('should work', async function({page, browser, server}) {
describe.skip(!CHROMIUM)('ChromiumBrowserContext.createSession', function() {
it('should work', async function({page}) {
const client = await page.context().newCDPSession(page);
await Promise.all([
@ -27,7 +27,7 @@ describe('ChromiumBrowserContext.createSession', function() {
const foo = await page.evaluate(() => window.foo);
expect(foo).toBe('bar');
});
it('should send events', async function({page, browser, server}) {
it('should send events', async function({page, server}) {
const client = await page.context().newCDPSession(page);
await client.send('Network.enable');
const events = [];
@ -35,7 +35,7 @@ describe('ChromiumBrowserContext.createSession', function() {
await page.goto(server.EMPTY_PAGE);
expect(events.length).toBe(1);
});
it('should enable and disable domains independently', async function({page, browser, server}) {
it('should enable and disable domains independently', async function({page}) {
const client = await page.context().newCDPSession(page);
await client.send('Runtime.enable');
await client.send('Debugger.enable');
@ -52,7 +52,7 @@ describe('ChromiumBrowserContext.createSession', function() {
page.evaluate('//# sourceURL=foo.js')
]);
});
it('should be able to detach session', async function({page, browser, server}) {
it('should be able to detach session', async function({page}) {
const client = await page.context().newCDPSession(page);
await client.send('Runtime.enable');
const evalResponse = await client.send('Runtime.evaluate', {expression: '1 + 2', returnByValue: true});
@ -66,7 +66,7 @@ describe('ChromiumBrowserContext.createSession', function() {
}
expect(error.message).toContain(CHANNEL ? 'Target browser or context has been closed' : 'Session closed.');
});
it('should throw nice errors', async function({page, browser}) {
it('should throw nice errors', async function({page}) {
const client = await page.context().newCDPSession(page);
const error = await theSourceOfTheProblems().catch(error => error);
expect(error.stack).toContain('theSourceOfTheProblems');
@ -76,7 +76,7 @@ describe('ChromiumBrowserContext.createSession', function() {
await client.send('ThisCommand.DoesNotExist');
}
});
it('should not break page.close()', async function({browser, server}) {
it('should not break page.close()', async function({browser}) {
const context = await browser.newContext();
const page = await context.newPage();
const session = await page.context().newCDPSession(page);
@ -84,19 +84,19 @@ describe('ChromiumBrowserContext.createSession', function() {
await page.close();
await context.close();
});
it('should detach when page closes', async function({browser, server}) {
it('should detach when page closes', async function({browser}) {
const context = await browser.newContext();
const page = await context.newPage();
const session = await context.newCDPSession(page);
await page.close();
let error;
await session.detach().catch(e => error = e);
expect(error).toBeTruthy('Calling detach on a closed page\'s session should throw');
expect(error).toBeTruthy();
await context.close();
});
});
describe('ChromiumBrowser.newBrowserCDPSession', function() {
it('should work', async function({page, browser, server}) {
describe.skip(!CHROMIUM)('ChromiumBrowser.newBrowserCDPSession', function() {
it('should work', async function({browser}) {
const session = await browser.newBrowserCDPSession();
const version = await session.send('Browser.getVersion');

View file

@ -16,23 +16,16 @@
const fs = require('fs');
const path = require('path');
const {FFOX, CHROMIUM, WEBKIT, OUTPUT_DIR, CHANNEL} = require('../utils').testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, OUTPUT_DIR, CHANNEL} = testOptions;
describe('Chromium.startTracing', function() {
beforeEach(async function(state) {
state.outputFile = path.join(OUTPUT_DIR, `trace-${state.parallelIndex}.json`);
state.browser = await state.browserType.launch(state.defaultBrowserOptions);
state.page = await state.browser.newPage();
});
afterEach(async function(state) {
await state.browser.close();
state.browser = null;
state.page = null;
if (fs.existsSync(state.outputFile)) {
fs.unlinkSync(state.outputFile);
state.outputFile = null;
}
});
registerFixture('outputFile', async ({parallelIndex}, test) => {
const outputFile = path.join(OUTPUT_DIR, `trace-${parallelIndex}.json`);
await test(outputFile);
if (fs.existsSync(outputFile))
fs.unlinkSync(outputFile);
});
describe.skip(!CHROMIUM)('Chromium.startTracing', function() {
it('should output a trace', async({browser, page, server, outputFile}) => {
await browser.startTracing(page, {screenshots: true, path: outputFile});
await page.goto(server.PREFIX + '/grid.html');
@ -46,7 +39,7 @@ describe('Chromium.startTracing', function() {
const traceJson = JSON.parse(fs.readFileSync(outputFile).toString());
expect(traceJson.metadata['trace-config']).toContain('disabled-by-default-v8.cpu_profiler.hires', 'Does not contain expected category');
});
it('should throw if tracing on two pages', async({browser, page, server, outputFile}) => {
it('should throw if tracing on two pages', async({browser, page, outputFile}) => {
await browser.startTracing(page, {path: outputFile});
const newPage = await browser.newPage();
let error = null;
@ -62,7 +55,7 @@ describe('Chromium.startTracing', function() {
const buf = fs.readFileSync(outputFile);
expect(trace.toString()).toEqual(buf.toString(), 'Tracing buffer mismatch');
});
it('should work without options', async({browser, page, server, outputFile}) => {
it('should work without options', async({browser, page, server}) => {
await browser.startTracing(page);
await page.goto(server.PREFIX + '/grid.html');
const trace = await browser.stopTracing();

View file

@ -23,28 +23,63 @@ const removeFolder = require('rimraf');
const mkdtempAsync = util.promisify(fs.mkdtemp);
const removeFolderAsync = util.promisify(removeFolder);
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = utils.testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = testOptions;
registerFixture('downloadsPath', async ({}, test) => {
const downloadsPath = await mkdtempAsync(path.join(os.tmpdir(), 'playwright-test-'));
try {
await test(downloadsPath);
} finally {
await removeFolderAsync(downloadsPath);
}
});
registerFixture('downloadsBrowser', async ({server, browserType, defaultBrowserOptions, downloadsPath}, test) => {
server.setRoute('/download', (req, res) => {
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader('Content-Disposition', 'attachment; filename=file.txt');
res.end(`Hello world`);
});
const browser = await browserType.launch({
...defaultBrowserOptions,
downloadsPath: downloadsPath,
});
try {
await test(browser);
} finally {
await browser.close();
}
});
registerFixture('persistentDownloadsContext', async ({server, browserType, defaultBrowserOptions, downloadsPath}, test) => {
const userDataDir = await mkdtempAsync(path.join(os.tmpdir(), 'playwright-test-'));
server.setRoute('/download', (req, res) => {
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader('Content-Disposition', 'attachment; filename=file.txt');
res.end(`Hello world`);
});
const context = await browserType.launchPersistentContext(
userDataDir,
{
...defaultBrowserOptions,
downloadsPath,
acceptDownloads: true
}
);
const page = context.pages()[0];
page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
try {
await test(context);
} finally {
await context.close();
await state.context.close();
await removeFolderAsync(userDataDir);
}
});
describe('browserType.launch({downloadsPath})', function() {
beforeEach(async(state) => {
state.downloadsPath = await mkdtempAsync(path.join(os.tmpdir(), 'playwright-test-'));
state.server.setRoute('/download', (req, res) => {
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader('Content-Disposition', 'attachment; filename=file.txt');
res.end(`Hello world`);
});
state.browser = await state.browserType.launch({
...state.defaultBrowserOptions,
downloadsPath: state.downloadsPath,
});
});
afterEach(async(state) => {
await state.browser.close();
await removeFolderAsync(state.downloadsPath);
});
it('should keep downloadsPath folder', async({browser, downloadsPath, server}) => {
const page = await browser.newPage();
it('should keep downloadsPath folder', async({downloadsBrowser, downloadsPath, server}) => {
const page = await downloadsBrowser.newPage();
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([
page.waitForEvent('download'),
@ -54,11 +89,11 @@ describe('browserType.launch({downloadsPath})', function() {
expect(download.suggestedFilename()).toBe(`file.txt`);
await download.path().catch(e => error = e);
await page.close();
await browser.close();
await downloadsBrowser.close();
expect(fs.existsSync(downloadsPath)).toBeTruthy();
});
it('should delete downloads when context closes', async({browser, downloadsPath, server}) => {
const page = await browser.newPage({ acceptDownloads: true });
it('should delete downloads when context closes', async({downloadsBrowser, downloadsPath, server}) => {
const page = await downloadsBrowser.newPage({ acceptDownloads: true });
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([
page.waitForEvent('download'),
@ -69,8 +104,8 @@ describe('browserType.launch({downloadsPath})', function() {
await page.close();
expect(fs.existsSync(path)).toBeFalsy();
});
it('should report downloads in downloadsPath folder', async({browser, downloadsPath, server}) => {
const page = await browser.newPage({ acceptDownloads: true });
it('should report downloads in downloadsPath folder', async({downloadsBrowser, downloadsPath, server}) => {
const page = await downloadsBrowser.newPage({ acceptDownloads: true });
await page.setContent(`<a href="${server.PREFIX}/download">download</a>`);
const [ download ] = await Promise.all([
page.waitForEvent('download'),
@ -83,31 +118,8 @@ describe('browserType.launch({downloadsPath})', function() {
});
describe('browserType.launchPersistent({acceptDownloads})', function() {
beforeEach(async(state) => {
state.userDataDir = await mkdtempAsync(path.join(os.tmpdir(), 'playwright-test-'));
state.downloadsPath = await mkdtempAsync(path.join(os.tmpdir(), 'playwright-test-'));
state.server.setRoute('/download', (req, res) => {
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader('Content-Disposition', 'attachment; filename=file.txt');
res.end(`Hello world`);
});
state.context = await state.browserType.launchPersistentContext(
state.userDataDir,
{
...state.defaultBrowserOptions,
downloadsPath: state.downloadsPath,
acceptDownloads: true
});
state.page = state.context.pages()[0];
state.page.setContent(`<a href="${state.server.PREFIX}/download">download</a>`);
});
afterEach(async(state) => {
await state.context.close();
await removeFolderAsync(state.userDataDir);
await removeFolderAsync(state.downloadsPath);
});
it('should accept downloads', async({context, page, downloadsPath, server}) => {
it('should accept downloads', async({persistentDownloadsContext, downloadsPath, server}) => {
const page = persistentDownloadsContext.pages()[0];
const [ download ] = await Promise.all([
page.waitForEvent('download'),
page.click('a')
@ -118,13 +130,14 @@ describe('browserType.launchPersistent({acceptDownloads})', function() {
expect(path.startsWith(downloadsPath)).toBeTruthy();
});
it('should not delete downloads when the context closes', async({page, context}) => {
it('should not delete downloads when the context closes', async({persistentDownloadsContext}) => {
const page = persistentDownloadsContext.pages()[0];
const [ download ] = await Promise.all([
page.waitForEvent('download'),
page.click('a')
]);
const path = await download.path();
await context.close();
await persistentDownloadsContext.close();
expect(fs.existsSync(path)).toBeTruthy();
});
});

View file

@ -17,24 +17,31 @@
const path = require('path');
const config = require('../test.config');
const utils = require('../utils');
const {CHANNEL} = utils.testOptions(browserType);
const electronName = process.platform === 'win32' ? 'electron.cmd' : 'electron';
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();
}
});
describe('Electron', function() {
beforeEach(async (state, testRun) => {
const electronPath = path.join(__dirname, '..', '..', 'node_modules', '.bin', electronName);
state.logger = utils.createTestLogger(config.dumpLogOnFailure, testRun);
state.application = await state.playwright.electron.launch(electronPath, {
args: [path.join(__dirname, 'testApp.js')],
// This is for our own extensive protocol logging, customers don't need it.
logger: state.logger,
});
});
afterEach(async (state, testRun) => {
await state.application.close();
state.logger.setTestRun(null);
});
it('should script application', async ({ application }) => {
const appPath = await application.evaluate(async ({ app }) => app.getAppPath());
expect(appPath).toContain('electron');
@ -118,48 +125,29 @@ describe('Electron', function() {
});
describe('Electron per window', function() {
beforeAll(async state => {
const electronPath = path.join(__dirname, '..', '..', 'node_modules', '.bin', electronName);
state.application = await state.playwright.electron.launch(electronPath, {
args: [path.join(__dirname, 'testApp.js')]
});
it('should click the button', async({window, server}) => {
await window.goto(server.PREFIX + '/input/button.html');
await window.click('button');
expect(await window.evaluate(() => result)).toBe('Clicked');
});
afterAll(async state => {
await state.application.close();
it('should check the box', async({window}) => {
await window.setContent(`<input id='checkbox' type='checkbox'></input>`);
await window.check('input');
expect(await window.evaluate(() => checkbox.checked)).toBe(true);
});
beforeEach(async state => {
state.page = await state.application.newBrowserWindow({ width: 800, height: 600 });
it('should not check the checked box', async({window}) => {
await window.setContent(`<input id='checkbox' type='checkbox' checked></input>`);
await window.check('input');
expect(await window.evaluate(() => checkbox.checked)).toBe(true);
});
afterEach(async state => {
await state.page.close();
});
it('should click the button', async({page, server}) => {
await page.goto(server.PREFIX + '/input/button.html');
await page.click('button');
expect(await page.evaluate(() => result)).toBe('Clicked');
});
it('should check the box', async({page}) => {
await page.setContent(`<input id='checkbox' type='checkbox'></input>`);
await page.check('input');
expect(await page.evaluate(() => checkbox.checked)).toBe(true);
});
it('should not check the checked box', async({page}) => {
await page.setContent(`<input id='checkbox' type='checkbox' checked></input>`);
await page.check('input');
expect(await page.evaluate(() => checkbox.checked)).toBe(true);
});
it('should type into a textarea', async({page, server}) => {
await page.evaluate(() => {
it('should type into a textarea', async({window, server}) => {
await window.evaluate(() => {
const textarea = document.createElement('textarea');
document.body.appendChild(textarea);
textarea.focus();
});
const text = 'Hello world. I am the text that was typed!';
await page.keyboard.type(text);
expect(await page.evaluate(() => document.querySelector('textarea').value)).toBe(text);
await window.keyboard.type(text);
expect(await window.evaluate(() => document.querySelector('textarea').value)).toBe(text);
});
});

View file

@ -14,12 +14,9 @@
* limitations under the License.
*/
const path = require('path');
const utils = require('../utils');
const {makeUserDataDir, removeUserDataDir} = utils;
const {FFOX, CHROMIUM, WEBKIT, WIN} = utils.testOptions(browserType);
const { FFOX } = testOptions;
describe('launcher', function() {
describe.skip(!FFOX)('launcher', function() {
it('should pass firefox user preferences', async({browserType, defaultBrowserOptions}) => {
const browser = await browserType.launch({
...defaultBrowserOptions,

View file

@ -16,7 +16,7 @@
const utils = require('./utils');
const { makeUserDataDir, removeUserDataDir } = utils;
const {FFOX, CHROMIUM, WEBKIT, WIN, MAC} = utils.testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, WIN, MAC} = testOptions;
describe('Headful', function() {
it('should have default url when launching browser', async ({browserType, defaultBrowserOptions}) => {
@ -141,5 +141,6 @@ describe('Headful', function() {
await popup.waitForLoadState();
await popup.waitForFunction(() => window.outerWidth === 500 && window.outerHeight === 450);
await context.close();
await browser.close();
});
});

View file

@ -26,11 +26,14 @@ const { PlaywrightDispatcher } = require('../../lib/rpc/server/playwrightDispatc
const { setUseApiName } = require('../../lib/progress');
module.exports = function registerFixtures(global) {
global.registerWorkerFixture('http_server', async ({}, test) => {
global.registerWorkerFixture('parallelIndex', async ({}, test) => {
await test(process.env.JEST_WORKER_ID - 1);
});
global.registerWorkerFixture('http_server', async ({parallelIndex}, test) => {
const assetsPath = path.join(__dirname, '..', 'assets');
const cachedPath = path.join(__dirname, '..', 'assets', 'cached');
const port = 8907 + (process.env.JEST_WORKER_ID - 1) * 2;
const port = 8907 + parallelIndex * 2;
const server = await TestServer.create(assetsPath, port);
server.enableHTTPCache(cachedPath);
server.PORT = port;

View file

@ -18,7 +18,7 @@
const path = require('path');
const fs = require('fs');
const utils = require('./utils');
const {FFOX, CHROMIUM, WEBKIT, WIN, USES_HOOKS, CHANNEL} = utils.testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, WIN, USES_HOOKS, CHANNEL} = testOptions;
describe('Playwright', function() {
describe('browserType.launch', function() {
@ -44,7 +44,8 @@ describe('Playwright', function() {
await browserType.launch(options).catch(e => waitError = e);
expect(waitError.message).toContain('can not specify page');
});
it('should reject if launched browser fails immediately', async({browserType, defaultBrowserOptions}) => {
it.fail(true)('should reject if launched browser fails immediately', async({browserType, defaultBrowserOptions}) => {
// I'm getting ENCONRESET on this one.
const options = Object.assign({}, defaultBrowserOptions, {executablePath: path.join(__dirname, 'assets', 'dummy_bad_browser_executable.js')});
let waitError = null;
await browserType.launch(options).catch(e => waitError = e);
@ -104,14 +105,14 @@ describe('Playwright', function() {
});
describe('Top-level requires', function() {
it('should require top-level Errors', async() => {
it('should require top-level Errors', async({playwright}) => {
const Errors = require(path.join(utils.projectRoot(), '/lib/errors.js'));
expect(Errors.TimeoutError).toBe(playwright.errors.TimeoutError);
expect(String(Errors.TimeoutError)).toContain('TimeoutError');
});
it('should require top-level DeviceDescriptors', async() => {
it('should require top-level DeviceDescriptors', async({playwright}) => {
const Devices = require(path.join(utils.projectRoot(), '/lib/deviceDescriptors.js')).DeviceDescriptors;
expect(Devices['iPhone 6']).toBeTruthy();
expect(Devices['iPhone 6']).toBe(playwright.devices['iPhone 6']);
expect(Devices['iPhone 6']).toEqual(playwright.devices['iPhone 6']);
});
});

View file

@ -16,7 +16,7 @@
const fs = require('fs');
const path = require('path');
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = require('./utils').testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, CHANNEL} = testOptions;
describe('Logger', function() {
it('should log', async({browserType, defaultBrowserOptions}) => {

View file

@ -15,7 +15,7 @@
* limitations under the License.
*/
const {FFOX, CHROMIUM, WEBKIT} = require('./utils').testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT} = testOptions;
describe('BrowserContext', function() {
it('should work across sessions', async ({browserType, defaultBrowserOptions}) => {

View file

@ -16,7 +16,7 @@
const socks = require('socksv5');
const utils = require('./utils');
const {FFOX, CHROMIUM, WEBKIT, MAC} = utils.testOptions(browserType);
const {FFOX, CHROMIUM, WEBKIT, MAC} = testOptions;
describe('HTTP Proxy', () => {
it('should use proxy', async ({browserType, defaultBrowserOptions, server}) => {

View file

@ -69,59 +69,13 @@ module.exports = {
setupTestRunner,
specs: [
{
files: [
'./chromium/chromium.spec.js',
'./chromium/session.spec.js',
],
browsers: ['chromium'],
title: '[Chromium]',
environments: [customEnvironment, 'page'],
},
{
files: [
'./defaultbrowsercontext.spec.js',
'./downloadsPath.spec.js',
'./fixtures.spec.js',
'./launcher.spec.js',
'./logger.spec.js',
'./headful.spec.js',
'./multiclient.spec.js',
'./proxy.spec.js',
],
environments: [customEnvironment],
},
{
files: [
'./chromium/launcher.spec.js',
'./chromium/oopif.spec.js',
'./chromium/tracing.spec.js',
],
browsers: ['chromium'],
title: '[Chromium]',
environments: [customEnvironment],
},
{
files: [
'./firefox/launcher.spec.js',
],
browsers: ['firefox'],
title: '[Firefox]',
environments: [customEnvironment],
},
{
files: [
'./electron/electron.spec.js',
],
browsers: ['chromium'],
title: '[Electron]',
environments: [customEnvironment],
},
{
files: [
'./apicoverage.spec.js',