diff --git a/src/webkit/wkExecutionContext.ts b/src/webkit/wkExecutionContext.ts index 0ba8733e02..c09847e22c 100644 --- a/src/webkit/wkExecutionContext.ts +++ b/src/webkit/wkExecutionContext.ts @@ -147,8 +147,8 @@ const contextDestroyedResult = { function potentiallyUnserializableValue(remoteObject: Protocol.Runtime.RemoteObject): any { const value = remoteObject.value; - const unserializableValue = remoteObject.type === 'number' && value === null ? remoteObject.description : undefined; - return unserializableValue ? js.parseUnserializableValue(unserializableValue) : value; + const isUnserializable = remoteObject.type === 'number' && ['NaN', '-Infinity', 'Infinity', '-0'].includes(remoteObject.description!); + return isUnserializable ? js.parseUnserializableValue(remoteObject.description!) : value; } function rewriteError(error: Error): Error { diff --git a/test/capabilities.spec.js b/test/capabilities.jest.js similarity index 95% rename from test/capabilities.spec.js rename to test/capabilities.jest.js index 1c13bbb92c..f4b336b093 100644 --- a/test/capabilities.spec.js +++ b/test/capabilities.jest.js @@ -14,7 +14,7 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, WIN, LINUX} = require('./utils').testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, WIN, LINUX} = testOptions; describe('Capabilities', function() { it.fail(WEBKIT && WIN)('Web Assembly should work', async function({page, server}) { diff --git a/test/emulation.jest.js b/test/emulation.jest.js index 30eb2f22db..b719d94777 100644 --- a/test/emulation.jest.js +++ b/test/emulation.jest.js @@ -584,8 +584,8 @@ describe('focus', function() { page.screenshot(), page2.screenshot(), ]); - expect(screenshots[0]).toMatchImageSnapshot('screenshot-sanity'); - expect(screenshots[1]).toMatchImageSnapshot('grid-cell-0'); + expect(screenshots[0]).toBeGolden('screenshot-sanity.png'); + expect(screenshots[1]).toBeGolden('grid-cell-0.png'); }); it('should change focused iframe', async({page, server}) => { await page.goto(server.EMPTY_PAGE); diff --git a/test/geolocation.spec.js b/test/geolocation.jest.js similarity index 98% rename from test/geolocation.spec.js rename to test/geolocation.jest.js index bc607f56f2..ba7ded4fe4 100644 --- a/test/geolocation.spec.js +++ b/test/geolocation.jest.js @@ -15,7 +15,7 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT} = require('./utils').testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT} = testOptions; describe('Overrides.setGeolocation', function() { it('should work', async({page, server, context}) => { diff --git a/test/golden-chromium/grid-cell-0-snap.png b/test/golden-chromium/grid-cell-0-snap.png deleted file mode 100644 index ff282e989b..0000000000 Binary files a/test/golden-chromium/grid-cell-0-snap.png and /dev/null differ diff --git a/test/golden-chromium/screenshot-sanity-snap.png b/test/golden-chromium/screenshot-sanity-snap.png deleted file mode 100644 index ecab61fe17..0000000000 Binary files a/test/golden-chromium/screenshot-sanity-snap.png and /dev/null differ diff --git a/test/golden-firefox/grid-cell-0-snap.png b/test/golden-firefox/grid-cell-0-snap.png deleted file mode 100644 index 4677bdbc4f..0000000000 Binary files a/test/golden-firefox/grid-cell-0-snap.png and /dev/null differ diff --git a/test/golden-firefox/screenshot-sanity-snap.png b/test/golden-firefox/screenshot-sanity-snap.png deleted file mode 100644 index ecab61fe17..0000000000 Binary files a/test/golden-firefox/screenshot-sanity-snap.png and /dev/null differ diff --git a/test/golden-webkit/grid-cell-0-snap.png b/test/golden-webkit/grid-cell-0-snap.png deleted file mode 100644 index 5ae546557b..0000000000 Binary files a/test/golden-webkit/grid-cell-0-snap.png and /dev/null differ diff --git a/test/golden-webkit/screenshot-sanity-snap.png b/test/golden-webkit/screenshot-sanity-snap.png deleted file mode 100644 index ecab61fe17..0000000000 Binary files a/test/golden-webkit/screenshot-sanity-snap.png and /dev/null differ diff --git a/test/input.spec.js b/test/input.jest.js similarity index 98% rename from test/input.spec.js rename to test/input.jest.js index 3dc0e0c4f3..af9aa65fa8 100644 --- a/test/input.spec.js +++ b/test/input.jest.js @@ -20,7 +20,6 @@ const fs = require('fs'); const formidable = require('formidable'); const FILE_TO_UPLOAD = path.join(__dirname, '/assets/file-to-upload.txt'); -const {FFOX, CHROMIUM, WEBKIT} = require('./utils').testOptions(browserType); describe('input', function() { it('should upload the file', async({page, server}) => { @@ -85,18 +84,18 @@ describe('Page.waitForFileChooser', function() { ]); expect(chooser).toBeTruthy(); }); - it('should respect timeout', async({page, server}) => { + it('should respect timeout', async({page, playwright}) => { let error = null; await page.waitForEvent('filechooser', {timeout: 1}).catch(e => error = e); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); - it('should respect default timeout when there is no custom timeout', async({page, server}) => { + it('should respect default timeout when there is no custom timeout', async({page, playwright}) => { page.setDefaultTimeout(1); let error = null; await page.waitForEvent('filechooser').catch(e => error = e); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); - it('should prioritize exact timeout over default timeout', async({page, server}) => { + it('should prioritize exact timeout over default timeout', async({page, playwright}) => { page.setDefaultTimeout(0); let error = null; await page.waitForEvent('filechooser', {timeout: 1}).catch(e => error = e); diff --git a/test/interception.spec.js b/test/interception.jest.js similarity index 98% rename from test/interception.spec.js rename to test/interception.jest.js index 37119daab7..431aefa8b1 100644 --- a/test/interception.spec.js +++ b/test/interception.jest.js @@ -19,7 +19,7 @@ const fs = require('fs'); const path = require('path'); const { helper } = require('../lib/helper'); const vm = require('vm'); -const {FFOX, CHROMIUM, WEBKIT} = require('./utils').testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, HEADLESS} = testOptions; describe('Page.route', function() { it('should intercept', async({page, server}) => { @@ -565,7 +565,7 @@ describe('Request.fulfill', function() { expect(response.statusText()).toBe('Unprocessable Entity'); expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!'); }); - it.skip(FFOX && !HEADLESS)('should allow mocking binary responses', async({page, server, golden}) => { + it.skip(FFOX && !HEADLESS)('should allow mocking binary responses', async({page, server}) => { // Firefox headful produces a different image. await page.route('**/*', route => { const imageBuffer = fs.readFileSync(path.join(__dirname, 'assets', 'pptr.png')); @@ -581,9 +581,9 @@ describe('Request.fulfill', function() { return new Promise(fulfill => img.onload = fulfill); }, server.PREFIX); const img = await page.$('img'); - expect(await img.screenshot()).toBeGolden(golden('mock-binary-response.png')); + expect(await img.screenshot()).toBeGolden('mock-binary-response.png'); }); - it.skip(FFOX && !HEADLESS)('should allow mocking svg with charset', async({page, server, golden}) => { + it.skip(FFOX && !HEADLESS)('should allow mocking svg with charset', async({page, server}) => { // Firefox headful produces a different image. await page.route('**/*', route => { route.fulfill({ @@ -598,9 +598,9 @@ describe('Request.fulfill', function() { return new Promise((f, r) => { img.onload = f; img.onerror = r; }); }, server.PREFIX); const img = await page.$('img'); - expect(await img.screenshot()).toBeGolden(golden('mock-svg.png')); + expect(await img.screenshot()).toBeGolden('mock-svg.png'); }); - it('should work with file path', async({page, server, golden}) => { + it('should work with file path', async({page, server}) => { await page.route('**/*', route => route.fulfill({ contentType: 'shouldBeIgnored', path: path.join(__dirname, 'assets', 'pptr.png') })); await page.evaluate(PREFIX => { const img = document.createElement('img'); @@ -609,7 +609,7 @@ describe('Request.fulfill', function() { return new Promise(fulfill => img.onload = fulfill); }, server.PREFIX); const img = await page.$('img'); - expect(await img.screenshot()).toBeGolden(golden('mock-binary-response.png')); + expect(await img.screenshot()).toBeGolden('mock-binary-response.png'); }); it('should stringify intercepted request response headers', async({page, server}) => { await page.route('**/*', route => { @@ -746,7 +746,7 @@ describe('service worker', function() { }); describe('glob', function() { - it('should work with glob', async({newPage, httpsServer}) => { + it('should work with glob', async() => { expect(helper.globToRegex('**/*.js').test('https://localhost:8080/foo.js')).toBeTruthy(); expect(helper.globToRegex('**/*.css').test('https://localhost:8080/foo.js')).toBeFalsy(); expect(helper.globToRegex('*.js').test('https://localhost:8080/foo.js')).toBeFalsy(); diff --git a/test/jest/fixtures.js b/test/jest/fixtures.js index b80ce5554c..ba6b8edcb6 100644 --- a/test/jest/fixtures.js +++ b/test/jest/fixtures.js @@ -63,6 +63,7 @@ module.exports = function registerFixtures(global) { }); global.registerWorkerFixture('playwright', async({}, test) => { + Error.stackTraceLimit = 15; if (process.env.PWCHANNEL) { setUseApiName(false); const connection = new Connection(); @@ -122,14 +123,24 @@ module.exports = function registerFixtures(global) { global.registerWorkerFixture('browser', async ({browserType, defaultBrowserOptions}, test) => { const browser = await browserType.launch(defaultBrowserOptions); - await test(browser); - await browser.close(); + try { + await test(browser); + if (browser.contexts().length !== 0) { + console.warn(`\nWARNING: test did not close all created contexts! ${new Error().stack}\n`); + await Promise.all(browser.contexts().map(context => context.close())); + } + } finally { + await browser.close(); + } }); global.registerFixture('context', async ({browser}, test) => { const context = await browser.newContext(); - await test(context); - await context.close(); + try { + await test(context); + } finally { + await context.close(); + } }); global.registerFixture('page', async ({context}, test) => { diff --git a/test/jest/playwrightEnvironment.js b/test/jest/playwrightEnvironment.js index 1520e58513..fe58205c84 100644 --- a/test/jest/playwrightEnvironment.js +++ b/test/jest/playwrightEnvironment.js @@ -16,10 +16,10 @@ const NodeEnvironment = require('jest-environment-node'); const registerFixtures = require('./fixtures'); -const { toMatchImageSnapshot: jestImageSnapshot } = require('jest-image-snapshot'); const os = require('os'); const path = require('path'); const platform = os.platform(); +const GoldenUtils = require('../../utils/testrunner/GoldenUtils'); const browserName = process.env.BROWSER || 'chromium'; @@ -37,6 +37,9 @@ class PlaywrightEnvironment extends NodeEnvironment { testOptions.USES_HOOKS = process.env.PWCHANNEL === 'wire'; testOptions.CHANNEL = !!process.env.PWCHANNEL; testOptions.HEADLESS = !!valueFromEnv('HEADLESS', true); + testOptions.ASSETS_DIR = path.join(__dirname, '..', 'assets'); + testOptions.GOLDEN_DIR = path.join(__dirname, '..', 'golden-' + browserName); + testOptions.OUTPUT_DIR = path.join(__dirname, '..', 'output-' + browserName); this.global.testOptions = testOptions; this.global.registerFixture = (name, fn) => { @@ -86,14 +89,15 @@ class PlaywrightEnvironment extends NodeEnvironment { this.global.it.fail = this.global.it.skip; this.global.it.slow = () => this.global.it; - function toMatchImageSnapshot(received, fileName) { - return jestImageSnapshot.call(this, received, { - customDiffConfig: { threshold: 0.2 }, - customSnapshotsDir: path.join(__dirname, '..', `golden-${browserName}`), - customSnapshotIdentifier: fileName + const testOptions = this.global.testOptions; + function toBeGolden(received, goldenName) { + return GoldenUtils.compare(received, { + goldenPath: testOptions.GOLDEN_DIR, + outputPath: testOptions.OUTPUT_DIR, + goldenName }); }; - this.global.expect.extend({ toMatchImageSnapshot }); + this.global.expect.extend({ toBeGolden }); } if (event.name === 'test_start') { const fn = event.test.fn; @@ -196,7 +200,7 @@ class FixturePool { const params = {}; for (const n of names) params[n] = this.instances.get(n).value; - await fn(params); + return fn(params); } } diff --git a/test/jest/setup.js b/test/jest/setup.js index 18956a616e..bcb4f4bb20 100644 --- a/test/jest/setup.js +++ b/test/jest/setup.js @@ -14,5 +14,15 @@ * limitations under the License. */ +const fs = require('fs'); +const path = require('path'); +const rm = require('rimraf').sync; + +const browserName = process.env.BROWSER || 'chromium'; + module.exports = async function setup() { + const OUTPUT_DIR = path.join(__dirname, '..', 'output-' + browserName); + if (fs.existsSync(OUTPUT_DIR)) + rm(OUTPUT_DIR); + fs.mkdirSync(OUTPUT_DIR, { recursive: true }); }; diff --git a/test/jshandle.spec.js b/test/jshandle.jest.js similarity index 98% rename from test/jshandle.spec.js rename to test/jshandle.jest.js index 62a011fa68..ca714432c7 100644 --- a/test/jshandle.spec.js +++ b/test/jshandle.jest.js @@ -15,7 +15,7 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT} = require('./utils').testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT} = testOptions; describe('Page.evaluateHandle', function() { it('should work', async({page, server}) => { @@ -164,8 +164,8 @@ describe('JSHandle.jsonValue', function() { }); it('should work with dates', async({page, server}) => { const dateHandle = await page.evaluateHandle(() => new Date('2017-09-26T00:00:00.000Z')); - const json = await dateHandle.jsonValue(); - expect(json instanceof Date).toBeTruthy(); + const date = await dateHandle.jsonValue(); + expect(date.toJSON()).toBe('2017-09-26T00:00:00.000Z'); }); it('should throw for circular objects', async({page, server}) => { const windowHandle = await page.evaluateHandle('window'); @@ -231,7 +231,7 @@ describe('JSHandle.asElement', function() { }); it('should work with nullified Node', async({page, server}) => { await page.setContent('
test
'); - await page.evaluate(() => delete Node); + await page.evaluate('delete Node'); const handle = await page.evaluateHandle(() => document.querySelector('section')); const element = handle.asElement(); expect(element).not.toBe(null); diff --git a/test/keyboard.spec.ts b/test/keyboard.jest.js similarity index 98% rename from test/keyboard.spec.ts rename to test/keyboard.jest.js index 81b11e44bd..600f06ac88 100644 --- a/test/keyboard.spec.ts +++ b/test/keyboard.jest.js @@ -14,10 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import utils from './utils'; -import type { Page } from '..'; -const {FFOX, WEBKIT, CHROMIUM, MAC} = utils.testOptions(browserType); +const utils = require('./utils'); + +const {FFOX, WEBKIT, CHROMIUM, MAC} = testOptions; + describe('Keyboard', function() { it('should type into a textarea', async ({page, server}) => { await page.evaluate(() => { @@ -69,7 +70,7 @@ describe('Keyboard', function() { await page.focus('textarea'); page.on('console', m => console.log(m.text())); const events = await page.evaluateHandle(() => { - const events: string[] = []; + const events = []; document.addEventListener('keydown', e => events.push(e.type)); document.addEventListener('keyup', e => events.push(e.type)); document.addEventListener('keypress', e => events.push(e.type)); @@ -375,7 +376,7 @@ describe('Keyboard', function() { }); }); -async function captureLastKeydown(page: Page) { +async function captureLastKeydown(page) { const lastEvent = await page.evaluateHandle(() => { const lastEvent = { repeat: false, @@ -392,7 +393,7 @@ async function captureLastKeydown(page: Page) { lastEvent.code = e.code; lastEvent.metaKey = e.metaKey; // keyIdentifier only exists in WebKit, and isn't in TypeScript's lib. - lastEvent.keyIdentifier = 'keyIdentifier' in e && (e as any).keyIdentifier; + lastEvent.keyIdentifier = 'keyIdentifier' in e && e.keyIdentifier; }, true); return lastEvent; }); diff --git a/test/mouse.spec.js b/test/mouse.jest.js similarity index 98% rename from test/mouse.spec.js rename to test/mouse.jest.js index 071890fee3..1ec680ff31 100644 --- a/test/mouse.spec.js +++ b/test/mouse.jest.js @@ -15,7 +15,7 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, MAC, WIN} = require('./utils').testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, MAC, WIN} = testOptions; function dimensions() { const rect = document.querySelector('textarea').getBoundingClientRect(); diff --git a/test/navigation.spec.js b/test/navigation.jest.js similarity index 99% rename from test/navigation.spec.js rename to test/navigation.jest.js index 999e11ac7e..5201b83376 100644 --- a/test/navigation.spec.js +++ b/test/navigation.jest.js @@ -18,7 +18,7 @@ const utils = require('./utils'); const path = require('path'); const url = require('url'); -const {FFOX, CHROMIUM, WEBKIT, ASSETS_DIR, MAC, WIN, CHANNEL} = utils.testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, ASSETS_DIR, MAC, WIN} = testOptions; describe('Page.goto', function() { it('should work', async({page, server}) => { @@ -193,7 +193,7 @@ describe('Page.goto', function() { else expect(error.message).toContain('NS_ERROR_CONNECTION_REFUSED'); }); - it('should fail when exceeding maximum navigation timeout', async({page, server}) => { + it('should fail when exceeding maximum navigation timeout', async({page, server, playwright}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; @@ -202,7 +202,7 @@ describe('Page.goto', function() { expect(error.message).toContain(server.PREFIX + '/empty.html'); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); - it('should fail when exceeding default maximum navigation timeout', async({page, server}) => { + it('should fail when exceeding default maximum navigation timeout', async({page, server, playwright}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; @@ -213,7 +213,7 @@ describe('Page.goto', function() { expect(error.message).toContain(server.PREFIX + '/empty.html'); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); - it('should fail when exceeding browser context navigation timeout', async({page, server}) => { + it('should fail when exceeding browser context navigation timeout', async({page, server, playwright}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; @@ -223,7 +223,7 @@ describe('Page.goto', function() { expect(error.message).toContain(server.PREFIX + '/empty.html'); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); - it('should fail when exceeding default maximum timeout', async({page, server}) => { + it('should fail when exceeding default maximum timeout', async({page, server, playwright}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; @@ -234,7 +234,7 @@ describe('Page.goto', function() { expect(error.message).toContain(server.PREFIX + '/empty.html'); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); - it('should fail when exceeding browser context timeout', async({page, server}) => { + it('should fail when exceeding browser context timeout', async({page, server, playwright}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; @@ -244,7 +244,7 @@ describe('Page.goto', function() { expect(error.message).toContain(server.PREFIX + '/empty.html'); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); - it('should prioritize default navigation timeout over default timeout', async({page, server}) => { + it('should prioritize default navigation timeout over default timeout', async({page, server, playwright}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; diff --git a/test/pdf.spec.js b/test/pdf.jest.js similarity index 93% rename from test/pdf.spec.js rename to test/pdf.jest.js index 74f2e763c6..ebd8663579 100644 --- a/test/pdf.spec.js +++ b/test/pdf.jest.js @@ -16,7 +16,7 @@ const fs = require('fs'); const path = require('path'); -const {FFOX, CHROMIUM, WEBKIT, OUTPUT_DIR} = require('./utils').testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, OUTPUT_DIR, HEADLESS} = testOptions; // Printing to pdf is currently only supported in headless chromium. describe.skip(!(HEADLESS && CHROMIUM))('Page.pdf', function() { diff --git a/test/permissions.spec.js b/test/permissions.jest.js similarity index 95% rename from test/permissions.spec.js rename to test/permissions.jest.js index 3b49fed30f..a257b0b3c6 100644 --- a/test/permissions.spec.js +++ b/test/permissions.jest.js @@ -15,7 +15,7 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, LINUX} = require('./utils').testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, LINUX, HEADLESS} = testOptions; // Permissions API is not implemented in WebKit (see https://developer.mozilla.org/en-US/docs/Web/API/Permissions_API) describe.skip(WEBKIT)('Permissions', function() { @@ -85,7 +85,7 @@ describe.skip(WEBKIT)('Permissions', function() { //TODO: flaky // - Linux: https://github.com/microsoft/playwright/pull/1790/checks?check_run_id=587327883 // - Win: https://ci.appveyor.com/project/aslushnikov/playwright/builds/32402536 - it.fail(FFOX).fail(CHROMIUM && !HEADLESS)('should trigger permission onchange', async({page, server, context}) => { + it.fail(FFOX || (CHROMIUM && !HEADLESS))('should trigger permission onchange', async({page, server, context}) => { await page.goto(server.EMPTY_PAGE); await page.evaluate(() => { window['events'] = []; @@ -122,7 +122,7 @@ describe.skip(WEBKIT)('Permissions', function() { expect(await getPermission(otherPage, 'geolocation')).toBe('granted'); await otherContext.close(); }); - it.skip(FFOX).fail(CHROMIUM && !HEADLESS)('should support clipboard read', async({page, server, context, browser}) => { + it.fail(FFOX || (CHROMIUM && !HEADLESS))('should support clipboard read', async({page, server, context, browser}) => { // No such permissions (requires flag) in Firefox await page.goto(server.EMPTY_PAGE); expect(await getPermission(page, 'clipboard-read')).toBe('prompt'); diff --git a/test/queryselector.spec.js b/test/queryselector.jest.js similarity index 99% rename from test/queryselector.spec.js rename to test/queryselector.jest.js index c7f8b46be2..3ba9a67e5a 100644 --- a/test/queryselector.spec.js +++ b/test/queryselector.jest.js @@ -17,7 +17,7 @@ const path = require('path'); const utils = require('./utils'); -const {FFOX, CHROMIUM, WEBKIT, CHANNEL, USES_HOOKS} = utils.testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, CHANNEL, USES_HOOKS} = testOptions; describe('Page.$eval', function() { it('should work with css selector', async({page, server}) => { diff --git a/test/screenshot.spec.js b/test/screenshot.jest.js similarity index 84% rename from test/screenshot.spec.js rename to test/screenshot.jest.js index 2246312197..ca8c6c1f47 100644 --- a/test/screenshot.spec.js +++ b/test/screenshot.jest.js @@ -16,20 +16,20 @@ */ const utils = require('./utils'); -const {FFOX, CHROMIUM, WEBKIT, USES_HOOKS} = utils.testOptions(browserType); +const {FFOX, CHROMIUM, WEBKIT, USES_HOOKS, HEADLESS} = testOptions; const {PNG} = require('pngjs'); // Firefox headful produces a different image. const ffheadful = FFOX && !HEADLESS; describe.skip(ffheadful)('Page.screenshot', function() { - it('should work', async({page, server, golden}) => { + it('should work', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot(); - expect(screenshot).toBeGolden(golden('screenshot-sanity.png')); + expect(screenshot).toBeGolden('screenshot-sanity.png'); }); - it('should clip rect', async({page, server, golden}) => { + it('should clip rect', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot({ @@ -40,9 +40,9 @@ describe.skip(ffheadful)('Page.screenshot', function() { height: 100 } }); - expect(screenshot).toBeGolden(golden('screenshot-clip-rect.png')); + expect(screenshot).toBeGolden('screenshot-clip-rect.png'); }); - it('should clip rect with fullPage', async({page, server, golden}) => { + it('should clip rect with fullPage', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); await page.evaluate(() => window.scrollBy(150, 200)); @@ -55,9 +55,9 @@ describe.skip(ffheadful)('Page.screenshot', function() { height: 100, }, }); - expect(screenshot).toBeGolden(golden('screenshot-clip-rect.png')); + expect(screenshot).toBeGolden('screenshot-clip-rect.png'); }); - it('should clip elements to the viewport', async({page, server, golden}) => { + it('should clip elements to the viewport', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot({ @@ -68,7 +68,7 @@ describe.skip(ffheadful)('Page.screenshot', function() { height: 100 } }); - expect(screenshot).toBeGolden(golden('screenshot-offscreen-clip.png')); + expect(screenshot).toBeGolden('screenshot-offscreen-clip.png'); }); it('should throw on clip outside the viewport', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); @@ -83,7 +83,7 @@ describe.skip(ffheadful)('Page.screenshot', function() { }).catch(error => error); expect(screenshotError.message).toContain('Clipped area is either empty or outside the resulting image'); }); - it('should run in parallel', async({page, server, golden}) => { + it('should run in parallel', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const promises = []; @@ -98,15 +98,15 @@ describe.skip(ffheadful)('Page.screenshot', function() { })); } const screenshots = await Promise.all(promises); - expect(screenshots[1]).toBeGolden(golden('grid-cell-1.png')); + expect(screenshots[1]).toBeGolden('grid-cell-1.png'); }); - it('should take fullPage screenshots', async({page, server, golden}) => { + it('should take fullPage screenshots', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot({ fullPage: true }); - expect(screenshot).toBeGolden(golden('screenshot-grid-fullpage.png')); + expect(screenshot).toBeGolden('screenshot-grid-fullpage.png'); }); it('should restore viewport after fullPage screenshot', async({page, server}) => { await page.setViewportSize({width: 500, height: 500}); @@ -115,7 +115,7 @@ describe.skip(ffheadful)('Page.screenshot', function() { expect(screenshot).toBeInstanceOf(Buffer); await utils.verifyViewport(page, 500, 500); }); - it('should run in parallel in multiple pages', async({page, server, context, golden}) => { + it('should run in parallel in multiple pages', async({page, server, context}) => { const N = 5; const pages = await Promise.all(Array(N).fill(0).map(async() => { const page = await context.newPage(); @@ -127,10 +127,10 @@ describe.skip(ffheadful)('Page.screenshot', function() { promises.push(pages[i].screenshot({ clip: { x: 50 * (i % 2), y: 0, width: 50, height: 50 } })); const screenshots = await Promise.all(promises); for (let i = 0; i < N; ++i) - expect(screenshots[i]).toBeGolden(golden(`grid-cell-${i % 2}.png`)); + expect(screenshots[i]).toBeGolden(`grid-cell-${i % 2}.png`); await Promise.all(pages.map(page => page.close())); }); - it.fail(FFOX)('should allow transparency', async({page, golden}) => { + it.fail(FFOX)('should allow transparency', async({page}) => { await page.setViewportSize({ width: 50, height: 150 }); await page.setContent(`