From 0b1a9ceee2f05f534f0d50079ece172d627a93c7 Mon Sep 17 00:00:00 2001 From: Maja Frydrychowicz Date: Thu, 20 Feb 2020 07:57:15 -0500 Subject: [PATCH] chore: Replace Juggler with Firefox Nightly in CI (#5395) Fixes #5150. --- .cirrus.yml | 9 ---- .travis.yml | 9 ++-- lib/Launcher.js | 4 +- package.json | 1 - test/accessibility.spec.js | 4 +- test/browser.spec.js | 5 +-- test/browsercontext.spec.js | 18 ++++---- test/click.spec.js | 16 ++++---- test/cookies.spec.js | 28 ++++++------- test/defaultbrowsercontext.spec.js | 6 +-- test/dialog.spec.js | 4 +- test/elementhandle.spec.js | 8 ++-- test/emulation.spec.js | 12 +++--- test/evaluation.spec.js | 42 +++++++++---------- test/fixtures.spec.js | 13 ++---- test/frame.spec.js | 20 ++++----- test/ignorehttpserrors.spec.js | 2 +- test/input.spec.js | 2 +- test/jshandle.spec.js | 4 +- test/keyboard.spec.js | 18 ++++---- test/launcher.spec.js | 29 ++++++++----- test/mouse.spec.js | 10 ++--- test/navigation.spec.js | 52 +++++++++++------------ test/network.spec.js | 26 ++++++------ test/page.spec.js | 66 +++++++++++++++--------------- test/puppeteer.spec.js | 10 +---- test/queryselector.spec.js | 24 +++++------ test/requestinterception.spec.js | 26 ++++++------ test/screenshot.spec.js | 24 +++++------ test/target.spec.js | 10 ++--- test/test.js | 19 ++------- test/touchscreen.spec.js | 4 +- test/waittask.spec.js | 20 ++++----- 33 files changed, 259 insertions(+), 286 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index aaaad69f..66028411 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -22,15 +22,6 @@ task: test_doclint_script: npm run test-doclint test_types_script: npm run test-types -task: - matrix: - - name: Firefox Juggler (node8 + linux) - container: - dockerfile: .ci/node8/Dockerfile.linux - xvfb_start_background_script: Xvfb :99 -ac -screen 0 1024x768x24 - install_script: npm install --unsafe-perm && cd experimental/puppeteer-firefox && npm install --unsafe-perm - test_script: npm run fjunit - task: osx_instance: image: high-sierra-base diff --git a/.travis.yml b/.travis.yml index bee3a08c..6658abf2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,11 +15,13 @@ before_install: - "sysctl kernel.unprivileged_userns_clone=1" - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" + - 'if [ "$FIREFOX" = "true" ]; then pyenv shell 3.6; pip3 install --user mozdownload; fi' + - 'if [ "$FIREFOX" = "true" ]; then rm -rf $FIREFOX_HOME; mozdownload -t daily -d $FIREFOX_HOME/latest.tar.bz --log-level DEBUG; fi' + - 'if [ "$FIREFOX" = "true" ]; then cd $FIREFOX_HOME; tar -xvf latest.tar.bz; cd -; ls $FIREFOX_HOME/firefox/firefox; fi' script: - 'if [ "$NODE8" = "true" ]; then npm run lint; fi' - 'if [ "$NODE8" = "true" ]; then npm run coverage; fi' - - 'if [ "$FIREFOX" = "true" ]; then cd experimental/puppeteer-firefox && npm i && cd ../..; fi' - - 'if [ "$FIREFOX" = "true" ]; then npm run fjunit; fi' + - 'if [ "$FIREFOX" = "true" ]; then BINARY=$FIREFOX_HOME/firefox/firefox npm run funit; fi' - 'if [ "$NODE8" = "true" ]; then npm run test-doclint; fi' - 'if [ "$NODE8" = "true" ]; then npm run test-types; fi' - 'if [ "$NODE8" = "true" ]; then npm run bundle; fi' @@ -34,8 +36,9 @@ jobs: - node_js: "8.16.0" env: - FIREFOX=true - - FLAKINESS_DASHBOARD_NAME="Travis Firefox (node8 + linux)" + - FLAKINESS_DASHBOARD_NAME="Travis Firefox Nightly (node8 + linux)" - FLAKINESS_DASHBOARD_BUILD_URL="${TRAVIS_JOB_WEB_URL}" + - FIREFOX_HOME=$TRAVIS_HOME/firefox-latest before_deploy: "npm run apply-next-version" deploy: provider: npm diff --git a/lib/Launcher.js b/lib/Launcher.js index ceb57463..df89588e 100644 --- a/lib/Launcher.js +++ b/lib/Launcher.js @@ -398,6 +398,9 @@ class FirefoxLauncher { else firefoxArguments.push(...args); + if (!firefoxArguments.some(argument => argument.startsWith('--remote-debugging-'))) + firefoxArguments.push('--remote-debugging-port=0'); + let temporaryUserDataDir = null; if (!firefoxArguments.includes('-profile') && !firefoxArguments.includes('--profile')) { @@ -484,7 +487,6 @@ class FirefoxLauncher { */ defaultArgs(options = {}) { const firefoxArguments = [ - '--remote-debugging-port=0', '--no-remote', '--foreground', ]; diff --git a/package.json b/package.json index 5e8bc866..72a24b3d 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ }, "scripts": { "unit": "node test/test.js", - "fjunit": "PUPPETEER_PRODUCT=juggler node test/test.js", "funit": "PUPPETEER_PRODUCT=firefox node test/test.js", "debug-unit": "node --inspect-brk test/test.js", "test-doclint": "node utils/doclint/check_public_api/test/test.js && node utils/doclint/preprocessor/test.js", diff --git a/test/accessibility.spec.js b/test/accessibility.spec.js index 7576ed9b..754afcd2 100644 --- a/test/accessibility.spec.js +++ b/test/accessibility.spec.js @@ -19,7 +19,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { const {it, fit, xit} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe('Accessibility', function() { + describe_fails_ffox('Accessibility', function() { it('should work', async function({page}) { await page.setContent(` @@ -310,7 +310,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { expect(snapshot.children[0]).toEqual(golden); }); - describe_fails_ffox('root option', function() { + describe('root option', function() { it('should work a button', async({page}) => { await page.setContent(``); diff --git a/test/browser.spec.js b/test/browser.spec.js index 17cb2e22..61de5889 100644 --- a/test/browser.spec.js +++ b/test/browser.spec.js @@ -23,10 +23,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR it('should return whether we are in headless', async({browser}) => { const version = await browser.version(); expect(version.length).toBeGreaterThan(0); - if (CHROME) - expect(version.startsWith('Headless')).toBe(headless); - else - expect(version.startsWith('Firefox/')).toBe(true); + expect(version.startsWith('Headless')).toBe(headless); }); }); diff --git a/test/browsercontext.spec.js b/test/browsercontext.spec.js index 012e8c92..5fc0ff69 100644 --- a/test/browsercontext.spec.js +++ b/test/browsercontext.spec.js @@ -18,11 +18,11 @@ const utils = require('./utils'); module.exports.addTests = function({testRunner, expect, puppeteer}) { const {describe, xdescribe, fdescribe} = testRunner; - const {it, fit, xit} = testRunner; + const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; describe('BrowserContext', function() { - it('should have default context', async function({browser, server}) { + it_fails_ffox('should have default context', async function({browser, server}) { expect(browser.browserContexts().length).toBe(1); const defaultContext = browser.browserContexts()[0]; expect(defaultContext.isIncognito()).toBe(false); @@ -31,7 +31,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { expect(browser.defaultBrowserContext()).toBe(defaultContext); expect(error.message).toContain('cannot be closed'); }); - it('should create new incognito context', async function({browser, server}) { + it_fails_ffox('should create new incognito context', async function({browser, server}) { expect(browser.browserContexts().length).toBe(1); const context = await browser.createIncognitoBrowserContext(); expect(context.isIncognito()).toBe(true); @@ -40,7 +40,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { await context.close(); expect(browser.browserContexts().length).toBe(1); }); - it('should close all belonging targets once closing context', async function({browser, server}) { + it_fails_ffox('should close all belonging targets once closing context', async function({browser, server}) { expect((await browser.pages()).length).toBe(1); const context = await browser.createIncognitoBrowserContext(); @@ -51,7 +51,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { await context.close(); expect((await browser.pages()).length).toBe(1); }); - it('window.open should use parent tab context', async function({browser, server}) { + it_fails_ffox('window.open should use parent tab context', async function({browser, server}) { const context = await browser.createIncognitoBrowserContext(); const page = await context.newPage(); await page.goto(server.EMPTY_PAGE); @@ -62,7 +62,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { expect(popupTarget.browserContext()).toBe(context); await context.close(); }); - it('should fire target events', async function({browser, server}) { + it_fails_ffox('should fire target events', async function({browser, server}) { const context = await browser.createIncognitoBrowserContext(); const events = []; context.on('targetcreated', target => events.push('CREATED: ' + target.url())); @@ -78,7 +78,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { ]); await context.close(); }); - it('should wait for a target', async function({browser, server}) { + it_fails_ffox('should wait for a target', async function({browser, server}) { const context = await browser.createIncognitoBrowserContext(); let resolved = false; const targetPromise = context.waitForTarget(target => target.url() === server.EMPTY_PAGE); @@ -96,7 +96,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); await context.close(); }); - it('should isolate localStorage and cookies', async function({browser, server}) { + it_fails_ffox('should isolate localStorage and cookies', async function({browser, server}) { // Create two incognito contexts. const context1 = await browser.createIncognitoBrowserContext(); const context2 = await browser.createIncognitoBrowserContext(); @@ -140,7 +140,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { ]); expect(browser.browserContexts().length).toBe(1); }); - it('should work across sessions', async function({browser, server}) { + it_fails_ffox('should work across sessions', async function({browser, server}) { expect(browser.browserContexts().length).toBe(1); const context = await browser.createIncognitoBrowserContext(); expect(browser.browserContexts().length).toBe(2); diff --git a/test/click.spec.js b/test/click.spec.js index 86b8d8c0..1ec8cf92 100644 --- a/test/click.spec.js +++ b/test/click.spec.js @@ -27,7 +27,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { await page.click('button'); expect(await page.evaluate(() => result)).toBe('Clicked'); }); - it('should click svg', async({page, server}) => { + it_fails_ffox('should click svg', async({page, server}) => { await page.setContent(` @@ -43,7 +43,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { expect(await page.evaluate(() => result)).toBe('Clicked'); }); // @see https://github.com/puppeteer/puppeteer/issues/4281 - it('should click on a span with an inline element inside', async({page, server}) => { + it_fails_ffox('should click on a span with an inline element inside', async({page, server}) => { await page.setContent(`
spacer
'); await utils.attachFrame(page, 'button-test', server.PREFIX + '/input/button.html'); @@ -248,7 +248,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { await frame.click('button'); expect(await frame.evaluate(() => window.result)).toBe('Clicked'); }); - it('should click the button with deviceScaleFactor set', async({page, server}) => { + it_fails_ffox('should click the button with deviceScaleFactor set', async({page, server}) => { await page.setViewport({width: 400, height: 400, deviceScaleFactor: 5}); expect(await page.evaluate(() => window.devicePixelRatio)).toBe(5); await page.setContent('
spacer
'); diff --git a/test/cookies.spec.js b/test/cookies.spec.js index 78397bfc..330ea767 100644 --- a/test/cookies.spec.js +++ b/test/cookies.spec.js @@ -51,7 +51,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(cookies.length).toBe(1); expect(cookies[0].httpOnly).toBe(true); }); - it_fails_ffox('should properly report "Strict" sameSite cookie', async({page, server}) => { + it('should properly report "Strict" sameSite cookie', async({page, server}) => { server.setRoute('/empty.html', (req, res) => { res.setHeader('Set-Cookie', ';SameSite=Strict'); res.end(); @@ -61,7 +61,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(cookies.length).toBe(1); expect(cookies[0].sameSite).toBe('Strict'); }); - it_fails_ffox('should properly report "Lax" sameSite cookie', async({page, server}) => { + it('should properly report "Lax" sameSite cookie', async({page, server}) => { server.setRoute('/empty.html', (req, res) => { res.setHeader('Set-Cookie', ';SameSite=Lax'); res.end(); @@ -104,7 +104,7 @@ module.exports.addTests = function({testRunner, expect}) { }, ]); }); - it('should get cookies from multiple urls', async({page, server}) => { + it_fails_ffox('should get cookies from multiple urls', async({page, server}) => { await page.setCookie({ url: 'https://foo.com', name: 'doggo', @@ -145,7 +145,7 @@ module.exports.addTests = function({testRunner, expect}) { }); describe('Page.setCookie', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ name: 'password', @@ -153,7 +153,7 @@ module.exports.addTests = function({testRunner, expect}) { }); expect(await page.evaluate(() => document.cookie)).toEqual('password=123456'); }); - it('should isolate cookies in browser contexts', async({page, server, browser}) => { + it_fails_ffox('should isolate cookies in browser contexts', async({page, server, browser}) => { const anotherContext = await browser.createIncognitoBrowserContext(); const anotherPage = await anotherContext.newPage(); @@ -173,7 +173,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(cookies2[0].value).toBe('page2value'); await anotherContext.close(); }); - it('should set multiple cookies', async({page, server}) => { + it_fails_ffox('should set multiple cookies', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ name: 'password', @@ -190,7 +190,7 @@ module.exports.addTests = function({testRunner, expect}) { 'password=123456', ]); }); - it('should have |expires| set to |-1| for session cookies', async({page, server}) => { + it_fails_ffox('should have |expires| set to |-1| for session cookies', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ name: 'password', @@ -200,7 +200,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(cookies[0].session).toBe(true); expect(cookies[0].expires).toBe(-1); }); - it('should set cookie with reasonable defaults', async({page, server}) => { + it_fails_ffox('should set cookie with reasonable defaults', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ name: 'password', @@ -219,7 +219,7 @@ module.exports.addTests = function({testRunner, expect}) { session: true }]); }); - it('should set a cookie with a path', async({page, server}) => { + it_fails_ffox('should set a cookie with a path', async({page, server}) => { await page.goto(server.PREFIX + '/grid.html'); await page.setCookie({ name: 'gridcookie', @@ -279,7 +279,7 @@ module.exports.addTests = function({testRunner, expect}) { } expect(error.message).toContain('At least one of the url and domain needs to be specified'); }); - it('should default to setting secure cookie for HTTPS websites', async({page, server}) => { + it_fails_ffox('should default to setting secure cookie for HTTPS websites', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const SECURE_URL = 'https://example.com'; await page.setCookie({ @@ -290,7 +290,7 @@ module.exports.addTests = function({testRunner, expect}) { const [cookie] = await page.cookies(SECURE_URL); expect(cookie.secure).toBe(true); }); - it('should be able to set unsecure cookie for HTTP website', async({page, server}) => { + it_fails_ffox('should be able to set unsecure cookie for HTTP website', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const HTTP_URL = 'http://example.com'; await page.setCookie({ @@ -301,7 +301,7 @@ module.exports.addTests = function({testRunner, expect}) { const [cookie] = await page.cookies(HTTP_URL); expect(cookie.secure).toBe(false); }); - it('should set a cookie on a different domain', async({page, server}) => { + it_fails_ffox('should set a cookie on a different domain', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ url: 'https://www.example.com', @@ -322,7 +322,7 @@ module.exports.addTests = function({testRunner, expect}) { session: true }]); }); - it('should set cookies from a frame', async({page, server}) => { + it_fails_ffox('should set cookies from a frame', async({page, server}) => { await page.goto(server.PREFIX + '/grid.html'); await page.setCookie({name: 'localhost-cookie', value: 'best'}); await page.evaluate(src => { @@ -365,7 +365,7 @@ module.exports.addTests = function({testRunner, expect}) { }); describe('Page.deleteCookie', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ name: 'cookie1', diff --git a/test/defaultbrowsercontext.spec.js b/test/defaultbrowsercontext.spec.js index 903aca44..5e18c793 100644 --- a/test/defaultbrowsercontext.spec.js +++ b/test/defaultbrowsercontext.spec.js @@ -19,7 +19,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe_fails_ffox('DefaultBrowserContext', function() { + describe('DefaultBrowserContext', function() { beforeEach(async state => { state.browser = await puppeteer.launch(defaultBrowserOptions); state.page = await state.browser.newPage(); @@ -46,7 +46,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p session: true }]); }); - it('page.setCookie() should work', async({page, server}) => { + it_fails_ffox('page.setCookie() should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ name: 'username', @@ -65,7 +65,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p session: true }]); }); - it('page.deleteCookie() should work', async({page, server}) => { + it_fails_ffox('page.deleteCookie() should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setCookie({ name: 'cookie1', diff --git a/test/dialog.spec.js b/test/dialog.spec.js index 6ccfb859..1af64433 100644 --- a/test/dialog.spec.js +++ b/test/dialog.spec.js @@ -16,7 +16,7 @@ module.exports.addTests = function({testRunner, expect}) { const {describe, xdescribe, fdescribe} = testRunner; - const {it, fit, xit} = testRunner; + const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; describe('Page.Events.Dialog', function() { @@ -29,7 +29,7 @@ module.exports.addTests = function({testRunner, expect}) { }); await page.evaluate(() => alert('yo')); }); - it('should allow accepting prompts', async({page, server}) => { + it_fails_ffox('should allow accepting prompts', async({page, server}) => { page.on('dialog', dialog => { expect(dialog.type()).toBe('prompt'); expect(dialog.defaultValue()).toBe('yes.'); diff --git a/test/elementhandle.spec.js b/test/elementhandle.spec.js index 3c716508..a2ba620d 100644 --- a/test/elementhandle.spec.js +++ b/test/elementhandle.spec.js @@ -21,7 +21,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe('ElementHandle.boundingBox', function() { + describe_fails_ffox('ElementHandle.boundingBox', function() { it('should work', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); @@ -133,7 +133,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); describe('ElementHandle.contentFrame', function() { - it('should work', async({page,server}) => { + it_fails_ffox('should work', async({page,server}) => { await page.goto(server.EMPTY_PAGE); await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); const elementHandle = await page.$('#frame1'); @@ -184,7 +184,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { const error = await button.click().catch(err => err); expect(error.message).toBe('Node is either not visible or not an HTMLElement'); }); - it('should throw for
elements', async({page, server}) => { + it_fails_ffox('should throw for
elements', async({page, server}) => { await page.setContent('hello
goodbye'); const br = await page.$('br'); const error = await br.click().catch(err => err); @@ -193,7 +193,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); describe('ElementHandle.hover', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { await page.goto(server.PREFIX + '/input/scrollable.html'); const button = await page.$('#button-6'); await button.hover(); diff --git a/test/emulation.spec.js b/test/emulation.spec.js index c196a392..6310061c 100644 --- a/test/emulation.spec.js +++ b/test/emulation.spec.js @@ -36,7 +36,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { await page.setViewport({width: 400, height: 300}); expect(await page.evaluate(() => window.innerWidth)).toBe(400); }); - it('should support touch emulation', async({page, server}) => { + it_fails_ffox('should support touch emulation', async({page, server}) => { await page.goto(server.PREFIX + '/mobile.html'); expect(await page.evaluate(() => 'ontouchstart' in window)).toBe(false); await page.setViewport(iPhone.viewport); @@ -58,14 +58,14 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { return promise; } }); - it('should be detectable by Modernizr', async({page, server}) => { + it_fails_ffox('should be detectable by Modernizr', async({page, server}) => { await page.goto(server.PREFIX + '/detect-touch.html'); expect(await page.evaluate(() => document.body.textContent.trim())).toBe('NO'); await page.setViewport(iPhone.viewport); await page.goto(server.PREFIX + '/detect-touch.html'); expect(await page.evaluate(() => document.body.textContent.trim())).toBe('YES'); }); - it('should detect touch when applying viewport with touches', async({page, server}) => { + it_fails_ffox('should detect touch when applying viewport with touches', async({page, server}) => { await page.setViewport({ width: 800, height: 600, hasTouch: true }); await page.addScriptTag({url: server.PREFIX + '/modernizr.js'}); expect(await page.evaluate(() => Modernizr.touchevents)).toBe(true); @@ -104,7 +104,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { }); describe('Page.emulateMediaType', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { expect(await page.evaluate(() => matchMedia('screen').matches)).toBe(true); expect(await page.evaluate(() => matchMedia('print').matches)).toBe(false); await page.emulateMediaType('print'); @@ -121,8 +121,8 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { }); }); - describe_fails_ffox('Page.emulateMediaFeatures', function() { - it('should work', async({page, server}) => { + describe('Page.emulateMediaFeatures', function() { + it_fails_ffox('should work', async({page, server}) => { await page.emulateMediaFeatures([ { name: 'prefers-reduced-motion', value: 'reduce' }, ]); diff --git a/test/evaluation.spec.js b/test/evaluation.spec.js index 1bc67000..545452d6 100644 --- a/test/evaluation.spec.js +++ b/test/evaluation.spec.js @@ -19,7 +19,7 @@ const utils = require('./utils'); const bigint = typeof BigInt !== 'undefined'; module.exports.addTests = function({testRunner, expect}) { - const {describe, xdescribe, fdescribe} = testRunner; + const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; @@ -32,19 +32,19 @@ module.exports.addTests = function({testRunner, expect}) { const result = await page.evaluate(a => a, BigInt(42)); expect(result).toBe(BigInt(42)); }); - it('should transfer NaN', async({page, server}) => { + it_fails_ffox('should transfer NaN', async({page, server}) => { const result = await page.evaluate(a => a, NaN); expect(Object.is(result, NaN)).toBe(true); }); - it('should transfer -0', async({page, server}) => { + it_fails_ffox('should transfer -0', async({page, server}) => { const result = await page.evaluate(a => a, -0); expect(Object.is(result, -0)).toBe(true); }); - it('should transfer Infinity', async({page, server}) => { + it_fails_ffox('should transfer Infinity', async({page, server}) => { const result = await page.evaluate(a => a, Infinity); expect(Object.is(result, Infinity)).toBe(true); }); - it('should transfer -Infinity', async({page, server}) => { + it_fails_ffox('should transfer -Infinity', async({page, server}) => { const result = await page.evaluate(a => a, -Infinity); expect(Object.is(result, -Infinity)).toBe(true); }); @@ -80,7 +80,7 @@ module.exports.addTests = function({testRunner, expect}) { const result = await page.evaluate(a => a['中文字符'], {'中文字符': 42}); expect(result).toBe(42); }); - it('should throw when evaluation triggers reload', async({page, server}) => { + it_fails_ffox('should throw when evaluation triggers reload', async({page, server}) => { let error = null; await page.evaluate(() => { location.reload(); @@ -100,7 +100,7 @@ module.exports.addTests = function({testRunner, expect}) { await page.goto(server.EMPTY_PAGE); expect(await frameEvaluation).toBe(42); }); - it('should work from-inside an exposed function', async({page, server}) => { + it_fails_ffox('should work from-inside an exposed function', async({page, server}) => { // Setup inpage callback, which calls Page.evaluate await page.exposeFunction('callController', async function(a, b) { return await page.evaluate((a, b) => a * b, a, b); @@ -138,19 +138,19 @@ module.exports.addTests = function({testRunner, expect}) { const result = await page.evaluate(() => BigInt(42)); expect(result).toBe(BigInt(42)); }); - it('should return NaN', async({page, server}) => { + it_fails_ffox('should return NaN', async({page, server}) => { const result = await page.evaluate(() => NaN); expect(Object.is(result, NaN)).toBe(true); }); - it('should return -0', async({page, server}) => { + it_fails_ffox('should return -0', async({page, server}) => { const result = await page.evaluate(() => -0); expect(Object.is(result, -0)).toBe(true); }); - it('should return Infinity', async({page, server}) => { + it_fails_ffox('should return Infinity', async({page, server}) => { const result = await page.evaluate(() => Infinity); expect(Object.is(result, Infinity)).toBe(true); }); - it('should return -Infinity', async({page, server}) => { + it_fails_ffox('should return -Infinity', async({page, server}) => { const result = await page.evaluate(() => -Infinity); expect(Object.is(result, -Infinity)).toBe(true); }); @@ -161,10 +161,10 @@ module.exports.addTests = function({testRunner, expect}) { it('should properly serialize null fields', async({page}) => { expect(await page.evaluate(() => ({a: undefined}))).toEqual({}); }); - it('should return undefined for non-serializable objects', async({page, server}) => { + it_fails_ffox('should return undefined for non-serializable objects', async({page, server}) => { expect(await page.evaluate(() => window)).toBe(undefined); }); - it('should fail for circular object', async({page, server}) => { + it_fails_ffox('should fail for circular object', async({page, server}) => { const result = await page.evaluate(() => { const a = {}; const b = {a}; @@ -193,13 +193,13 @@ module.exports.addTests = function({testRunner, expect}) { const result = await page.evaluate('2 + 5;\n// do some math!'); expect(result).toBe(7); }); - it('should accept element handle as an argument', async({page, server}) => { + it_fails_ffox('should accept element handle as an argument', async({page, server}) => { await page.setContent('
42
'); const element = await page.$('section'); const text = await page.evaluate(e => e.textContent, element); expect(text).toBe('42'); }); - it('should throw if underlying element was disposed', async({page, server}) => { + it_fails_ffox('should throw if underlying element was disposed', async({page, server}) => { await page.setContent('
39
'); const element = await page.$('section'); expect(element).toBeTruthy(); @@ -208,7 +208,7 @@ module.exports.addTests = function({testRunner, expect}) { await page.evaluate(e => e.textContent, element).catch(e => error = e); expect(error.message).toContain('JSHandle is disposed'); }); - it('should throw if elementHandles are from other frames', async({page, server}) => { + it_fails_ffox('should throw if elementHandles are from other frames', async({page, server}) => { await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); const bodyHandle = await page.frames()[1].$('body'); let error = null; @@ -216,7 +216,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(error).toBeTruthy(); expect(error.message).toContain('JSHandles can be evaluated only in the context they were created'); }); - it('should simulate a user gesture', async({page, server}) => { + it_fails_ffox('should simulate a user gesture', async({page, server}) => { const result = await page.evaluate(() => { document.body.appendChild(document.createTextNode('test')); document.execCommand('selectAll'); @@ -224,7 +224,7 @@ module.exports.addTests = function({testRunner, expect}) { }); expect(result).toBe(true); }); - it('should throw a nice error after a navigation', async({page, server}) => { + it_fails_ffox('should throw a nice error after a navigation', async({page, server}) => { const executionContext = await page.mainFrame().executionContext(); await Promise.all([ @@ -255,7 +255,7 @@ module.exports.addTests = function({testRunner, expect}) { }); }); - describe('Page.evaluateOnNewDocument', function() { + describe_fails_ffox('Page.evaluateOnNewDocument', function() { it('should evaluate before anything else on the page', async({page, server}) => { await page.evaluateOnNewDocument(function(){ window.injected = 123; @@ -278,7 +278,7 @@ module.exports.addTests = function({testRunner, expect}) { }); describe('Frame.evaluate', function() { - it('should have different execution contexts', async({page, server}) => { + it_fails_ffox('should have different execution contexts', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); expect(page.frames().length).toBe(2); @@ -287,7 +287,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(await page.frames()[0].evaluate(() => window.FOO)).toBe('foo'); expect(await page.frames()[1].evaluate(() => window.FOO)).toBe('bar'); }); - it('should have correct execution contexts', async({page, server}) => { + it_fails_ffox('should have correct execution contexts', async({page, server}) => { await page.goto(server.PREFIX + '/frames/one-frame.html'); expect(page.frames().length).toBe(2); expect(await page.frames()[0].evaluate(() => document.body.textContent.trim())).toBe(''); diff --git a/test/fixtures.spec.js b/test/fixtures.spec.js index 574b4f3b..102ec49e 100644 --- a/test/fixtures.spec.js +++ b/test/fixtures.spec.js @@ -16,7 +16,7 @@ const path = require('path'); -module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, puppeteer, puppeteerPath, JUGGLER}) { +module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, puppeteer, puppeteerPath}) { const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; @@ -38,16 +38,9 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p const options = Object.assign({}, defaultBrowserOptions, {dumpio: true}); const res = spawn('node', [path.join(__dirname, 'fixtures', 'dumpio.js'), puppeteerPath, JSON.stringify(options)]); - if (JUGGLER) - res.stdout.on('data', data => dumpioData += data.toString('utf8')); - else - res.stderr.on('data', data => dumpioData += data.toString('utf8')); + res.stderr.on('data', data => dumpioData += data.toString('utf8')); await new Promise(resolve => res.on('close', resolve)); - - if (JUGGLER) - expect(dumpioData).toContain('Juggler listening on ws://'); - else - expect(dumpioData).toContain('DevTools listening on ws://'); + expect(dumpioData).toContain('DevTools listening on ws://'); }); it('should close the browser when the node process closes', async({ server }) => { const {spawn, execSync} = require('child_process'); diff --git a/test/frame.spec.js b/test/frame.spec.js index 55d0dd94..fac89dea 100644 --- a/test/frame.spec.js +++ b/test/frame.spec.js @@ -22,7 +22,7 @@ module.exports.addTests = function({testRunner, expect}) { const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; describe('Frame.executionContext', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); expect(page.frames().length).toBe(2); @@ -68,7 +68,7 @@ module.exports.addTests = function({testRunner, expect}) { }); describe('Frame Management', function() { - it('should handle nested frames', async({page, server}) => { + it_fails_ffox('should handle nested frames', async({page, server}) => { await page.goto(server.PREFIX + '/frames/nested-frames.html'); expect(utils.dumpFrames(page.mainFrame())).toEqual([ 'http://localhost:/frames/nested-frames.html', @@ -78,7 +78,7 @@ module.exports.addTests = function({testRunner, expect}) { ' http://localhost:/frames/frame.html (aframe)' ]); }); - it('should send events when frames are manipulated dynamically', async({page, server}) => { + it_fails_ffox('should send events when frames are manipulated dynamically', async({page, server}) => { await page.goto(server.EMPTY_PAGE); // validate frameattached events const attachedFrames = []; @@ -101,7 +101,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(detachedFrames.length).toBe(1); expect(detachedFrames[0].isDetached()).toBe(true); }); - it('should send "framenavigated" when navigating on anchor URLs', async({page, server}) => { + it_fails_ffox('should send "framenavigated" when navigating on anchor URLs', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await Promise.all([ page.goto(server.EMPTY_PAGE + '#foo'), @@ -122,7 +122,7 @@ module.exports.addTests = function({testRunner, expect}) { await page.goto(server.EMPTY_PAGE); expect(hasEvents).toBe(false); }); - it('should detach child frames on navigation', async({page, server}) => { + it_fails_ffox('should detach child frames on navigation', async({page, server}) => { let attachedFrames = []; let detachedFrames = []; let navigatedFrames = []; @@ -142,7 +142,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(detachedFrames.length).toBe(4); expect(navigatedFrames.length).toBe(1); }); - it('should support framesets', async({page, server}) => { + it_fails_ffox('should support framesets', async({page, server}) => { let attachedFrames = []; let detachedFrames = []; let navigatedFrames = []; @@ -162,7 +162,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(detachedFrames.length).toBe(4); expect(navigatedFrames.length).toBe(1); }); - it('should report frame from-inside shadow DOM', async({page, server}) => { + it_fails_ffox('should report frame from-inside shadow DOM', async({page, server}) => { await page.goto(server.PREFIX + '/shadow.html'); await page.evaluate(async url => { const frame = document.createElement('iframe'); @@ -173,7 +173,7 @@ module.exports.addTests = function({testRunner, expect}) { expect(page.frames().length).toBe(2); expect(page.frames()[1].url()).toBe(server.EMPTY_PAGE); }); - it('should report frame.name()', async({page, server}) => { + it_fails_ffox('should report frame.name()', async({page, server}) => { await utils.attachFrame(page, 'theFrameId', server.EMPTY_PAGE); await page.evaluate(url => { const frame = document.createElement('iframe'); @@ -186,14 +186,14 @@ module.exports.addTests = function({testRunner, expect}) { expect(page.frames()[1].name()).toBe('theFrameId'); expect(page.frames()[2].name()).toBe('theFrameName'); }); - it('should report frame.parent()', async({page, server}) => { + it_fails_ffox('should report frame.parent()', async({page, server}) => { await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); await utils.attachFrame(page, 'frame2', server.EMPTY_PAGE); expect(page.frames()[0].parentFrame()).toBe(null); expect(page.frames()[1].parentFrame()).toBe(page.mainFrame()); expect(page.frames()[2].parentFrame()).toBe(page.mainFrame()); }); - it('should report different frame instance when frame re-attaches', async({page, server}) => { + it_fails_ffox('should report different frame instance when frame re-attaches', async({page, server}) => { const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); await page.evaluate(() => { window.frame = document.querySelector('#frame1'); diff --git a/test/ignorehttpserrors.spec.js b/test/ignorehttpserrors.spec.js index aa48f77c..3ca3c072 100644 --- a/test/ignorehttpserrors.spec.js +++ b/test/ignorehttpserrors.spec.js @@ -18,7 +18,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe('ignoreHTTPSErrors', function() { + describe_fails_ffox('ignoreHTTPSErrors', function() { beforeAll(async state => { const options = Object.assign({ignoreHTTPSErrors: true}, defaultBrowserOptions); state.browser = await puppeteer.launch(options); diff --git a/test/input.spec.js b/test/input.spec.js index 90610f9b..6b768983 100644 --- a/test/input.spec.js +++ b/test/input.spec.js @@ -22,7 +22,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe('input', function() { + describe_fails_ffox('input', function() { it('should upload the file', async({page, server}) => { await page.goto(server.PREFIX + '/input/fileupload.html'); const filePath = path.relative(process.cwd(), FILE_TO_UPLOAD); diff --git a/test/jshandle.spec.js b/test/jshandle.spec.js index a7ad8a6a..ac13b5d8 100644 --- a/test/jshandle.spec.js +++ b/test/jshandle.spec.js @@ -139,14 +139,14 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { const element = aHandle.asElement(); expect(element).toBeFalsy(); }); - it('should return ElementHandle for TextNodes', async({page, server}) => { + it_fails_ffox('should return ElementHandle for TextNodes', async({page, server}) => { await page.setContent('
ee!
'); const aHandle = await page.evaluateHandle(() => document.querySelector('div').firstChild); const element = aHandle.asElement(); expect(element).toBeTruthy(); expect(await page.evaluate(e => e.nodeType === HTMLElement.TEXT_NODE, element)); }); - it('should work with nullified Node', async({page, server}) => { + it_fails_ffox('should work with nullified Node', async({page, server}) => { await page.setContent('
test
'); await page.evaluate(() => delete Node); const handle = await page.evaluateHandle(() => document.querySelector('section')); diff --git a/test/keyboard.spec.js b/test/keyboard.spec.js index 8ac68143..1347514b 100644 --- a/test/keyboard.spec.js +++ b/test/keyboard.spec.js @@ -33,7 +33,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { await page.keyboard.type(text); expect(await page.evaluate(() => document.querySelector('textarea').value)).toBe(text); }); - it('should press the metaKey', async({page}) => { + it_fails_ffox('should press the metaKey', async({page}) => { await page.evaluate(() => { window.keyPromise = new Promise(resolve => document.addEventListener('keydown', event => resolve(event.key))); }); @@ -72,7 +72,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { await textarea.press('a', {text: 'ё'}); expect(await page.evaluate(() => document.querySelector('textarea').value)).toBe('ё'); }); - it('should send a character with sendCharacter', async({page, server}) => { + it_fails_ffox('should send a character with sendCharacter', async({page, server}) => { await page.goto(server.PREFIX + '/input/textarea.html'); await page.focus('textarea'); await page.keyboard.sendCharacter('嗨'); @@ -81,7 +81,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { await page.keyboard.sendCharacter('a'); expect(await page.evaluate(() => document.querySelector('textarea').value)).toBe('嗨a'); }); - it('should report shiftKey', async({page, server}) => { + it_fails_ffox('should report shiftKey', async({page, server}) => { await page.goto(server.PREFIX + '/input/keyboard.html'); const keyboard = page.keyboard; const codeForKey = {'Shift': 16, 'Alt': 18, 'Control': 17}; @@ -158,7 +158,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { await page.keyboard.type('Hello World!'); expect(await page.evaluate(() => textarea.value)).toBe('He Wrd!'); }); - it('should specify repeat property', async({page, server}) => { + it_fails_ffox('should specify repeat property', async({page, server}) => { await page.goto(server.PREFIX + '/input/textarea.html'); await page.focus('textarea'); await page.evaluate(() => document.querySelector('textarea').addEventListener('keydown', e => window.lastEvent = e, true)); @@ -176,14 +176,14 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { await page.keyboard.down('a'); expect(await page.evaluate(() => window.lastEvent.repeat)).toBe(false); }); - it('should type all kinds of characters', async({page, server}) => { + it_fails_ffox('should type all kinds of characters', async({page, server}) => { await page.goto(server.PREFIX + '/input/textarea.html'); await page.focus('textarea'); const text = 'This text goes onto two lines.\nThis character is 嗨.'; await page.keyboard.type(text); expect(await page.evaluate('result')).toBe(text); }); - it('should specify location', async({page, server}) => { + it_fails_ffox('should specify location', async({page, server}) => { await page.goto(server.PREFIX + '/input/textarea.html'); await page.evaluate(() => { window.addEventListener('keydown', event => window.keyLocation = event.location, true); @@ -212,12 +212,12 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { error = await page.keyboard.press('😊').catch(e => e); expect(error && error.message).toBe('Unknown key: "😊"'); }); - it('should type emoji', async({page, server}) => { + it_fails_ffox('should type emoji', async({page, server}) => { await page.goto(server.PREFIX + '/input/textarea.html'); await page.type('textarea', '👹 Tokyo street Japan 🇯🇵'); expect(await page.$eval('textarea', textarea => textarea.value)).toBe('👹 Tokyo street Japan 🇯🇵'); }); - it('should type emoji into an iframe', async({page, server}) => { + it_fails_ffox('should type emoji into an iframe', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await utils.attachFrame(page, 'emoji-test', server.PREFIX + '/input/textarea.html'); const frame = page.frames()[1]; @@ -225,7 +225,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { await textarea.type('👹 Tokyo street Japan 🇯🇵'); expect(await frame.$eval('textarea', textarea => textarea.value)).toBe('👹 Tokyo street Japan 🇯🇵'); }); - it('should press the meta key', async({page}) => { + it_fails_ffox('should press the meta key', async({page}) => { await page.evaluate(() => { window.result = null; document.addEventListener('keydown', event => { diff --git a/test/launcher.spec.js b/test/launcher.spec.js index 2ed32670..dc551aed 100644 --- a/test/launcher.spec.js +++ b/test/launcher.spec.js @@ -24,7 +24,7 @@ const statAsync = helper.promisify(fs.stat); const TMP_FOLDER = path.join(os.tmpdir(), 'pptr_tmp_folder-'); const utils = require('./utils'); -module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, puppeteer, CHROME, FFOX, JUGGLER, puppeteerPath}) { +module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, puppeteer, CHROME, FFOX, puppeteerPath}) { const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; @@ -192,6 +192,13 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p expect(puppeteer.defaultArgs()).toContain('--headless'); expect(puppeteer.defaultArgs({headless: false})).not.toContain('--headless'); expect(puppeteer.defaultArgs({userDataDir: 'foo'})).toContain('--user-data-dir=foo'); + } else if (FFOX) { + expect(puppeteer.defaultArgs()).toContain('--headless'); + expect(puppeteer.defaultArgs()).toContain('--no-remote'); + expect(puppeteer.defaultArgs()).toContain('--foreground'); + expect(puppeteer.defaultArgs({headless: false})).not.toContain('--headless'); + expect(puppeteer.defaultArgs({userDataDir: 'foo'})).toContain('--profile'); + expect(puppeteer.defaultArgs({userDataDir: 'foo'})).toContain('foo'); } else { expect(puppeteer.defaultArgs()).toContain('-headless'); expect(puppeteer.defaultArgs({headless: false})).not.toContain('-headless'); @@ -202,10 +209,10 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p it('should report the correct product', async() => { if (CHROME) expect(puppeteer.product).toBe('chrome'); - else if (FFOX && !JUGGLER) + else if (FFOX) expect(puppeteer.product).toBe('firefox'); }); - it('should work with no default arguments', async() => { + it_fails_ffox('should work with no default arguments', async() => { const options = Object.assign({}, defaultBrowserOptions); options.ignoreDefaultArgs = true; const browser = await puppeteer.launch(options); @@ -214,7 +221,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p await page.close(); await browser.close(); }); - it('should filter out ignored default arguments', async() => { + it_fails_ffox('should filter out ignored default arguments', async() => { // Make sure we launch with `--enable-automation` by default. const defaultArgs = puppeteer.defaultArgs(); const browser = await puppeteer.launch(Object.assign({}, defaultBrowserOptions, { @@ -227,7 +234,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p expect(spawnargs.indexOf(defaultArgs[2])).toBe(-1); await browser.close(); }); - it_fails_ffox('should have default URL when launching browser', async function() { + it('should have default URL when launching browser', async function() { const browser = await puppeteer.launch(defaultBrowserOptions); const pages = (await browser.pages()).map(page => page.url()); expect(pages).toEqual(['about:blank']); @@ -267,7 +274,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p expect(page.viewport()).toBe(null); await browser.close(); }); - it('should take fullPage screenshots when defaultViewport is null', async({server}) => { + it_fails_ffox('should take fullPage screenshots when defaultViewport is null', async({server}) => { const options = Object.assign({}, defaultBrowserOptions, { defaultViewport: null }); @@ -305,7 +312,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p remoteBrowser.close(), ]); }); - it('should support ignoreHTTPSErrors option', async({httpsServer}) => { + it_fails_ffox('should support ignoreHTTPSErrors option', async({httpsServer}) => { const originalBrowser = await puppeteer.launch(defaultBrowserOptions); const browserWSEndpoint = originalBrowser.wsEndpoint(); @@ -324,7 +331,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p await page.close(); await browser.close(); }); - it('should be able to reconnect to a disconnected browser', async({server}) => { + it_fails_ffox('should be able to reconnect to a disconnected browser', async({server}) => { const originalBrowser = await puppeteer.launch(defaultBrowserOptions); const browserWSEndpoint = originalBrowser.wsEndpoint(); const page = await originalBrowser.newPage(); @@ -345,7 +352,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p await browser.close(); }); // @see https://github.com/puppeteer/puppeteer/issues/4197#issuecomment-481793410 - it('should be able to connect to the same page simultaneously', async({server}) => { + it_fails_ffox('should be able to connect to the same page simultaneously', async({server}) => { const browserOne = await puppeteer.launch(); const browserTwo = await puppeteer.connect({ browserWSEndpoint: browserOne.wsEndpoint() }); const [page1, page2] = await Promise.all([ @@ -359,7 +366,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p }); describe('Puppeteer.executablePath', function() { - it('should work', async({server}) => { + it_fails_ffox('should work', async({server}) => { const executablePath = puppeteer.executablePath(); expect(fs.existsSync(executablePath)).toBe(true); expect(fs.realpathSync(executablePath)).toBe(executablePath); @@ -379,7 +386,7 @@ module.exports.addTests = function({testRunner, expect, defaultBrowserOptions, p }); describe('Browser target events', function() { - it('should work', async({server}) => { + it_fails_ffox('should work', async({server}) => { const browser = await puppeteer.launch(defaultBrowserOptions); const events = []; browser.on('targetcreated', () => events.push('CREATED')); diff --git a/test/mouse.spec.js b/test/mouse.spec.js index 6c2c9cd9..57d8fd30 100644 --- a/test/mouse.spec.js +++ b/test/mouse.spec.js @@ -55,7 +55,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { expect(event.isTrusted).toBe(true); expect(event.button).toBe(0); }); - it('should resize the textarea', async({page, server}) => { + it_fails_ffox('should resize the textarea', async({page, server}) => { await page.goto(server.PREFIX + '/input/textarea.html'); const {x, y, width, height} = await page.evaluate(dimensions); const mouse = page.mouse; @@ -67,7 +67,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { expect(newDimensions.width).toBe(Math.round(width + 104)); expect(newDimensions.height).toBe(Math.round(height + 104)); }); - it('should select the text with mouse', async({page, server}) => { + it_fails_ffox('should select the text with mouse', async({page, server}) => { await page.goto(server.PREFIX + '/input/textarea.html'); await page.focus('textarea'); const text = 'This is the text that we are going to try to select. Let\'s see how it goes.'; @@ -85,7 +85,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { return textarea.value.substring(textarea.selectionStart, textarea.selectionEnd); })).toBe(text); }); - it('should trigger hover state', async({page, server}) => { + it_fails_ffox('should trigger hover state', async({page, server}) => { await page.goto(server.PREFIX + '/input/scrollable.html'); await page.hover('#button-6'); expect(await page.evaluate(() => document.querySelector('button:hover').id)).toBe('button-6'); @@ -120,7 +120,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { throw new Error(modifiers[modifier] + ' should be false'); } }); - it('should tween mouse movement', async({page, server}) => { + it_fails_ffox('should tween mouse movement', async({page, server}) => { await page.mouse.move(100, 100); await page.evaluate(() => { window.result = []; @@ -138,7 +138,7 @@ module.exports.addTests = function({testRunner, expect, FFOX}) { ]); }); // @see https://crbug.com/929806 - it('should work with mobile viewports and cross process navigations', async({page, server}) => { + it_fails_ffox('should work with mobile viewports and cross process navigations', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setViewport({width: 360, height: 640, isMobile: true}); await page.goto(server.CROSS_PROCESS_PREFIX + '/mobile.html'); diff --git a/test/navigation.spec.js b/test/navigation.spec.js index 5cf8d7b8..934b3976 100644 --- a/test/navigation.spec.js +++ b/test/navigation.spec.js @@ -17,7 +17,7 @@ const utils = require('./utils'); module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { - const {describe, xdescribe, fdescribe} = testRunner; + const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; @@ -26,7 +26,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { await page.goto(server.EMPTY_PAGE); expect(page.url()).toBe(server.EMPTY_PAGE); }); - it('should work with anchor navigation', async({page, server}) => { + it_fails_ffox('should work with anchor navigation', async({page, server}) => { await page.goto(server.EMPTY_PAGE); expect(page.url()).toBe(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE + '#foo'); @@ -44,7 +44,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { const response = await page.goto('about:blank'); expect(response).toBe(null); }); - it('should return response when page changes its URL after load', async({page, server}) => { + it_fails_ffox('should return response when page changes its URL after load', async({page, server}) => { const response = await page.goto(server.PREFIX + '/historyapi.html'); expect(response.status()).toBe(200); }); @@ -55,7 +55,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { }); await page.goto(server.PREFIX + '/frames/one-frame.html'); }); - it('should fail when server returns 204', async({page, server}) => { + it_fails_ffox('should fail when server returns 204', async({page, server}) => { server.setRoute('/empty.html', (req, res) => { res.statusCode = 204; res.end(); @@ -68,11 +68,11 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { else expect(error.message).toContain('NS_BINDING_ABORTED'); }); - it('should navigate to empty page with domcontentloaded', async({page, server}) => { + it_fails_ffox('should navigate to empty page with domcontentloaded', async({page, server}) => { const response = await page.goto(server.EMPTY_PAGE, {waitUntil: 'domcontentloaded'}); expect(response.status()).toBe(200); }); - it('should work when page calls history API in beforeunload', async({page, server}) => { + it_fails_ffox('should work when page calls history API in beforeunload', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.evaluate(() => { window.addEventListener('beforeunload', () => history.replaceState(null, 'initial', window.location.href), false); @@ -88,7 +88,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { const response = await page.goto(server.EMPTY_PAGE, {waitUntil: 'networkidle2'}); expect(response.status()).toBe(200); }); - it('should fail when navigating to bad url', async({page, server}) => { + it_fails_ffox('should fail when navigating to bad url', async({page, server}) => { let error = null; await page.goto('asdfasdf').catch(e => error = e); if (CHROME) @@ -96,7 +96,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { else expect(error.message).toContain('Invalid url'); }); - it('should fail when navigating to bad SSL', async({page, httpsServer}) => { + it_fails_ffox('should fail when navigating to bad SSL', async({page, httpsServer}) => { // Make sure that network events do not emit 'undefined'. // @see https://crbug.com/750469 page.on('request', request => expect(request).toBeTruthy()); @@ -109,7 +109,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { else expect(error.message).toContain('SSL_ERROR_UNKNOWN'); }); - it('should fail when navigating to bad SSL after redirects', async({page, server, httpsServer}) => { + it_fails_ffox('should fail when navigating to bad SSL after redirects', async({page, server, httpsServer}) => { server.setRedirect('/redirect/1.html', '/redirect/2.html'); server.setRedirect('/redirect/2.html', '/empty.html'); let error = null; @@ -119,12 +119,12 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { else expect(error.message).toContain('SSL_ERROR_UNKNOWN'); }); - it_fails_ffox('should throw if networkidle is passed as an option', async({page, server}) => { + it('should throw if networkidle is passed as an option', async({page, server}) => { let error = null; await page.goto(server.EMPTY_PAGE, {waitUntil: 'networkidle'}).catch(err => error = err); expect(error.message).toContain('"networkidle" option is no longer supported'); }); - it('should fail when main resources failed to load', async({page, server}) => { + it_fails_ffox('should fail when main resources failed to load', async({page, server}) => { let error = null; await page.goto('http://localhost:44123/non-existing-url').catch(e => error = e); if (CHROME) @@ -176,7 +176,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { expect(error).toBe(null); expect(loaded).toBe(true); }); - it('should work when navigating to valid url', async({page, server}) => { + it_fails_ffox('should work when navigating to valid url', async({page, server}) => { const response = await page.goto(server.EMPTY_PAGE); expect(response.ok()).toBe(true); }); @@ -184,12 +184,12 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { const response = await page.goto('data:text/html,hello'); expect(response.ok()).toBe(true); }); - it('should work when navigating to 404', async({page, server}) => { + it_fails_ffox('should work when navigating to 404', async({page, server}) => { const response = await page.goto(server.PREFIX + '/not-found'); expect(response.ok()).toBe(false); expect(response.status()).toBe(404); }); - it('should return last response in redirect chain', async({page, server}) => { + it_fails_ffox('should return last response in redirect chain', async({page, server}) => { server.setRedirect('/redirect/1.html', '/redirect/2.html'); server.setRedirect('/redirect/2.html', '/redirect/3.html'); server.setRedirect('/redirect/3.html', server.EMPTY_PAGE); @@ -263,7 +263,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { process.removeListener('warning', warningHandler); expect(warning).toBe(null); }); - it('should not leak listeners during bad navigation', async({page, server}) => { + it_fails_ffox('should not leak listeners during bad navigation', async({page, server}) => { let warning = null; const warningHandler = w => warning = w; process.on('warning', warningHandler); @@ -302,12 +302,12 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { expect(requests.length).toBe(1); expect(requests[0].url()).toBe(server.EMPTY_PAGE); }); - it('should work with self requesting page', async({page, server}) => { + it_fails_ffox('should work with self requesting page', async({page, server}) => { const response = await page.goto(server.PREFIX + '/self-request.html'); expect(response.status()).toBe(200); expect(response.url()).toContain('self-request.html'); }); - it('should fail when navigating and show the url at the error message', async function({page, server, httpsServer}) { + it_fails_ffox('should fail when navigating and show the url at the error message', async function({page, server, httpsServer}) { const url = httpsServer.PREFIX + '/redirect/1.html'; let error = null; try { @@ -317,7 +317,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { } expect(error.message).toContain(url); }); - it('should send referer', async({page, server}) => { + it_fails_ffox('should send referer', async({page, server}) => { const [request1, request2] = await Promise.all([ server.waitForRequest('/grid.html'), server.waitForRequest('/digits/1.png'), @@ -332,7 +332,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { }); describe('Page.waitForNavigation', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const [response] = await Promise.all([ page.waitForNavigation(), @@ -361,7 +361,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { await bothFiredPromise; await navigationPromise; }); - it('should work with clicking on anchor links', async({page, server}) => { + it_fails_ffox('should work with clicking on anchor links', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setContent(`foobar`); const [response] = await Promise.all([ @@ -371,7 +371,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { expect(response).toBe(null); expect(page.url()).toBe(server.EMPTY_PAGE + '#foobar'); }); - it('should work with history.pushState()', async({page, server}) => { + it_fails_ffox('should work with history.pushState()', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setContent(` SPA @@ -386,7 +386,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { expect(response).toBe(null); expect(page.url()).toBe(server.PREFIX + '/wow.html'); }); - it('should work with history.replaceState()', async({page, server}) => { + it_fails_ffox('should work with history.replaceState()', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setContent(` SPA @@ -427,7 +427,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { expect(forwardResponse).toBe(null); expect(page.url()).toBe(server.PREFIX + '/second.html'); }); - it('should work when subframe issues window.stop()', async({page, server}) => { + it_fails_ffox('should work when subframe issues window.stop()', async({page, server}) => { server.setRoute('/frames/style.css', (req, res) => {}); const navigationPromise = page.goto(server.PREFIX + '/frames/one-frame.html'); const frame = await utils.waitEvent(page, 'frameattached'); @@ -444,7 +444,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { }); }); - describe('Page.goBack', function() { + describe_fails_ffox('Page.goBack', function() { it('should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.goto(server.PREFIX + '/grid.html'); @@ -477,7 +477,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { }); }); - describe('Frame.goto', function() { + describe_fails_ffox('Frame.goto', function() { it('should navigate subframes', async({page, server}) => { await page.goto(server.PREFIX + '/frames/one-frame.html'); expect(page.frames()[0].url()).toContain('/frames/one-frame.html'); @@ -527,7 +527,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer, CHROME}) { }); }); - describe('Frame.waitForNavigation', function() { + describe_fails_ffox('Frame.waitForNavigation', function() { it('should work', async({page, server}) => { await page.goto(server.PREFIX + '/frames/one-frame.html'); const frame = page.frames()[1]; diff --git a/test/network.spec.js b/test/network.spec.js index f47611dd..bb19f029 100644 --- a/test/network.spec.js +++ b/test/network.spec.js @@ -30,7 +30,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { await page.goto(server.EMPTY_PAGE); expect(requests.length).toBe(1); }); - it('should fire for iframes', async({page, server}) => { + it_fails_ffox('should fire for iframes', async({page, server}) => { const requests = []; page.on('request', request => !utils.isFavicon(request) && requests.push(request)); await page.goto(server.EMPTY_PAGE); @@ -54,7 +54,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { expect(requests.length).toBe(1); expect(requests[0].frame()).toBe(page.mainFrame()); }); - it('should work for subframe navigation request', async({page, server}) => { + it_fails_ffox('should work for subframe navigation request', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const requests = []; page.on('request', request => !utils.isFavicon(request) && requests.push(request)); @@ -73,7 +73,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Request.headers', function() { + describe_fails_ffox('Request.headers', function() { it('should work', async({page, server}) => { const response = await page.goto(server.EMPTY_PAGE); if (CHROME) @@ -83,7 +83,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Response.headers', function() { + describe_fails_ffox('Response.headers', function() { it('should work', async({page, server}) => { server.setRoute('/empty.html', (req, res) => { res.setHeader('foo', 'bar'); @@ -139,7 +139,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Request.postData', function() { + describe_fails_ffox('Request.postData', function() { it('should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); server.setRoute('/post', (req, res) => res.end()); @@ -155,7 +155,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Response.text', function() { + describe_fails_ffox('Response.text', function() { it('should work', async({page, server}) => { const response = await page.goto(server.PREFIX + '/simple.json'); expect(await response.text()).toBe('{"foo": "bar"}\n'); @@ -212,14 +212,14 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Response.json', function() { + describe_fails_ffox('Response.json', function() { it('should work', async({page, server}) => { const response = await page.goto(server.PREFIX + '/simple.json'); expect(await response.json()).toEqual({foo: 'bar'}); }); }); - describe('Response.buffer', function() { + describe_fails_ffox('Response.buffer', function() { it('should work', async({page, server}) => { const response = await page.goto(server.PREFIX + '/pptr.png'); const imageBuffer = fs.readFileSync(path.join(__dirname, 'assets', 'pptr.png')); @@ -235,7 +235,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Response.statusText', function() { + describe_fails_ffox('Response.statusText', function() { it('should work', async({page, server}) => { server.setRoute('/cool', (req, res) => { res.writeHead(200, 'cool!'); @@ -246,7 +246,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Network Events', function() { + describe_fails_ffox('Network Events', function() { it('Page.Events.Request', async({page, server}) => { const requests = []; page.on('request', request => requests.push(request)); @@ -340,7 +340,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); describe('Request.isNavigationRequest', () => { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { const requests = new Map(); page.on('request', request => requests.set(request.url().split('/').pop(), request)); server.setRedirect('/rrredirect', '/frames/one-frame.html'); @@ -351,7 +351,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { expect(requests.get('script.js').isNavigationRequest()).toBe(false); expect(requests.get('style.css').isNavigationRequest()).toBe(false); }); - it('should work with request interception', async({page, server}) => { + it_fails_ffox('should work with request interception', async({page, server}) => { const requests = new Map(); page.on('request', request => { requests.set(request.url().split('/').pop(), request); @@ -374,7 +374,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Page.setExtraHTTPHeaders', function() { + describe_fails_ffox('Page.setExtraHTTPHeaders', function() { it('should work', async({page, server}) => { await page.setExtraHTTPHeaders({ foo: 'bar' diff --git a/test/page.spec.js b/test/page.spec.js index 50037105..908799f4 100644 --- a/test/page.spec.js +++ b/test/page.spec.js @@ -39,7 +39,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await newPage.close(); expect(await browser.pages()).not.toContain(newPage); }); - it('should run beforeunload if asked for', async({context, server}) => { + it_fails_ffox('should run beforeunload if asked for', async({context, server}) => { const newPage = await context.newPage(); await newPage.goto(server.PREFIX + '/beforeunload.html'); // We have to interact with a page so that 'beforeunload' handlers @@ -56,7 +56,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await dialog.accept(); await pageClosingPromise; }); - it('should *not* run beforeunload by default', async({context, server}) => { + it_fails_ffox('should *not* run beforeunload by default', async({context, server}) => { const newPage = await context.newPage(); await newPage.goto(server.PREFIX + '/beforeunload.html'); // We have to interact with a page so that 'beforeunload' handlers @@ -94,7 +94,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe('Async stacks', () => { + describe_fails_ffox('Async stacks', () => { it('should work', async({page, server}) => { server.setRoute('/empty.html', (req, res) => { res.statusCode = 204; @@ -117,7 +117,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe('Page.Events.Popup', function() { + describe_fails_ffox('Page.Events.Popup', function() { it('should work', async({page}) => { const [popup] = await Promise.all([ new Promise(x => page.once('popup', x)), @@ -175,7 +175,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await page.goto(server.EMPTY_PAGE); expect(await getPermission(page, 'geolocation')).toBe('prompt'); }); - it('should deny permission when not listed', async({page, server, context}) => { + it_fails_ffox('should deny permission when not listed', async({page, server, context}) => { await page.goto(server.EMPTY_PAGE); await context.overridePermissions(server.EMPTY_PAGE, []); expect(await getPermission(page, 'geolocation')).toBe('denied'); @@ -186,19 +186,19 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await context.overridePermissions(server.EMPTY_PAGE, ['foo']).catch(e => error = e); expect(error.message).toBe('Unknown permission: foo'); }); - it('should grant permission when listed', async({page, server, context}) => { + it_fails_ffox('should grant permission when listed', async({page, server, context}) => { await page.goto(server.EMPTY_PAGE); await context.overridePermissions(server.EMPTY_PAGE, ['geolocation']); expect(await getPermission(page, 'geolocation')).toBe('granted'); }); - it('should reset permissions', async({page, server, context}) => { + it_fails_ffox('should reset permissions', async({page, server, context}) => { await page.goto(server.EMPTY_PAGE); await context.overridePermissions(server.EMPTY_PAGE, ['geolocation']); expect(await getPermission(page, 'geolocation')).toBe('granted'); await context.clearPermissionOverrides(); expect(await getPermission(page, 'geolocation')).toBe('prompt'); }); - it('should trigger permission onchange', async({page, server, context}) => { + it_fails_ffox('should trigger permission onchange', async({page, server, context}) => { await page.goto(server.EMPTY_PAGE); await page.evaluate(() => { window.events = []; @@ -217,7 +217,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await context.clearPermissionOverrides(); expect(await page.evaluate(() => window.events)).toEqual(['prompt', 'denied', 'granted', 'prompt']); }); - it('should isolate permissions between browser contexts', async({page, server, context, browser}) => { + it_fails_ffox('should isolate permissions between browser contexs', async({page, server, context, browser}) => { await page.goto(server.EMPTY_PAGE); const otherContext = await browser.createIncognitoBrowserContext(); const otherPage = await otherContext.newPage(); @@ -238,8 +238,8 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe_fails_ffox('Page.setGeolocation', function() { - it('should work', async({page, server, context}) => { + describe('Page.setGeolocation', function() { + it_fails_ffox('should work', async({page, server, context}) => { await context.overridePermissions(server.PREFIX, ['geolocation']); await page.goto(server.EMPTY_PAGE); await page.setGeolocation({longitude: 10, latitude: 10}); @@ -281,8 +281,8 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe_fails_ffox('ExecutionContext.queryObjects', function() { - it('should work', async({page, server}) => { + describe('ExecutionContext.queryObjects', function() { + it_fails_ffox('should work', async({page, server}) => { // Instantiate an object await page.evaluate(() => window.set = new Set(['hello', 'world'])); const prototypeHandle = await page.evaluateHandle(() => Set.prototype); @@ -292,7 +292,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR const values = await page.evaluate(objects => Array.from(objects[0].values()), objectsHandle); expect(values).toEqual(['hello', 'world']); }); - it('should work for non-blank page', async({page, server}) => { + it_fails_ffox('should work for non-blank page', async({page, server}) => { // Instantiate an object await page.goto(server.EMPTY_PAGE); await page.evaluate(() => window.set = new Set(['hello', 'world'])); @@ -316,7 +316,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe('Page.Events.Console', function() { + describe_fails_ffox('Page.Events.Console', function() { it('should work', async({page, server}) => { let message = null; page.once('console', m => message = m); @@ -377,7 +377,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR else expect(message.type()).toEqual('warn'); }); - it_fails_ffox('should have location when fetch fails', async({page, server}) => { + it('should have location when fetch fails', async({page, server}) => { // The point of this test is to make sure that we report console messages from // Log domain: https://vanilla.aslushnikov.com/?Log.entryAdded await page.goto(server.EMPTY_PAGE); @@ -407,7 +407,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); // @see https://github.com/puppeteer/puppeteer/issues/3865 - it_fails_ffox('should not throw when there are console messages in detached iframes', async({browser, page, server}) => { + it('should not throw when there are console messages in detached iframes', async({browser, page, server}) => { await page.goto(server.EMPTY_PAGE); await page.evaluate(async() => { // 1. Create a popup that Puppeteer is not connected to. @@ -522,7 +522,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); describe('Page.waitForResponse', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const [response] = await Promise.all([ page.waitForResponse(server.PREFIX + '/digits/2.png'), @@ -545,7 +545,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await page.waitForResponse(() => false).catch(e => error = e); expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); - it('should work with predicate', async({page, server}) => { + it_fails_ffox('should work with predicate', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const [response] = await Promise.all([ page.waitForResponse(response => response.url() === server.PREFIX + '/digits/2.png'), @@ -557,7 +557,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR ]); expect(response.url()).toBe(server.PREFIX + '/digits/2.png'); }); - it('should work with no timeout', async({page, server}) => { + it_fails_ffox('should work with no timeout', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const [response] = await Promise.all([ page.waitForResponse(server.PREFIX + '/digits/2.png', {timeout: 0}), @@ -571,7 +571,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe('Page.exposeFunction', function() { + describe_fails_ffox('Page.exposeFunction', function() { it('should work', async({page, server}) => { await page.exposeFunction('compute', function(a, b) { return a * b; @@ -671,7 +671,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe('Page.Events.PageError', function() { + describe_fails_ffox('Page.Events.PageError', function() { it('should fire', async({page, server}) => { let error = null; page.once('pageerror', e => error = e); @@ -693,7 +693,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR ]); expect(request.headers['user-agent']).toBe('foobar'); }); - it('should work for subframes', async({page, server}) => { + it_fails_ffox('should work for subframes', async({page, server}) => { expect(await page.evaluate(() => navigator.userAgent)).toContain('Mozilla'); await page.setUserAgent('foobar'); const [request] = await Promise.all([ @@ -710,7 +710,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe('Page.setContent', function() { + describe_fails_ffox('Page.setContent', function() { const expectedOutput = '
hello
'; it('should work', async({page, server}) => { await page.setContent('
hello
'); @@ -730,7 +730,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR const result = await page.content(); expect(result).toBe(`${doctype}${expectedOutput}`); }); - it_fails_ffox('should respect timeout', async({page, server}) => { + it('should respect timeout', async({page, server}) => { const imgPath = '/img.png'; // stall for image server.setRoute(imgPath, (req, res) => {}); @@ -738,7 +738,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await page.setContent(``, {timeout: 1}).catch(e => error = e); expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); - it_fails_ffox('should respect default navigation timeout', async({page, server}) => { + it('should respect default navigation timeout', async({page, server}) => { page.setDefaultNavigationTimeout(1); const imgPath = '/img.png'; // stall for image @@ -747,7 +747,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await page.setContent(``).catch(e => error = e); expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError); }); - it_fails_ffox('should await resources to load', async({page, server}) => { + it('should await resources to load', async({page, server}) => { const imgPath = '/img.png'; let imgResponse = null; server.setRoute(imgPath, (req, res) => imgResponse = res); @@ -969,7 +969,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR expect(styleContent).toContain(path.join('assets', 'injectedstyle.css')); }); - it('should work with content', async({page, server}) => { + it_fails_ffox('should work with content', async({page, server}) => { await page.goto(server.EMPTY_PAGE); const styleHandle = await page.addStyleTag({ content: 'body { background-color: green; }' }); expect(styleHandle.asElement()).not.toBeNull(); @@ -999,7 +999,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); }); - describe('Page.setJavaScriptEnabled', function() { + describe_fails_ffox('Page.setJavaScriptEnabled', function() { it('should work', async({page, server}) => { await page.setJavaScriptEnabled(false); await page.goto('data:text/html, '); @@ -1030,7 +1030,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR ]); expect(nonCachedRequest.headers['if-modified-since']).toBe(undefined); }); - it('should stay disabled when toggling request interception on/off', async({page, server}) => { + it_fails_ffox('should stay disabled when toggling request interception on/off', async({page, server}) => { await page.setCacheEnabled(false); await page.setRequestInterception(true); await page.setRequestInterception(false); @@ -1074,7 +1074,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR expect(await page.evaluate(() => result.onInput)).toEqual(['blue']); expect(await page.evaluate(() => result.onChange)).toEqual(['blue']); }); - it_fails_ffox('should not throw when select causes navigation', async({page, server}) => { + it('should not throw when select causes navigation', async({page, server}) => { await page.goto(server.PREFIX + '/input/select.html'); await page.$eval('select', select => select.addEventListener('input', () => window.location = '/empty.html')); await Promise.all([ @@ -1136,7 +1136,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR await page.select('select'); expect(await page.$eval('select', select => Array.from(select.options).every(option => !option.selected))).toEqual(true); }); - it('should throw if passed in non-strings', async({page, server}) => { + it_fails_ffox('should throw if passed in non-strings', async({page, server}) => { await page.setContent(''); let error = null; try { @@ -1157,7 +1157,7 @@ module.exports.addTests = function({testRunner, expect, headless, puppeteer, CHR }); describe('Page.Events.Close', function() { - it('should work with window.close', async function({ page, context, server }) { + it_fails_ffox('should work with window.close', async function({ page, context, server }) { const newPagePromise = new Promise(fulfill => context.once('targetcreated', target => fulfill(target.page()))); await page.evaluate(() => window['newPage'] = window.open('about:blank')); const newPage = await newPagePromise; diff --git a/test/puppeteer.spec.js b/test/puppeteer.spec.js index d24a0f5e..dcc7788b 100644 --- a/test/puppeteer.spec.js +++ b/test/puppeteer.spec.js @@ -28,8 +28,7 @@ module.exports.addTests = ({testRunner, product, puppeteerPath}) => { const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; const CHROME = product === 'Chromium'; - const FFOX = (product === 'Firefox' || product === 'Juggler'); - const JUGGLER = product === 'Juggler'; + const FFOX = product === 'Firefox'; const puppeteer = require(puppeteerPath); @@ -59,7 +58,7 @@ module.exports.addTests = ({testRunner, product, puppeteerPath}) => { throw new Error(`Browser is not downloaded at ${executablePath}. Run 'npm install' and try to re-run tests`); } - const suffix = JUGGLER ? 'firefox' : product.toLowerCase(); + const suffix = FFOX ? 'firefox' : product.toLowerCase(); const GOLDEN_DIR = path.join(__dirname, 'golden-' + suffix); const OUTPUT_DIR = path.join(__dirname, 'output-' + suffix); if (fs.existsSync(OUTPUT_DIR)) @@ -73,7 +72,6 @@ module.exports.addTests = ({testRunner, product, puppeteerPath}) => { product, FFOX, CHROME, - JUGGLER, puppeteer, expect, defaultBrowserOptions, @@ -81,10 +79,6 @@ module.exports.addTests = ({testRunner, product, puppeteerPath}) => { headless: !!defaultBrowserOptions.headless, }; - beforeAll(async() => { - if (JUGGLER && defaultBrowserOptions.executablePath) - await require('../experimental/puppeteer-firefox/misc/install-preferences')(defaultBrowserOptions.executablePath); - }); describe('Browser', function() { beforeAll(async state => { diff --git a/test/queryselector.spec.js b/test/queryselector.spec.js index 8eb7e8f6..4b94865c 100644 --- a/test/queryselector.spec.js +++ b/test/queryselector.spec.js @@ -15,11 +15,11 @@ */ module.exports.addTests = function({testRunner, expect, product}) { - const {describe, xdescribe, fdescribe} = testRunner; - const {it, fit, xit} = testRunner; + const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; + const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe('Page.$eval', function() { + describe_fails_ffox('Page.$eval', function() { it('should work', async({page, server}) => { await page.setContent('
43543
'); const idAttribute = await page.$eval('section', e => e.id); @@ -43,7 +43,7 @@ module.exports.addTests = function({testRunner, expect, product}) { }); }); - describe('Page.$$eval', function() { + describe_fails_ffox('Page.$$eval', function() { it('should work', async({page, server}) => { await page.setContent('
hello
beautiful
world!
'); const divsCount = await page.$$eval('div', divs => divs.length); @@ -51,7 +51,7 @@ module.exports.addTests = function({testRunner, expect, product}) { }); }); - describe('Page.$', function() { + describe_fails_ffox('Page.$', function() { it('should query existing element', async({page, server}) => { await page.setContent('
test
'); const element = await page.$('section'); @@ -64,7 +64,7 @@ module.exports.addTests = function({testRunner, expect, product}) { }); describe('Page.$$', function() { - it('should query existing elements', async({page, server}) => { + it_fails_ffox('should query existing elements', async({page, server}) => { await page.setContent('
A

B
'); const elements = await page.$$('div'); expect(elements.length).toBe(2); @@ -78,7 +78,7 @@ module.exports.addTests = function({testRunner, expect, product}) { }); }); - describe('Path.$x', function() { + describe_fails_ffox('Path.$x', function() { it('should query existing element', async({page, server}) => { await page.setContent('
test
'); const elements = await page.$x('/html/body/section'); @@ -108,14 +108,14 @@ module.exports.addTests = function({testRunner, expect, product}) { expect(content).toBe('A'); }); - it('should return null for non-existing element', async({page, server}) => { + it_fails_ffox('should return null for non-existing element', async({page, server}) => { await page.setContent('
B
'); const html = await page.$('html'); const second = await html.$('.third'); expect(second).toBe(null); }); }); - describe('ElementHandle.$eval', function() { + describe_fails_ffox('ElementHandle.$eval', function() { it('should work', async({page, server}) => { await page.setContent('
10
'); const tweet = await page.$('.tweet'); @@ -139,7 +139,7 @@ module.exports.addTests = function({testRunner, expect, product}) { expect(errorMessage).toBe(`Error: failed to find element matching selector ".a"`); }); }); - describe('ElementHandle.$$eval', function() { + describe_fails_ffox('ElementHandle.$$eval', function() { it('should work', async({page, server}) => { await page.setContent('
'); const tweet = await page.$('.tweet'); @@ -165,7 +165,7 @@ module.exports.addTests = function({testRunner, expect, product}) { }); - describe('ElementHandle.$$', function() { + describe_fails_ffox('ElementHandle.$$', function() { it('should query existing elements', async({page, server}) => { await page.setContent('
A

B
'); const html = await page.$('html'); @@ -195,7 +195,7 @@ module.exports.addTests = function({testRunner, expect, product}) { expect(content).toBe('A'); }); - it('should return null for non-existing element', async({page, server}) => { + it_fails_ffox('should return null for non-existing element', async({page, server}) => { await page.setContent('
B
'); const html = await page.$('html'); const second = await html.$x(`/div[contains(@class, 'third')]`); diff --git a/test/requestinterception.spec.js b/test/requestinterception.spec.js index ff08052c..45caba6e 100644 --- a/test/requestinterception.spec.js +++ b/test/requestinterception.spec.js @@ -23,7 +23,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe('Page.setRequestInterception', function() { + describe_fails_ffox('Page.setRequestInterception', function() { it('should intercept', async({page, server}) => { await page.setRequestInterception(true); page.on('request', request => { @@ -171,7 +171,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { expect(response.request().failure()).toBe(null); expect(failedRequests).toBe(1); }); - it_fails_ffox('should be abortable with custom error codes', async({page, server}) => { + it('should be abortable with custom error codes', async({page, server}) => { await page.setRequestInterception(true); page.on('request', request => { request.abort('internetdisconnected'); @@ -303,7 +303,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { ])); expect(results).toEqual(['11', 'FAILED', '22']); }); - it_fails_ffox('should navigate to dataURL and fire dataURL requests', async({page, server}) => { + it('should navigate to dataURL and fire dataURL requests', async({page, server}) => { await page.setRequestInterception(true); const requests = []; page.on('request', request => { @@ -316,7 +316,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { expect(requests.length).toBe(1); expect(requests[0].url()).toBe(dataURL); }); - it_fails_ffox('should be able to fetch dataURL and fire dataURL requests', async({page, server}) => { + it('should be able to fetch dataURL and fire dataURL requests', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setRequestInterception(true); const requests = []; @@ -330,7 +330,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { expect(requests.length).toBe(1); expect(requests[0].url()).toBe(dataURL); }); - it_fails_ffox('should navigate to URL with hash and and fire requests without hash', async({page, server}) => { + it('should navigate to URL with hash and and fire requests without hash', async({page, server}) => { await page.setRequestInterception(true); const requests = []; page.on('request', request => { @@ -358,7 +358,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { const response = await page.goto(server.PREFIX + '/malformed?rnd=%911'); expect(response.status()).toBe(200); }); - it_fails_ffox('should work with encoded server - 2', async({page, server}) => { + it('should work with encoded server - 2', async({page, server}) => { // The requestWillBeSent will report URL as-is, whereas interception will // report encoded URL for stylesheet. @see crbug.com/759388 await page.setRequestInterception(true); @@ -372,7 +372,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { expect(requests.length).toBe(2); expect(requests[1].response().status()).toBe(404); }); - it_fails_ffox('should not throw "Invalid Interception Id" if the request was cancelled', async({page, server}) => { + it('should not throw "Invalid Interception Id" if the request was cancelled', async({page, server}) => { await page.setContent(''); await page.setRequestInterception(true); let request = null; @@ -398,7 +398,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { await page.goto(server.EMPTY_PAGE); expect(error.message).toContain('Request Interception is not enabled'); }); - it_fails_ffox('should work with file URLs', async({page, server}) => { + it('should work with file URLs', async({page, server}) => { await page.setRequestInterception(true); const urls = new Set(); page.on('request', request => { @@ -412,7 +412,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { }); }); - describe('Request.continue', function() { + describe_fails_ffox('Request.continue', function() { it('should work', async({page, server}) => { await page.setRequestInterception(true); page.on('request', request => request.continue()); @@ -432,7 +432,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { ]); expect(request.headers['foo']).toBe('bar'); }); - it_fails_ffox('should redirect in a way non-observable to page', async({page, server}) => { + it('should redirect in a way non-observable to page', async({page, server}) => { await page.setRequestInterception(true); page.on('request', request => { const redirectURL = request.url().includes('/empty.html') ? server.PREFIX + '/consolelog.html' : undefined; @@ -444,7 +444,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { expect(page.url()).toBe(server.EMPTY_PAGE); expect(consoleMessage.text()).toBe('yellow'); }); - it_fails_ffox('should amend method', async({page, server}) => { + it('should amend method', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setRequestInterception(true); @@ -457,7 +457,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { ]); expect(request.method).toBe('POST'); }); - it_fails_ffox('should amend post data', async({page, server}) => { + it('should amend post data', async({page, server}) => { await page.goto(server.EMPTY_PAGE); await page.setRequestInterception(true); @@ -470,7 +470,7 @@ module.exports.addTests = function({testRunner, expect, CHROME}) { ]); expect(await serverRequest.postBody).toBe('doggo'); }); - it_fails_ffox('should amend both post data and method on navigation', async({page, server}) => { + it('should amend both post data and method on navigation', async({page, server}) => { await page.setRequestInterception(true); page.on('request', request => { request.continue({ method: 'POST', postData: 'doggo' }); diff --git a/test/screenshot.spec.js b/test/screenshot.spec.js index a2bae3b3..00f8b151 100644 --- a/test/screenshot.spec.js +++ b/test/screenshot.spec.js @@ -20,13 +20,13 @@ module.exports.addTests = function({testRunner, expect, product}) { const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; describe('Page.screenshot', function() { - it('should work', async({page, server}) => { + it_fails_ffox('should work', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot(); expect(screenshot).toBeGolden('screenshot-sanity.png'); }); - it('should clip rect', async({page, server}) => { + it_fails_ffox('should clip rect', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot({ @@ -69,7 +69,7 @@ module.exports.addTests = function({testRunner, expect, product}) { const screenshots = await Promise.all(promises); expect(screenshots[1]).toBeGolden('grid-cell-1.png'); }); - it('should take fullPage screenshots', async({page, server}) => { + it_fails_ffox('should take fullPage screenshots', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot({ @@ -115,7 +115,7 @@ module.exports.addTests = function({testRunner, expect, product}) { }); expect(screenshot).toBeGolden('screenshot-clip-odd-size.png'); }); - it('should return base64', async({page, server}) => { + it_fails_ffox('should return base64', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.goto(server.PREFIX + '/grid.html'); const screenshot = await page.screenshot({ @@ -134,7 +134,7 @@ module.exports.addTests = function({testRunner, expect, product}) { const screenshot = await elementHandle.screenshot(); expect(screenshot).toBeGolden('screenshot-element-bounding-box.png'); }); - it('should take into account padding and border', async({page, server}) => { + it_fails_ffox('should take into account padding and border', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.setContent(` something above @@ -151,7 +151,7 @@ module.exports.addTests = function({testRunner, expect, product}) { const screenshot = await elementHandle.screenshot(); expect(screenshot).toBeGolden('screenshot-element-padding-border.png'); }); - it('should capture full element when larger than viewport', async({page, server}) => { + it_fails_ffox('should capture full element when larger than viewport', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.setContent(` @@ -175,7 +175,7 @@ module.exports.addTests = function({testRunner, expect, product}) { expect(await page.evaluate(() => ({ w: window.innerWidth, h: window.innerHeight }))).toEqual({ w: 500, h: 500 }); }); - it('should scroll element into view', async({page, server}) => { + it_fails_ffox('should scroll element into view', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.setContent(` something above @@ -198,7 +198,7 @@ module.exports.addTests = function({testRunner, expect, product}) { const screenshot = await elementHandle.screenshot(); expect(screenshot).toBeGolden('screenshot-element-scrolled-into-view.png'); }); - it('should work with a rotated element', async({page, server}) => { + it_fails_ffox('should work with a rotated element', async({page, server}) => { await page.setViewport({width: 500, height: 500}); await page.setContent(`
'); const div = await page.$('div'); const error = await div.screenshot().catch(e => e); expect(error.message).toBe('Node has 0 height.'); }); - it('should work for an element with fractional dimensions', async({page}) => { + it_fails_ffox('should work for an element with fractional dimensions', async({page}) => { await page.setContent('
'); const elementHandle = await page.$('div'); const screenshot = await elementHandle.screenshot(); expect(screenshot).toBeGolden('screenshot-element-fractional.png'); }); - it('should work for an element with an offset', async({page}) => { + it_fails_ffox('should work for an element with an offset', async({page}) => { await page.setContent('
'); const elementHandle = await page.$('div'); const screenshot = await elementHandle.screenshot(); diff --git a/test/target.spec.js b/test/target.spec.js index e950c8aa..23d65fd4 100644 --- a/test/target.spec.js +++ b/test/target.spec.js @@ -49,7 +49,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { expect(await originalPage.evaluate(() => ['Hello', 'world'].join(' '))).toBe('Hello world'); expect(await originalPage.$('body')).toBeTruthy(); }); - it('should report when a new page is created and closed', async({page, server, context}) => { + it_fails_ffox('should report when a new page is created and closed', async({page, server, context}) => { const [otherPage] = await Promise.all([ context.waitForTarget(target => target.url() === server.CROSS_PROCESS_PREFIX + '/empty.html').then(target => target.page()), page.evaluate(url => window.open(url), server.CROSS_PROCESS_PREFIX + '/empty.html'), @@ -99,7 +99,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { const worker = await target.worker(); expect(await worker.evaluate(() => self.toString())).toBe('[object SharedWorkerGlobalScope]'); }); - it('should report when a target url changes', async({page, server, context}) => { + it_fails_ffox('should report when a target url changes', async({page, server, context}) => { await page.goto(server.EMPTY_PAGE); let changedTarget = new Promise(fulfill => context.once('targetchanged', target => fulfill(target))); await page.goto(server.CROSS_PROCESS_PREFIX + '/'); @@ -128,7 +128,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { expect(targetChanged).toBe(false, 'target should not be reported as changed'); context.removeListener('targetchanged', listener); }); - it('should not crash while redirecting if original request was missed', async({page, server, context}) => { + it_fails_ffox('should not crash while redirecting if original request was missed', async({page, server, context}) => { let serverResponse = null; server.setRoute('/one-style.css', (req, res) => serverResponse = res); // Open a new page. Use window.open to connect to the page later. @@ -147,7 +147,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { // Cleanup. await newPage.close(); }); - it('should have an opener', async({page, server, context}) => { + it_fails_ffox('should have an opener', async({page, server, context}) => { await page.goto(server.EMPTY_PAGE); const [createdTarget] = await Promise.all([ new Promise(fulfill => context.once('targetcreated', target => fulfill(target))), @@ -160,7 +160,7 @@ module.exports.addTests = function({testRunner, expect, puppeteer}) { }); describe('Browser.waitForTarget', () => { - it('should wait for a target', async function({browser, server}) { + it_fails_ffox('should wait for a target', async function({browser, server}) { let resolved = false; const targetPromise = browser.waitForTarget(target => target.url() === server.EMPTY_PAGE); targetPromise.then(() => resolved = true); diff --git a/test/test.js b/test/test.js index d13509e9..bcce2286 100644 --- a/test/test.js +++ b/test/test.js @@ -26,10 +26,10 @@ if (parallelArgIndex !== -1) parallel = parseInt(process.argv[parallelArgIndex + 1], 10); require('events').defaultMaxListeners *= parallel; -// Timeout to 20 seconds on Appveyor instances. -let timeout = process.env.APPVEYOR ? 20 * 1000 : 10 * 1000; +const defaultTimeout = process.env.PUPPETEER_PRODUCT === 'firefox' ? 15 * 1000 : 10 * 1000; +let timeout = process.env.APPVEYOR ? 20 * 1000 : defaultTimeout; if (!isNaN(process.env.TIMEOUT)) - timeout = parseInt(process.env.TIMEOUT, 10); + timeout = parseInt(process.env.TIMEOUT, defaultTimeout); const testRunner = new TestRunner({ timeout, parallel, @@ -86,19 +86,6 @@ switch (process.env.PUPPETEER_PRODUCT) { puppeteerPath: utils.projectRoot(), testRunner, }); - if (process.env.COVERAGE) - utils.recordAPICoverage(testRunner, require('../lib/api'), require('../lib/Events').Events, CHROMIUM_NO_COVERAGE); - }); - break; - case 'juggler': - testRunner.addTestDSL('it_fails_ffox', 'skip'); - testRunner.addSuiteDSL('describe_fails_ffox', 'skip'); - describe('Firefox (Juggler)', () => { - require('./puppeteer.spec.js').addTests({ - product: 'Juggler', - puppeteerPath: path.resolve(__dirname, '../experimental/puppeteer-firefox/'), - testRunner, - }); }); break; case 'chrome': diff --git a/test/touchscreen.spec.js b/test/touchscreen.spec.js index 196dbb30..55558fa3 100644 --- a/test/touchscreen.spec.js +++ b/test/touchscreen.spec.js @@ -15,11 +15,11 @@ */ module.exports.addTests = function({testRunner, expect, puppeteer}) { - const {describe, xdescribe, fdescribe} = testRunner; + const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const iPhone = puppeteer.devices['iPhone 6']; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; - describe('Touchscreen', function() { + describe_fails_ffox('Touchscreen', function() { it('should tap the button', async({page, server}) => { await page.emulate(iPhone); await page.goto(server.PREFIX + '/input/button.html'); diff --git a/test/waittask.spec.js b/test/waittask.spec.js index 3a0cba0b..88234b8b 100644 --- a/test/waittask.spec.js +++ b/test/waittask.spec.js @@ -17,12 +17,12 @@ const utils = require('./utils'); module.exports.addTests = function({testRunner, expect, product, puppeteer}) { - const {describe, xdescribe, fdescribe} = testRunner; + const {describe, xdescribe, fdescribe, describe_fails_ffox} = testRunner; const {it, fit, xit, it_fails_ffox} = testRunner; const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; describe('Page.waitFor', function() { - it('should wait for selector', async({page, server}) => { + it_fails_ffox('should wait for selector', async({page, server}) => { let found = false; const waitFor = page.waitFor('div').then(() => found = true); await page.goto(server.EMPTY_PAGE); @@ -31,7 +31,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { await waitFor; expect(found).toBe(true); }); - it('should wait for an xpath', async({page, server}) => { + it_fails_ffox('should wait for an xpath', async({page, server}) => { let found = false; const waitFor = page.waitFor('//div').then(() => found = true); await page.goto(server.EMPTY_PAGE); @@ -40,7 +40,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { await waitFor; expect(found).toBe(true); }); - it('should not allow you to select an element with single slash xpath', async({page, server}) => { + it_fails_ffox('should not allow you to select an element with single slash xpath', async({page, server}) => { await page.setContent(`
some text
`); let error = null; await page.waitFor('/html/body/div').catch(e => error = e); @@ -80,7 +80,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { await page.evaluate(() => window.__FOO = 1); await watchdog; }); - it('should work when resolved right before execution context disposal', async({page, server}) => { + it_fails_ffox('should work when resolved right before execution context disposal', async({page, server}) => { await page.evaluateOnNewDocument(() => window.__RELOADED = true); await page.waitForFunction(() => { if (!window.__RELOADED) @@ -150,7 +150,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { it('should return the window as a success value', async({ page }) => { expect(await page.waitForFunction(() => window)).toBeTruthy(); }); - it('should accept ElementHandle arguments', async({page}) => { + it_fails_ffox('should accept ElementHandle arguments', async({page}) => { await page.setContent('
'); const div = await page.$('div'); let resolved = false; @@ -204,7 +204,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { }); }); - describe('Frame.waitForSelector', function() { + describe_fails_ffox('Frame.waitForSelector', function() { const addElement = tag => document.body.appendChild(document.createElement(tag)); it('should immediately resolve promise if node exists', async({page, server}) => { @@ -215,7 +215,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { await frame.waitForSelector('div'); }); - it_fails_ffox('should work with removed MutationObserver', async({page, server}) => { + it('should work with removed MutationObserver', async({page, server}) => { await page.evaluate(() => delete window.MutationObserver); const [handle] = await Promise.all([ page.waitForSelector('.zombo'), @@ -366,7 +366,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { await page.evaluate(() => document.querySelector('div').className = 'zombo'); expect(await waitForSelector).toBe(true); }); - it('should return the element handle', async({page, server}) => { + it_fails_ffox('should return the element handle', async({page, server}) => { const waitForSelector = page.waitForSelector('.zombo'); await page.setContent(`
anything
`); expect(await page.evaluate(x => x.textContent, await waitForSelector)).toBe('anything'); @@ -378,7 +378,7 @@ module.exports.addTests = function({testRunner, expect, product, puppeteer}) { }); }); - describe('Frame.waitForXPath', function() { + describe_fails_ffox('Frame.waitForXPath', function() { const addElement = tag => document.body.appendChild(document.createElement(tag)); it('should support some fancy xpath', async({page, server}) => {