6522e4f524
Rather than use our own custom expect library, we can use expect from npm [1], which has an API almost identical to the one Puppeteer has, but with more options, better diffing, and is used by many in the community as it's the default assertions library that comes with Jest. It's also thoroughly documented [2]. [1]: https://www.npmjs.com/package/expect [2]: https://jestjs.io/docs/en/expect
99 lines
3.4 KiB
JavaScript
99 lines
3.4 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs');
|
|
const puppeteer = require('../..');
|
|
const {TestServer} = require('../testserver/');
|
|
const {TestRunner, Reporter} = require('../testrunner/');
|
|
const expect = require('expect');
|
|
|
|
const puppeteerWebPath = path.join(__dirname, 'puppeteer-web.js');
|
|
if (!fs.existsSync(puppeteerWebPath))
|
|
throw new Error(`puppeteer-web is not built; run "npm run bundle"`);
|
|
const puppeteerWeb = fs.readFileSync(puppeteerWebPath, 'utf8');
|
|
|
|
const testRunner = new TestRunner();
|
|
const {describe, fdescribe, xdescribe} = testRunner;
|
|
const {it, xit, fit} = testRunner;
|
|
const {afterAll, beforeAll, afterEach, beforeEach} = testRunner;
|
|
|
|
beforeAll(async state => {
|
|
const assetsPath = path.join(__dirname, '..', '..', 'test', 'assets');
|
|
const port = 8998;
|
|
state.server = await TestServer.create(assetsPath, port);
|
|
state.serverConfig = {
|
|
PREFIX: `http://localhost:${port}`,
|
|
EMPTY_PAGE: `http://localhost:${port}/empty.html`,
|
|
};
|
|
state.browser = await puppeteer.launch();
|
|
});
|
|
|
|
afterAll(async state => {
|
|
await Promise.all([
|
|
state.server.stop(),
|
|
state.browser.close()
|
|
]);
|
|
state.browser = null;
|
|
state.server = null;
|
|
});
|
|
|
|
beforeEach(async state => {
|
|
state.page = await state.browser.newPage();
|
|
await state.page.evaluateOnNewDocument(puppeteerWeb);
|
|
await state.page.addScriptTag({
|
|
content: puppeteerWeb + '\n//# sourceURL=puppeteer-web.js'
|
|
});
|
|
});
|
|
|
|
afterEach(async state => {
|
|
await state.page.close();
|
|
state.page = null;
|
|
});
|
|
|
|
describe('Puppeteer-Web', () => {
|
|
it('should work over web socket', async({page, serverConfig}) => {
|
|
const browser2 = await puppeteer.launch();
|
|
// Use in-page puppeteer to create a new page and navigate it to the EMPTY_PAGE
|
|
await page.evaluate(async(browserWSEndpoint, serverConfig) => {
|
|
const puppeteer = require('puppeteer');
|
|
const browser = await puppeteer.connect({browserWSEndpoint});
|
|
const page = await browser.newPage();
|
|
await page.goto(serverConfig.EMPTY_PAGE);
|
|
}, browser2.wsEndpoint(), serverConfig);
|
|
const pageURLs = (await browser2.pages()).map(page => page.url()).sort();
|
|
expect(pageURLs).toEqual([
|
|
'about:blank',
|
|
serverConfig.EMPTY_PAGE
|
|
]);
|
|
await browser2.close();
|
|
});
|
|
it('should work over exposed DevTools protocol', async({browser, page, serverConfig}) => {
|
|
// Expose devtools protocol binding into page.
|
|
const session = await browser.target().createCDPSession();
|
|
const pageInfo = (await session.send('Target.getTargets')).targetInfos.find(info => info.attached);
|
|
await session.send('Target.exposeDevToolsProtocol', {targetId: pageInfo.targetId});
|
|
await session.detach();
|
|
|
|
// Use in-page puppeteer to create a new page and navigate it to the EMPTY_PAGE
|
|
await page.evaluate(async serverConfig => {
|
|
const puppeteer = require('puppeteer');
|
|
window.cdp.close = () => {};
|
|
const browser = await puppeteer.connect({transport: window.cdp});
|
|
const page = await browser.newPage();
|
|
await page.goto(serverConfig.EMPTY_PAGE);
|
|
}, serverConfig);
|
|
const pageURLs = (await browser.pages()).map(page => page.url()).sort();
|
|
expect(pageURLs).toEqual([
|
|
'about:blank',
|
|
'about:blank',
|
|
serverConfig.EMPTY_PAGE
|
|
]);
|
|
});
|
|
});
|
|
|
|
if (process.env.CI && testRunner.hasFocusedTestsOrSuites()) {
|
|
console.error('ERROR: "focused" tests/suites are prohibitted on bots. Remove any "fit"/"fdescribe" declarations.');
|
|
process.exit(1);
|
|
}
|
|
|
|
new Reporter(testRunner);
|
|
testRunner.run();
|