From 04991ad025d84ebe2ce3f62b871f41bbd3badf2a Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Wed, 11 Apr 2018 15:25:42 -0700 Subject: [PATCH] test: consolidate network tests in one file (#2355) --- test/network.spec.js | 382 ++++++++++++++++++++++++++++++++++++++++++- test/page.spec.js | 375 ------------------------------------------ 2 files changed, 380 insertions(+), 377 deletions(-) diff --git a/test/network.spec.js b/test/network.spec.js index 30885f9a..45b7557e 100644 --- a/test/network.spec.js +++ b/test/network.spec.js @@ -14,7 +14,9 @@ * limitations under the License. */ -const {waitEvent} = require('./utils'); +const fs = require('fs'); +const path = require('path'); +const utils = require('./utils'); module.exports.addTests = function({testRunner, expect}) { const {describe, xdescribe, fdescribe} = testRunner; @@ -121,7 +123,7 @@ module.exports.addTests = function({testRunner, expect}) { // send request and wait for server response await Promise.all([ page.evaluate(() => fetch('./get', { method: 'GET'})), - waitEvent(page, 'response') + utils.waitEvent(page, 'response') ]); expect(serverResponse).toBeTruthy(); @@ -196,4 +198,380 @@ module.exports.addTests = function({testRunner, expect}) { expect(redirectChain[0].url()).toContain('/foo.html'); }); }); + + describe('Page.setRequestInterception', function() { + it('should intercept', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + expect(request.url()).toContain('empty.html'); + expect(request.headers()['user-agent']).toBeTruthy(); + expect(request.method()).toBe('GET'); + expect(request.postData()).toBe(undefined); + expect(request.resourceType()).toBe('document'); + expect(request.frame() === page.mainFrame()).toBe(true); + expect(request.frame().url()).toBe('about:blank'); + request.continue(); + }); + const response = await page.goto(server.EMPTY_PAGE); + expect(response.ok()).toBe(true); + }); + it('should stop intercepting', async({page, server}) => { + await page.setRequestInterception(true); + page.once('request', request => request.continue()); + await page.goto(server.EMPTY_PAGE); + await page.setRequestInterception(false); + await page.goto(server.EMPTY_PAGE); + }); + it('should show custom HTTP headers', async({page, server}) => { + await page.setExtraHTTPHeaders({ + foo: 'bar' + }); + await page.setRequestInterception(true); + page.on('request', request => { + expect(request.headers()['foo']).toBe('bar'); + request.continue(); + }); + const response = await page.goto(server.EMPTY_PAGE); + expect(response.ok()).toBe(true); + }); + it('should works with customizing referer headers', async({page, server}) => { + await page.setExtraHTTPHeaders({ 'referer': server.EMPTY_PAGE }); + await page.setRequestInterception(true); + page.on('request', request => { + expect(request.headers()['referer']).toBe(server.EMPTY_PAGE); + request.continue(); + }); + const response = await page.goto(server.EMPTY_PAGE); + expect(response.ok()).toBe(true); + }); + it('should be abortable', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + if (request.url().endsWith('.css')) + request.abort(); + else + request.continue(); + }); + let failedRequests = 0; + page.on('requestfailed', event => ++failedRequests); + const response = await page.goto(server.PREFIX + '/one-style.html'); + expect(response.ok()).toBe(true); + expect(response.request().failure()).toBe(null); + expect(failedRequests).toBe(1); + }); + it('should be abortable with custom error codes', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + request.abort('internetdisconnected'); + }); + let failedRequest = null; + page.on('requestfailed', request => failedRequest = request); + await page.goto(server.EMPTY_PAGE).catch(e => {}); + expect(failedRequest).toBeTruthy(); + expect(failedRequest.failure().errorText).toBe('net::ERR_INTERNET_DISCONNECTED'); + }); + it('should send referer', async({page, server}) => { + await page.setExtraHTTPHeaders({ + referer: 'http://google.com/' + }); + await page.setRequestInterception(true); + page.on('request', request => request.continue()); + const [request] = await Promise.all([ + server.waitForRequest('/grid.html'), + page.goto(server.PREFIX + '/grid.html'), + ]); + expect(request.headers['referer']).toBe('http://google.com/'); + }); + it('should amend HTTP headers', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + const headers = Object.assign({}, request.headers()); + headers['FOO'] = 'bar'; + request.continue({ headers }); + }); + await page.goto(server.EMPTY_PAGE); + const [request] = await Promise.all([ + server.waitForRequest('/sleep.zzz'), + page.evaluate(() => fetch('/sleep.zzz')) + ]); + expect(request.headers['foo']).toBe('bar'); + }); + it('should fail navigation when aborting main resource', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => request.abort()); + let error = null; + await page.goto(server.EMPTY_PAGE).catch(e => error = e); + expect(error).toBeTruthy(); + expect(error.message).toContain('net::ERR_FAILED'); + }); + it('should work with redirects', async({page, server}) => { + await page.setRequestInterception(true); + const requests = []; + page.on('request', request => { + request.continue(); + requests.push(request); + }); + server.setRedirect('/non-existing-page.html', '/non-existing-page-2.html'); + server.setRedirect('/non-existing-page-2.html', '/non-existing-page-3.html'); + server.setRedirect('/non-existing-page-3.html', '/non-existing-page-4.html'); + server.setRedirect('/non-existing-page-4.html', '/empty.html'); + const response = await page.goto(server.PREFIX + '/non-existing-page.html'); + expect(response.status()).toBe(200); + expect(response.url()).toContain('empty.html'); + expect(requests.length).toBe(5); + expect(requests[2].resourceType()).toBe('document'); + // Check redirect chain + const redirectChain = response.request().redirectChain(); + expect(redirectChain.length).toBe(4); + expect(redirectChain[0].url()).toContain('/non-existing-page.html'); + expect(redirectChain[2].url()).toContain('/non-existing-page-3.html'); + for (let i = 0; i < redirectChain.length; ++i) { + const request = redirectChain[i]; + expect(request.redirectChain().indexOf(request)).toBe(i); + } + }); + it('should be able to abort redirects', async({page, server}) => { + await page.setRequestInterception(true); + server.setRedirect('/non-existing.json', '/non-existing-2.json'); + server.setRedirect('/non-existing-2.json', '/simple.html'); + page.on('request', request => { + if (request.url().includes('non-existing-2')) + request.abort(); + else + request.continue(); + }); + await page.goto(server.EMPTY_PAGE); + const result = await page.evaluate(async() => { + try { + await fetch('/non-existing.json'); + } catch (e) { + return e.message; + } + }); + expect(result).toContain('Failed to fetch'); + }); + it('should work with equal requests', async({page, server}) => { + await page.goto(server.EMPTY_PAGE); + let responseCount = 1; + server.setRoute('/zzz', (req, res) => res.end((responseCount++) * 11 + '')); + await page.setRequestInterception(true); + + let spinner = false; + // Cancel 2nd request. + page.on('request', request => { + spinner ? request.abort() : request.continue(); + spinner = !spinner; + }); + const results = await page.evaluate(() => Promise.all([ + fetch('/zzz').then(response => response.text()).catch(e => 'FAILED'), + fetch('/zzz').then(response => response.text()).catch(e => 'FAILED'), + fetch('/zzz').then(response => response.text()).catch(e => 'FAILED'), + ])); + expect(results).toEqual(['11', 'FAILED', '22']); + }); + it('should navigate to dataURL and fire dataURL requests', async({page, server}) => { + await page.setRequestInterception(true); + const requests = []; + page.on('request', request => { + requests.push(request); + request.continue(); + }); + const dataURL = 'data:text/html,
yo
'; + const response = await page.goto(dataURL); + expect(response.status()).toBe(200); + expect(requests.length).toBe(1); + expect(requests[0].url()).toBe(dataURL); + }); + it('should abort data server', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + request.abort(); + }); + let error = null; + await page.goto('data:text/html,No way!').catch(err => error = err); + expect(error.message).toContain('net::ERR_FAILED'); + }); + 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 => { + requests.push(request); + request.continue(); + }); + const response = await page.goto(server.EMPTY_PAGE + '#hash'); + expect(response.status()).toBe(200); + expect(response.url()).toBe(server.EMPTY_PAGE); + expect(requests.length).toBe(1); + expect(requests[0].url()).toBe(server.EMPTY_PAGE); + }); + it('should work with encoded server', async({page, server}) => { + // The requestWillBeSent will report encoded URL, whereas interception will + // report URL as-is. @see crbug.com/759388 + await page.setRequestInterception(true); + page.on('request', request => request.continue()); + const response = await page.goto(server.PREFIX + '/some nonexisting page'); + expect(response.status()).toBe(404); + }); + it('should work with badly encoded server', async({page, server}) => { + await page.setRequestInterception(true); + server.setRoute('/malformed?rnd=%911', (req, res) => res.end()); + page.on('request', request => request.continue()); + const response = await page.goto(server.PREFIX + '/malformed?rnd=%911'); + expect(response.status()).toBe(200); + }); + 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); + const requests = []; + page.on('request', request => { + request.continue(); + requests.push(request); + }); + const response = await page.goto(`data:text/html,`); + expect(response.status()).toBe(200); + expect(requests.length).toBe(2); + expect(requests[1].response().status()).toBe(404); + }); + 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; + page.on('request', async r => request = r); + page.$eval('iframe', (frame, url) => frame.src = url, server.EMPTY_PAGE), + // Wait for request interception. + await utils.waitEvent(page, 'request'); + // Delete frame to cause request to be canceled. + await page.$eval('iframe', frame => frame.remove()); + let error = null; + await request.continue().catch(e => error = e); + expect(error).toBe(null); + }); + it('should throw if interception is not enabled', async({page, server}) => { + let error = null; + page.on('request', async request => { + try { + await request.continue(); + } catch (e) { + error = e; + } + }); + await page.goto(server.EMPTY_PAGE); + expect(error.message).toContain('Request Interception is not enabled'); + }); + }); + + describe('Request.respond', function() { + it('should work', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + request.respond({ + status: 201, + headers: { + foo: 'bar' + }, + body: 'Yo, page!' + }); + }); + const response = await page.goto(server.EMPTY_PAGE); + expect(response.status()).toBe(201); + expect(response.headers().foo).toBe('bar'); + expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!'); + }); + it('should allow mocking binary responses', async({page, server}) => { + await page.setRequestInterception(true); + page.on('request', request => { + const imageBuffer = fs.readFileSync(path.join(__dirname, 'assets', 'pptr.png')); + request.respond({ + contentType: 'image/png', + body: imageBuffer + }); + }); + await page.evaluate(PREFIX => { + const img = document.createElement('img'); + img.src = PREFIX + '/does-not-exist.png'; + document.body.appendChild(img); + return new Promise(fulfill => img.onload = fulfill); + }, server.PREFIX); + const img = await page.$('img'); + expect(await img.screenshot()).toBeGolden('mock-binary-response.png'); + }); + }); + + describe('Page.Events.Request', function() { + it('should fire', async({page, server}) => { + const requests = []; + page.on('request', request => requests.push(request)); + await page.goto(server.EMPTY_PAGE); + await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); + expect(requests.length).toBe(2); + expect(requests[0].url()).toBe(server.EMPTY_PAGE); + expect(requests[0].frame() === page.mainFrame()).toBe(true); + expect(requests[0].frame().url()).toBe(server.EMPTY_PAGE); + expect(requests[1].url()).toBe(server.EMPTY_PAGE); + expect(requests[1].frame() === page.frames()[1]).toBe(true); + expect(requests[1].frame().url()).toBe(server.EMPTY_PAGE); + }); + }); + + describe('Page.setExtraHTTPHeaders', function() { + it('should work', async({page, server}) => { + await page.setExtraHTTPHeaders({ + foo: 'bar' + }); + const [request] = await Promise.all([ + server.waitForRequest('/empty.html'), + page.goto(server.EMPTY_PAGE), + ]); + expect(request.headers['foo']).toBe('bar'); + }); + it('should throw for non-string header values', async({page, server}) => { + let error = null; + try { + await page.setExtraHTTPHeaders({ 'foo': 1 }); + } catch (e) { + error = e; + } + expect(error.message).toBe('Expected value of header "foo" to be String, but "number" is found.'); + }); + }); + + describe('Page.authenticate', function() { + it('should work', async({page, server}) => { + server.setAuth('/empty.html', 'user', 'pass'); + let response = await page.goto(server.EMPTY_PAGE); + expect(response.status()).toBe(401); + await page.authenticate({ + username: 'user', + password: 'pass' + }); + response = await page.reload(); + expect(response.status()).toBe(200); + }); + it('should fail if wrong credentials', async({page, server}) => { + // Use unique user/password since Chrome caches credentials per origin. + server.setAuth('/empty.html', 'user2', 'pass2'); + await page.authenticate({ + username: 'foo', + password: 'bar' + }); + const response = await page.goto(server.EMPTY_PAGE); + expect(response.status()).toBe(401); + }); + it('should allow disable authentication', async({page, server}) => { + // Use unique user/password since Chrome caches credentials per origin. + server.setAuth('/empty.html', 'user3', 'pass3'); + await page.authenticate({ + username: 'user3', + password: 'pass3' + }); + let response = await page.goto(server.EMPTY_PAGE); + expect(response.status()).toBe(200); + await page.authenticate(null); + // Navigate to a different origin to bust Chrome's credential caching. + response = await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html'); + expect(response.status()).toBe(401); + }); + }); + }; diff --git a/test/page.spec.js b/test/page.spec.js index 111e47da..281723c6 100644 --- a/test/page.spec.js +++ b/test/page.spec.js @@ -779,305 +779,6 @@ module.exports.addTests = function({testRunner, expect, puppeteer, DeviceDescrip }); }); - describe('Page.setRequestInterception', function() { - it('should intercept', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - expect(request.url()).toContain('empty.html'); - expect(request.headers()['user-agent']).toBeTruthy(); - expect(request.method()).toBe('GET'); - expect(request.postData()).toBe(undefined); - expect(request.resourceType()).toBe('document'); - expect(request.frame() === page.mainFrame()).toBe(true); - expect(request.frame().url()).toBe('about:blank'); - request.continue(); - }); - const response = await page.goto(server.EMPTY_PAGE); - expect(response.ok()).toBe(true); - }); - it('should stop intercepting', async({page, server}) => { - await page.setRequestInterception(true); - page.once('request', request => request.continue()); - await page.goto(server.EMPTY_PAGE); - await page.setRequestInterception(false); - await page.goto(server.EMPTY_PAGE); - }); - it('should show custom HTTP headers', async({page, server}) => { - await page.setExtraHTTPHeaders({ - foo: 'bar' - }); - await page.setRequestInterception(true); - page.on('request', request => { - expect(request.headers()['foo']).toBe('bar'); - request.continue(); - }); - const response = await page.goto(server.EMPTY_PAGE); - expect(response.ok()).toBe(true); - }); - it('should works with customizing referer headers', async({page, server}) => { - await page.setExtraHTTPHeaders({ 'referer': server.EMPTY_PAGE }); - await page.setRequestInterception(true); - page.on('request', request => { - expect(request.headers()['referer']).toBe(server.EMPTY_PAGE); - request.continue(); - }); - const response = await page.goto(server.EMPTY_PAGE); - expect(response.ok()).toBe(true); - }); - it('should be abortable', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - if (request.url().endsWith('.css')) - request.abort(); - else - request.continue(); - }); - let failedRequests = 0; - page.on('requestfailed', event => ++failedRequests); - const response = await page.goto(server.PREFIX + '/one-style.html'); - expect(response.ok()).toBe(true); - expect(response.request().failure()).toBe(null); - expect(failedRequests).toBe(1); - }); - it('should be abortable with custom error codes', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - request.abort('internetdisconnected'); - }); - let failedRequest = null; - page.on('requestfailed', request => failedRequest = request); - await page.goto(server.EMPTY_PAGE).catch(e => {}); - expect(failedRequest).toBeTruthy(); - expect(failedRequest.failure().errorText).toBe('net::ERR_INTERNET_DISCONNECTED'); - }); - it('should send referer', async({page, server}) => { - await page.setExtraHTTPHeaders({ - referer: 'http://google.com/' - }); - await page.setRequestInterception(true); - page.on('request', request => request.continue()); - const [request] = await Promise.all([ - server.waitForRequest('/grid.html'), - page.goto(server.PREFIX + '/grid.html'), - ]); - expect(request.headers['referer']).toBe('http://google.com/'); - }); - it('should amend HTTP headers', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - const headers = Object.assign({}, request.headers()); - headers['FOO'] = 'bar'; - request.continue({ headers }); - }); - await page.goto(server.EMPTY_PAGE); - const [request] = await Promise.all([ - server.waitForRequest('/sleep.zzz'), - page.evaluate(() => fetch('/sleep.zzz')) - ]); - expect(request.headers['foo']).toBe('bar'); - }); - it('should fail navigation when aborting main resource', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => request.abort()); - let error = null; - await page.goto(server.EMPTY_PAGE).catch(e => error = e); - expect(error).toBeTruthy(); - expect(error.message).toContain('net::ERR_FAILED'); - }); - it('should work with redirects', async({page, server}) => { - await page.setRequestInterception(true); - const requests = []; - page.on('request', request => { - request.continue(); - requests.push(request); - }); - server.setRedirect('/non-existing-page.html', '/non-existing-page-2.html'); - server.setRedirect('/non-existing-page-2.html', '/non-existing-page-3.html'); - server.setRedirect('/non-existing-page-3.html', '/non-existing-page-4.html'); - server.setRedirect('/non-existing-page-4.html', '/empty.html'); - const response = await page.goto(server.PREFIX + '/non-existing-page.html'); - expect(response.status()).toBe(200); - expect(response.url()).toContain('empty.html'); - expect(requests.length).toBe(5); - expect(requests[2].resourceType()).toBe('document'); - // Check redirect chain - const redirectChain = response.request().redirectChain(); - expect(redirectChain.length).toBe(4); - expect(redirectChain[0].url()).toContain('/non-existing-page.html'); - expect(redirectChain[2].url()).toContain('/non-existing-page-3.html'); - for (let i = 0; i < redirectChain.length; ++i) { - const request = redirectChain[i]; - expect(request.redirectChain().indexOf(request)).toBe(i); - } - }); - it('should be able to abort redirects', async({page, server}) => { - await page.setRequestInterception(true); - server.setRedirect('/non-existing.json', '/non-existing-2.json'); - server.setRedirect('/non-existing-2.json', '/simple.html'); - page.on('request', request => { - if (request.url().includes('non-existing-2')) - request.abort(); - else - request.continue(); - }); - await page.goto(server.EMPTY_PAGE); - const result = await page.evaluate(async() => { - try { - await fetch('/non-existing.json'); - } catch (e) { - return e.message; - } - }); - expect(result).toContain('Failed to fetch'); - }); - it('should work with equal requests', async({page, server}) => { - await page.goto(server.EMPTY_PAGE); - let responseCount = 1; - server.setRoute('/zzz', (req, res) => res.end((responseCount++) * 11 + '')); - await page.setRequestInterception(true); - - let spinner = false; - // Cancel 2nd request. - page.on('request', request => { - spinner ? request.abort() : request.continue(); - spinner = !spinner; - }); - const results = await page.evaluate(() => Promise.all([ - fetch('/zzz').then(response => response.text()).catch(e => 'FAILED'), - fetch('/zzz').then(response => response.text()).catch(e => 'FAILED'), - fetch('/zzz').then(response => response.text()).catch(e => 'FAILED'), - ])); - expect(results).toEqual(['11', 'FAILED', '22']); - }); - it('should navigate to dataURL and fire dataURL requests', async({page, server}) => { - await page.setRequestInterception(true); - const requests = []; - page.on('request', request => { - requests.push(request); - request.continue(); - }); - const dataURL = 'data:text/html,
yo
'; - const response = await page.goto(dataURL); - expect(response.status()).toBe(200); - expect(requests.length).toBe(1); - expect(requests[0].url()).toBe(dataURL); - }); - it('should abort data server', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - request.abort(); - }); - let error = null; - await page.goto('data:text/html,No way!').catch(err => error = err); - expect(error.message).toContain('net::ERR_FAILED'); - }); - 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 => { - requests.push(request); - request.continue(); - }); - const response = await page.goto(server.EMPTY_PAGE + '#hash'); - expect(response.status()).toBe(200); - expect(response.url()).toBe(server.EMPTY_PAGE); - expect(requests.length).toBe(1); - expect(requests[0].url()).toBe(server.EMPTY_PAGE); - }); - it('should work with encoded server', async({page, server}) => { - // The requestWillBeSent will report encoded URL, whereas interception will - // report URL as-is. @see crbug.com/759388 - await page.setRequestInterception(true); - page.on('request', request => request.continue()); - const response = await page.goto(server.PREFIX + '/some nonexisting page'); - expect(response.status()).toBe(404); - }); - it('should work with badly encoded server', async({page, server}) => { - await page.setRequestInterception(true); - server.setRoute('/malformed?rnd=%911', (req, res) => res.end()); - page.on('request', request => request.continue()); - const response = await page.goto(server.PREFIX + '/malformed?rnd=%911'); - expect(response.status()).toBe(200); - }); - 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); - const requests = []; - page.on('request', request => { - request.continue(); - requests.push(request); - }); - const response = await page.goto(`data:text/html,`); - expect(response.status()).toBe(200); - expect(requests.length).toBe(2); - expect(requests[1].response().status()).toBe(404); - }); - 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; - page.on('request', async r => request = r); - page.$eval('iframe', (frame, url) => frame.src = url, server.EMPTY_PAGE), - // Wait for request interception. - await waitEvent(page, 'request'); - // Delete frame to cause request to be canceled. - await page.$eval('iframe', frame => frame.remove()); - let error = null; - await request.continue().catch(e => error = e); - expect(error).toBe(null); - }); - it('should throw if interception is not enabled', async({page, server}) => { - let error = null; - page.on('request', async request => { - try { - await request.continue(); - } catch (e) { - error = e; - } - }); - await page.goto(server.EMPTY_PAGE); - expect(error.message).toContain('Request Interception is not enabled'); - }); - }); - - describe('Request.respond', function() { - it('should work', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - request.respond({ - status: 201, - headers: { - foo: 'bar' - }, - body: 'Yo, page!' - }); - }); - const response = await page.goto(server.EMPTY_PAGE); - expect(response.status()).toBe(201); - expect(response.headers().foo).toBe('bar'); - expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!'); - }); - it('should allow mocking binary responses', async({page, server}) => { - await page.setRequestInterception(true); - page.on('request', request => { - const imageBuffer = fs.readFileSync(path.join(__dirname, 'assets', 'pptr.png')); - request.respond({ - contentType: 'image/png', - body: imageBuffer - }); - }); - await page.evaluate(PREFIX => { - const img = document.createElement('img'); - img.src = PREFIX + '/does-not-exist.png'; - document.body.appendChild(img); - return new Promise(fulfill => img.onload = fulfill); - }, server.PREFIX); - const img = await page.$('img'); - expect(await img.screenshot()).toBeGolden('mock-binary-response.png'); - }); - }); - describe('Page.Events.Dialog', function() { it('should fire', async({page, server}) => { page.on('dialog', dialog => { @@ -1119,22 +820,6 @@ module.exports.addTests = function({testRunner, expect, puppeteer, DeviceDescrip }); }); - describe('Page.Events.Request', function() { - it('should fire', async({page, server}) => { - const requests = []; - page.on('request', request => requests.push(request)); - await page.goto(server.EMPTY_PAGE); - await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE); - expect(requests.length).toBe(2); - expect(requests[0].url()).toBe(server.EMPTY_PAGE); - expect(requests[0].frame() === page.mainFrame()).toBe(true); - expect(requests[0].frame().url()).toBe(server.EMPTY_PAGE); - expect(requests[1].url()).toBe(server.EMPTY_PAGE); - expect(requests[1].frame() === page.frames()[1]).toBe(true); - expect(requests[1].frame().url()).toBe(server.EMPTY_PAGE); - }); - }); - describe('Page.$eval', function() { it('should work', async({page, server}) => { await page.setContent('
43543
'); @@ -1230,66 +915,6 @@ module.exports.addTests = function({testRunner, expect, puppeteer, DeviceDescrip }); }); - describe('Page.setExtraHTTPHeaders', function() { - it('should work', async({page, server}) => { - await page.setExtraHTTPHeaders({ - foo: 'bar' - }); - const [request] = await Promise.all([ - server.waitForRequest('/empty.html'), - page.goto(server.EMPTY_PAGE), - ]); - expect(request.headers['foo']).toBe('bar'); - }); - it('should throw for non-string header values', async({page, server}) => { - let error = null; - try { - await page.setExtraHTTPHeaders({ 'foo': 1 }); - } catch (e) { - error = e; - } - expect(error.message).toBe('Expected value of header "foo" to be String, but "number" is found.'); - }); - }); - - describe('Page.authenticate', function() { - it('should work', async({page, server}) => { - server.setAuth('/empty.html', 'user', 'pass'); - let response = await page.goto(server.EMPTY_PAGE); - expect(response.status()).toBe(401); - await page.authenticate({ - username: 'user', - password: 'pass' - }); - response = await page.reload(); - expect(response.status()).toBe(200); - }); - it('should fail if wrong credentials', async({page, server}) => { - // Use unique user/password since Chrome caches credentials per origin. - server.setAuth('/empty.html', 'user2', 'pass2'); - await page.authenticate({ - username: 'foo', - password: 'bar' - }); - const response = await page.goto(server.EMPTY_PAGE); - expect(response.status()).toBe(401); - }); - it('should allow disable authentication', async({page, server}) => { - // Use unique user/password since Chrome caches credentials per origin. - server.setAuth('/empty.html', 'user3', 'pass3'); - await page.authenticate({ - username: 'user3', - password: 'pass3' - }); - let response = await page.goto(server.EMPTY_PAGE); - expect(response.status()).toBe(200); - await page.authenticate(null); - // Navigate to a different origin to bust Chrome's credential caching. - response = await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html'); - expect(response.status()).toBe(401); - }); - }); - describe('Page.setContent', function() { const expectedOutput = '
hello
'; it('should work', async({page, server}) => {