diff --git a/test/src/CDPSession.spec.ts b/test/src/CDPSession.spec.ts
index 0e01a197..b059e727 100644
--- a/test/src/CDPSession.spec.ts
+++ b/test/src/CDPSession.spec.ts
@@ -61,7 +61,7 @@ describe('Target.createCDPSession', function () {
const client = await page.target().createCDPSession();
await client.send('Network.enable');
- const events = [];
+ const events: unknown[] = [];
client.on('Network.requestWillBeSent', event => {
return events.push(event);
});
@@ -69,7 +69,7 @@ describe('Target.createCDPSession', function () {
waitEvent(client, 'Network.requestWillBeSent'),
page.goto(server.EMPTY_PAGE),
]);
- expect(events.length).toBe(1);
+ expect(events).toHaveLength(1);
});
it('should enable and disable domains independently', async () => {
const {page} = getTestState();
diff --git a/test/src/EventEmitter.spec.ts b/test/src/EventEmitter.spec.ts
index 2b4eda86..ef5a6cc0 100644
--- a/test/src/EventEmitter.spec.ts
+++ b/test/src/EventEmitter.spec.ts
@@ -40,7 +40,7 @@ describe('EventEmitter', () => {
emitter[methodName]('foo', listener);
emitter.emit('foo', data);
expect(listener.callCount).toEqual(1);
- expect(listener.firstCall.args[0]!).toBe(data);
+ expect(listener.firstCall.args[0]).toBe(data);
});
it(`${methodName}: supports chaining`, () => {
@@ -116,7 +116,7 @@ describe('EventEmitter', () => {
emitter.emit('foo', data);
expect(listener.callCount).toEqual(1);
- expect(listener.firstCall.args[0]!).toBe(data);
+ expect(listener.firstCall.args[0]).toBe(data);
});
it('returns true if the event has listeners', () => {
diff --git a/test/src/NetworkManager.spec.ts b/test/src/NetworkManager.spec.ts
index 56945d59..db73f6e6 100644
--- a/test/src/NetworkManager.spec.ts
+++ b/test/src/NetworkManager.spec.ts
@@ -551,7 +551,7 @@ describe('NetworkManager', () => {
networkId: '11ACE9783588040D644B905E8B55285B',
});
- expect(requests.length).toBe(2);
+ expect(requests).toHaveLength(2);
});
it(`should handle Network.responseReceivedExtraInfo event after Network.responseReceived event (github.com/puppeteer/puppeteer/issues/8234)`, async () => {
const mockCDPSession = new MockCDPSession();
@@ -668,7 +668,7 @@ describe('NetworkManager', () => {
shouldReportCorbBlocking: false,
});
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
});
it(`should resolve the response once the late responseReceivedExtraInfo event arrives`, async () => {
@@ -796,8 +796,8 @@ describe('NetworkManager', () => {
shouldReportCorbBlocking: false,
});
- expect(pendingRequests.length).toBe(1);
- expect(finishedRequests.length).toBe(0);
+ expect(pendingRequests).toHaveLength(1);
+ expect(finishedRequests).toHaveLength(0);
expect(pendingRequests[0]!.response()).toEqual(null);
// The extra info might arrive late.
@@ -818,8 +818,8 @@ describe('NetworkManager', () => {
'HTTP/1.1 200 OK\\r\\nCache-Control: no-cache, no-store\\r\\nContent-Type: text/html; charset=utf-8\\r\\nDate: Wed, 10 Aug 2022 09:04:39 GMT\\r\\nConnection: keep-alive\\r\\nKeep-Alive: timeout=5\\r\\nContent-Length: 0\\r\\n\\r\\n',
});
- expect(pendingRequests.length).toBe(1);
- expect(finishedRequests.length).toBe(1);
+ expect(pendingRequests).toHaveLength(1);
+ expect(finishedRequests).toHaveLength(1);
expect(pendingRequests[0]!.response()).not.toEqual(null);
});
@@ -981,8 +981,8 @@ describe('NetworkManager', () => {
frameId: '07D18B8630A8161C72B6079B74123D60',
});
- expect(requests.length).toBe(1);
- expect(responses.length).toBe(1);
+ expect(requests).toHaveLength(1);
+ expect(responses).toHaveLength(1);
expect(requests[0]!.response()).not.toEqual(null);
});
@@ -1127,8 +1127,8 @@ describe('NetworkManager', () => {
'HTTP/1.1 200 OK\r\nCache-Control: no-cache, no-store\r\nContent-Type: text/html; charset=utf-8\r\nDate: Wed, 10 Aug 2022 11:21:22 GMT\r\nConnection: keep-alive\r\nKeep-Alive: timeout=5\r\nContent-Length: 0\r\n\r\n',
});
- expect(requests.length).toBe(1);
- expect(responses.length).toBe(1);
+ expect(requests).toHaveLength(1);
+ expect(responses).toHaveLength(1);
expect(requests[0]!.response()).not.toEqual(null);
});
diff --git a/test/src/TargetManager.spec.ts b/test/src/TargetManager.spec.ts
index f0b0a458..282086ed 100644
--- a/test/src/TargetManager.spec.ts
+++ b/test/src/TargetManager.spec.ts
@@ -21,7 +21,7 @@ import {
} from 'puppeteer-core/internal/common/Browser.js';
import {getTestState} from './mocha-utils'; // eslint-disable-line import/extensions
-import utils from './utils.js';
+import {attachFrame} from './utils.js';
describe('TargetManager', () => {
/* We use a special browser for this test as we need the --site-per-process flag */
@@ -74,7 +74,7 @@ describe('TargetManager', () => {
let framePromise = page.waitForFrame(frame => {
return frame.url().endsWith('/empty.html');
});
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
await framePromise;
expect(await context.pages()).toHaveLength(1);
expect(targetManager.getAvailableTargets().size).toBe(3);
@@ -84,7 +84,7 @@ describe('TargetManager', () => {
framePromise = page.waitForFrame(frame => {
return frame.url() === server.CROSS_PROCESS_PREFIX + '/empty.html';
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame2',
server.CROSS_PROCESS_PREFIX + '/empty.html'
@@ -97,7 +97,7 @@ describe('TargetManager', () => {
framePromise = page.waitForFrame(frame => {
return frame.url() === server.CROSS_PROCESS_PREFIX + '/empty.html';
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame3',
server.CROSS_PROCESS_PREFIX + '/empty.html'
diff --git a/test/src/accessibility.spec.ts b/test/src/accessibility.spec.ts
index d319d230..3ab518e7 100644
--- a/test/src/accessibility.spec.ts
+++ b/test/src/accessibility.spec.ts
@@ -220,7 +220,7 @@ describe('Accessibility', function () {
// See https://chromium-review.googlesource.com/c/chromium/src/+/3088862
assert(snapshot);
assert(snapshot.children);
- assert(snapshot.children[0]!);
+ assert(snapshot.children[0]);
expect(snapshot.children[0]!.roledescription).toBeUndefined();
});
it('orientation', async () => {
@@ -232,7 +232,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- assert(snapshot.children[0]!);
+ assert(snapshot.children[0]);
expect(snapshot.children[0]!.orientation).toEqual('vertical');
});
it('autocomplete', async () => {
@@ -242,7 +242,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- assert(snapshot.children[0]!);
+ assert(snapshot.children[0]);
expect(snapshot.children[0]!.autocomplete).toEqual('list');
});
it('multiselectable', async () => {
@@ -254,7 +254,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- assert(snapshot.children[0]!);
+ assert(snapshot.children[0]);
expect(snapshot.children[0]!.multiselectable).toEqual(true);
});
it('keyshortcuts', async () => {
@@ -266,7 +266,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- assert(snapshot.children[0]!);
+ assert(snapshot.children[0]);
expect(snapshot.children[0]!.keyshortcuts).toEqual('foo');
});
describe('filtering children of leaf nodes', function () {
@@ -351,7 +351,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- expect(snapshot.children[0]!).toEqual(golden);
+ expect(snapshot.children[0]).toEqual(golden);
});
it('rich text editable fields with role should have children', async () => {
const {page, isFirefox} = getTestState();
@@ -388,7 +388,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- expect(snapshot.children[0]!).toEqual(golden);
+ expect(snapshot.children[0]).toEqual(golden);
});
// Firefox does not support contenteditable="plaintext-only".
@@ -401,7 +401,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- expect(snapshot.children[0]!).toEqual({
+ expect(snapshot.children[0]).toEqual({
role: 'textbox',
name: '',
value: 'Edit this image:',
@@ -431,7 +431,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- expect(snapshot.children[0]!).toEqual(golden);
+ expect(snapshot.children[0]).toEqual(golden);
});
it('checkbox with and tabIndex and label should not have children', async () => {
const {page, isFirefox} = getTestState();
@@ -455,7 +455,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- expect(snapshot.children[0]!).toEqual(golden);
+ expect(snapshot.children[0]).toEqual(golden);
});
it('checkbox without label should not have children', async () => {
const {page, isFirefox} = getTestState();
@@ -479,7 +479,7 @@ describe('Accessibility', function () {
const snapshot = await page.accessibility.snapshot();
assert(snapshot);
assert(snapshot.children);
- expect(snapshot.children[0]!).toEqual(golden);
+ expect(snapshot.children[0]).toEqual(golden);
});
describe('root option', function () {
diff --git a/test/src/ariaqueryhandler.spec.ts b/test/src/ariaqueryhandler.spec.ts
index 77148fdb..52fe9999 100644
--- a/test/src/ariaqueryhandler.spec.ts
+++ b/test/src/ariaqueryhandler.spec.ts
@@ -25,7 +25,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils from './utils.js';
+import {attachFrame, detachFrame} from './utils.js';
describe('AriaQueryHandler', () => {
setupTestBrowserHooks();
@@ -331,7 +331,7 @@ describe('AriaQueryHandler', () => {
const {page, server} = getTestState();
await page.goto(server.EMPTY_PAGE);
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
const otherFrame = page.frames()[1];
const watchdog = page.waitForSelector('aria/[role="button"]');
await otherFrame!.evaluate(addElement, 'button');
@@ -343,8 +343,8 @@ describe('AriaQueryHandler', () => {
it('should run in specified frame', async () => {
const {page, server} = getTestState();
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
- await utils.attachFrame(page, 'frame2', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame2', server.EMPTY_PAGE);
const frame1 = page.frames()[1];
const frame2 = page.frames()[2];
const waitForSelectorPromise = frame2!.waitForSelector(
@@ -359,7 +359,7 @@ describe('AriaQueryHandler', () => {
it('should throw when frame is detached', async () => {
const {page, server} = getTestState();
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
const frame = page.frames()[1];
let waitError!: Error;
const waitPromise = frame!
@@ -367,7 +367,7 @@ describe('AriaQueryHandler', () => {
.catch(error => {
return (waitError = error);
});
- await utils.detachFrame(page, 'frame1');
+ await detachFrame(page, 'frame1');
await waitPromise;
expect(waitError).toBeTruthy();
expect(waitError.message).toContain(
diff --git a/test/src/browsercontext.spec.ts b/test/src/browsercontext.spec.ts
index 56767a6c..d17d7745 100644
--- a/test/src/browsercontext.spec.ts
+++ b/test/src/browsercontext.spec.ts
@@ -24,7 +24,7 @@ describe('BrowserContext', function () {
setupTestBrowserHooks();
it('should have default context', async () => {
const {browser} = getTestState();
- expect(browser.browserContexts().length).toEqual(1);
+ expect(browser.browserContexts()).toHaveLength(1);
const defaultContext = browser.browserContexts()[0]!;
expect(defaultContext!.isIncognito()).toBe(false);
let error!: Error;
@@ -37,26 +37,26 @@ describe('BrowserContext', function () {
it('should create new incognito context', async () => {
const {browser} = getTestState();
- expect(browser.browserContexts().length).toBe(1);
+ expect(browser.browserContexts()).toHaveLength(1);
const context = await browser.createIncognitoBrowserContext();
expect(context.isIncognito()).toBe(true);
- expect(browser.browserContexts().length).toBe(2);
+ expect(browser.browserContexts()).toHaveLength(2);
expect(browser.browserContexts().indexOf(context) !== -1).toBe(true);
await context.close();
- expect(browser.browserContexts().length).toBe(1);
+ expect(browser.browserContexts()).toHaveLength(1);
});
it('should close all belonging targets once closing context', async () => {
const {browser} = getTestState();
- expect((await browser.pages()).length).toBe(1);
+ expect(await browser.pages()).toHaveLength(1);
const context = await browser.createIncognitoBrowserContext();
await context.newPage();
- expect((await browser.pages()).length).toBe(2);
- expect((await context.pages()).length).toBe(1);
+ expect(await browser.pages()).toHaveLength(2);
+ expect(await context.pages()).toHaveLength(1);
await context.close();
- expect((await browser.pages()).length).toBe(1);
+ expect(await browser.pages()).toHaveLength(1);
});
it('window.open should use parent tab context', async () => {
const {browser, server} = getTestState();
@@ -160,8 +160,8 @@ describe('BrowserContext', function () {
// Create two incognito contexts.
const context1 = await browser.createIncognitoBrowserContext();
const context2 = await browser.createIncognitoBrowserContext();
- expect(context1.targets().length).toBe(0);
- expect(context2.targets().length).toBe(0);
+ expect(context1.targets()).toHaveLength(0);
+ expect(context2.targets()).toHaveLength(0);
// Create a page in first incognito context.
const page1 = await context1.newPage();
@@ -171,8 +171,8 @@ describe('BrowserContext', function () {
document.cookie = 'name=page1';
});
- expect(context1.targets().length).toBe(1);
- expect(context2.targets().length).toBe(0);
+ expect(context1.targets()).toHaveLength(1);
+ expect(context2.targets()).toHaveLength(0);
// Create a page in second incognito context.
const page2 = await context2.newPage();
@@ -182,10 +182,10 @@ describe('BrowserContext', function () {
document.cookie = 'name=page2';
});
- expect(context1.targets().length).toBe(1);
- expect(context1.targets()[0]!).toBe(page1.target());
- expect(context2.targets().length).toBe(1);
- expect(context2.targets()[0]!).toBe(page2.target());
+ expect(context1.targets()).toHaveLength(1);
+ expect(context1.targets()[0]).toBe(page1.target());
+ expect(context2.targets()).toHaveLength(1);
+ expect(context2.targets()[0]).toBe(page2.target());
// Make sure pages don't share localstorage or cookies.
expect(
@@ -211,20 +211,20 @@ describe('BrowserContext', function () {
// Cleanup contexts.
await Promise.all([context1.close(), context2.close()]);
- expect(browser.browserContexts().length).toBe(1);
+ expect(browser.browserContexts()).toHaveLength(1);
});
it('should work across sessions', async () => {
const {browser, puppeteer} = getTestState();
- expect(browser.browserContexts().length).toBe(1);
+ expect(browser.browserContexts()).toHaveLength(1);
const context = await browser.createIncognitoBrowserContext();
- expect(browser.browserContexts().length).toBe(2);
+ expect(browser.browserContexts()).toHaveLength(2);
const remoteBrowser = await puppeteer.connect({
browserWSEndpoint: browser.wsEndpoint(),
});
const contexts = remoteBrowser.browserContexts();
- expect(contexts.length).toBe(2);
+ expect(contexts).toHaveLength(2);
remoteBrowser.disconnect();
await context.close();
});
@@ -232,11 +232,11 @@ describe('BrowserContext', function () {
it('should provide a context id', async () => {
const {browser} = getTestState();
- expect(browser.browserContexts().length).toBe(1);
+ expect(browser.browserContexts()).toHaveLength(1);
expect(browser.browserContexts()[0]!.id).toBeUndefined();
const context = await browser.createIncognitoBrowserContext();
- expect(browser.browserContexts().length).toBe(2);
+ expect(browser.browserContexts()).toHaveLength(2);
expect(browser.browserContexts()[1]!.id).toBeDefined();
await context.close();
});
diff --git a/test/src/chromiumonly.spec.ts b/test/src/chromiumonly.spec.ts
index 162b2244..8ddcfe33 100644
--- a/test/src/chromiumonly.spec.ts
+++ b/test/src/chromiumonly.spec.ts
@@ -22,6 +22,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
+import {waitEvent} from './utils.js';
describe('Chromium-Specific Launcher tests', function () {
describe('Puppeteer.launch |browserURL| option', function () {
@@ -107,7 +108,7 @@ describe('Chromium-Specific Launcher tests', function () {
const {defaultBrowserOptions, puppeteer} = getTestState();
const options = Object.assign({pipe: true}, defaultBrowserOptions);
const browser = await puppeteer.launch(options);
- expect((await browser.pages()).length).toBe(1);
+ expect(await browser.pages()).toHaveLength(1);
expect(browser.wsEndpoint()).toBe('');
const page = await browser.newPage();
expect(await page.evaluate('11 * 11')).toBe(121);
@@ -129,9 +130,7 @@ describe('Chromium-Specific Launcher tests', function () {
const {defaultBrowserOptions, puppeteer} = getTestState();
const options = Object.assign({pipe: true}, defaultBrowserOptions);
const browser = await puppeteer.launch(options);
- const disconnectedEventPromise = new Promise(resolve => {
- return browser.once('disconnected', resolve);
- });
+ const disconnectedEventPromise = waitEvent(browser, 'disconnected');
// Emulate user exiting browser.
browser.process()!.kill();
await disconnectedEventPromise;
diff --git a/test/src/click.spec.ts b/test/src/click.spec.ts
index 54e7375f..8e253f30 100644
--- a/test/src/click.spec.ts
+++ b/test/src/click.spec.ts
@@ -22,7 +22,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils from './utils.js';
+import {attachFrame} from './utils.js';
describe('Page.click', function () {
setupTestBrowserHooks();
@@ -426,7 +426,7 @@ describe('Page.click', function () {
await page.goto(server.EMPTY_PAGE);
await page.setContent('
spacer
');
- await utils.attachFrame(
+ await attachFrame(
page,
'button-test',
server.PREFIX + '/input/button.html'
@@ -449,7 +449,7 @@ describe('Page.click', function () {
await page.setContent(
'spacer
'
);
- await utils.attachFrame(
+ await attachFrame(
page,
'button-test',
server.CROSS_PROCESS_PREFIX + '/input/button.html'
@@ -475,7 +475,7 @@ describe('Page.click', function () {
})
).toBe(5);
await page.setContent('spacer
');
- await utils.attachFrame(
+ await attachFrame(
page,
'button-test',
server.PREFIX + '/input/button.html'
diff --git a/test/src/cookies.spec.ts b/test/src/cookies.spec.ts
index 3e4b8b7b..2a048bd0 100644
--- a/test/src/cookies.spec.ts
+++ b/test/src/cookies.spec.ts
@@ -63,7 +63,7 @@ describe('Cookie specs', () => {
});
await page.goto(server.EMPTY_PAGE);
const cookies = await page.cookies();
- expect(cookies.length).toBe(1);
+ expect(cookies).toHaveLength(1);
expect(cookies[0]!.httpOnly).toBe(true);
});
it('should properly report "Strict" sameSite cookie', async () => {
@@ -74,7 +74,7 @@ describe('Cookie specs', () => {
});
await page.goto(server.EMPTY_PAGE);
const cookies = await page.cookies();
- expect(cookies.length).toBe(1);
+ expect(cookies).toHaveLength(1);
expect(cookies[0]!.sameSite).toBe('Strict');
});
it('should properly report "Lax" sameSite cookie', async () => {
@@ -85,7 +85,7 @@ describe('Cookie specs', () => {
});
await page.goto(server.EMPTY_PAGE);
const cookies = await page.cookies();
- expect(cookies.length).toBe(1);
+ expect(cookies).toHaveLength(1);
expect(cookies[0]!.sameSite).toBe('Lax');
});
it('should get multiple cookies', async () => {
@@ -212,8 +212,8 @@ describe('Cookie specs', () => {
const cookies1 = await page.cookies();
const cookies2 = await anotherPage.cookies();
- expect(cookies1.length).toBe(1);
- expect(cookies2.length).toBe(1);
+ expect(cookies1).toHaveLength(1);
+ expect(cookies2).toHaveLength(1);
expect(cookies1[0]!.name).toBe('page1cookie');
expect(cookies1[0]!.value).toBe('page1value');
expect(cookies2[0]!.name).toBe('page2cookie');
diff --git a/test/src/coverage.spec.ts b/test/src/coverage.spec.ts
index 514966a9..7c93fc73 100644
--- a/test/src/coverage.spec.ts
+++ b/test/src/coverage.spec.ts
@@ -34,7 +34,7 @@ describe('Coverage specs', function () {
waitUntil: 'networkidle0',
});
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.url).toContain('/jscoverage/simple.html');
expect(coverage[0]!.ranges).toEqual([
{start: 0, end: 17},
@@ -47,7 +47,7 @@ describe('Coverage specs', function () {
await page.coverage.startJSCoverage();
await page.goto(server.PREFIX + '/jscoverage/sourceurl.html');
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.url).toBe('nicename.js');
});
it('should ignore eval() scripts by default', async () => {
@@ -56,7 +56,7 @@ describe('Coverage specs', function () {
await page.coverage.startJSCoverage();
await page.goto(server.PREFIX + '/jscoverage/eval.html');
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
});
it("shouldn't ignore eval() scripts if reportAnonymousScripts is true", async () => {
const {page, server} = getTestState();
@@ -69,7 +69,7 @@ describe('Coverage specs', function () {
return entry.url.startsWith('debugger://');
})
).not.toBe(null);
- expect(coverage.length).toBe(2);
+ expect(coverage).toHaveLength(2);
});
it('should ignore pptr internal scripts if reportAnonymousScripts is true', async () => {
const {page, server} = getTestState();
@@ -81,7 +81,7 @@ describe('Coverage specs', function () {
return console.log('bar');
});
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(0);
+ expect(coverage).toHaveLength(0);
});
it('should report multiple scripts', async () => {
const {page, server} = getTestState();
@@ -89,7 +89,7 @@ describe('Coverage specs', function () {
await page.coverage.startJSCoverage();
await page.goto(server.PREFIX + '/jscoverage/multiple.html');
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(2);
+ expect(coverage).toHaveLength(2);
coverage.sort((a, b) => {
return a.url.localeCompare(b.url);
});
@@ -102,9 +102,9 @@ describe('Coverage specs', function () {
await page.coverage.startJSCoverage();
await page.goto(server.PREFIX + '/jscoverage/ranges.html');
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
const entry = coverage[0]!;
- expect(entry.ranges.length).toBe(2);
+ expect(entry.ranges).toHaveLength(2);
const range1 = entry.ranges[0]!;
expect(entry.text.substring(range1.start, range1.end)).toBe('\n');
const range2 = entry.ranges[1]!;
@@ -122,9 +122,9 @@ describe('Coverage specs', function () {
await page.coverage.startJSCoverage(coverageOptions);
await page.goto(server.PREFIX + '/jscoverage/ranges.html');
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
const entry = coverage[0]!;
- expect(entry.ranges.length).toBe(2);
+ expect(entry.ranges).toHaveLength(2);
const range1 = entry.ranges[0]!;
expect(entry.text.substring(range1.start, range1.end)).toBe('\n');
const range2 = entry.ranges[1]!;
@@ -138,10 +138,10 @@ describe('Coverage specs', function () {
await page.coverage.startJSCoverage();
await page.goto(server.PREFIX + '/jscoverage/unused.html');
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
const entry = coverage[0]!;
expect(entry.url).toContain('unused.html');
- expect(entry.ranges.length).toBe(0);
+ expect(entry.ranges).toHaveLength(0);
});
it('should work with conditionals', async () => {
const {page, server} = getTestState();
@@ -172,7 +172,7 @@ describe('Coverage specs', function () {
await page.goto(server.PREFIX + '/jscoverage/multiple.html');
await page.goto(server.EMPTY_PAGE);
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(2);
+ expect(coverage).toHaveLength(2);
});
it('should NOT report scripts across navigations when enabled', async () => {
@@ -182,7 +182,7 @@ describe('Coverage specs', function () {
await page.goto(server.PREFIX + '/jscoverage/multiple.html');
await page.goto(server.EMPTY_PAGE);
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(0);
+ expect(coverage).toHaveLength(0);
});
});
describe('includeRawScriptCoverage', function () {
@@ -193,7 +193,7 @@ describe('Coverage specs', function () {
waitUntil: 'networkidle0',
});
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.rawScriptCoverage).toBeUndefined();
});
it('should include rawScriptCoverage field when enabled', async () => {
@@ -205,7 +205,7 @@ describe('Coverage specs', function () {
waitUntil: 'networkidle0',
});
const coverage = await page.coverage.stopJSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.rawScriptCoverage).toBeTruthy();
});
});
@@ -232,7 +232,7 @@ describe('Coverage specs', function () {
await page.coverage.startCSSCoverage();
await page.goto(server.PREFIX + '/csscoverage/simple.html');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.url).toContain('/csscoverage/simple.html');
expect(coverage[0]!.ranges).toEqual([{start: 1, end: 22}]);
const range = coverage[0]!.ranges[0]!;
@@ -246,7 +246,7 @@ describe('Coverage specs', function () {
await page.coverage.startCSSCoverage();
await page.goto(server.PREFIX + '/csscoverage/sourceurl.html');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.url).toBe('nicename.css');
});
it('should report multiple stylesheets', async () => {
@@ -255,7 +255,7 @@ describe('Coverage specs', function () {
await page.coverage.startCSSCoverage();
await page.goto(server.PREFIX + '/csscoverage/multiple.html');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(2);
+ expect(coverage).toHaveLength(2);
coverage.sort((a, b) => {
return a.url.localeCompare(b.url);
});
@@ -268,9 +268,9 @@ describe('Coverage specs', function () {
await page.coverage.startCSSCoverage();
await page.goto(server.PREFIX + '/csscoverage/unused.html');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.url).toBe('unused.css');
- expect(coverage[0]!.ranges.length).toBe(0);
+ expect(coverage[0]!.ranges).toHaveLength(0);
});
it('should work with media queries', async () => {
const {page, server} = getTestState();
@@ -278,7 +278,7 @@ describe('Coverage specs', function () {
await page.coverage.startCSSCoverage();
await page.goto(server.PREFIX + '/csscoverage/media.html');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.url).toContain('/csscoverage/media.html');
expect(coverage[0]!.ranges).toEqual([{start: 8, end: 40}]);
});
@@ -298,7 +298,7 @@ describe('Coverage specs', function () {
await page.coverage.startCSSCoverage();
await page.goto(server.PREFIX + '/csscoverage/empty.html');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toEqual(1);
+ expect(coverage).toHaveLength(1);
expect(coverage[0]!.text).toEqual('');
});
it('should ignore injected stylesheets', async () => {
@@ -312,7 +312,7 @@ describe('Coverage specs', function () {
});
expect(margin).toBe('10px');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(0);
+ expect(coverage).toHaveLength(0);
});
it('should work with a recently loaded stylesheet', async () => {
const {page, server} = getTestState();
@@ -330,7 +330,7 @@ describe('Coverage specs', function () {
});
}, server.PREFIX + '/csscoverage/stylesheet1.css');
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(1);
+ expect(coverage).toHaveLength(1);
});
describe('resetOnNavigation', function () {
it('should report stylesheets across navigations', async () => {
@@ -340,7 +340,7 @@ describe('Coverage specs', function () {
await page.goto(server.PREFIX + '/csscoverage/multiple.html');
await page.goto(server.EMPTY_PAGE);
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(2);
+ expect(coverage).toHaveLength(2);
});
it('should NOT report scripts across navigations', async () => {
const {page, server} = getTestState();
@@ -349,7 +349,7 @@ describe('Coverage specs', function () {
await page.goto(server.PREFIX + '/csscoverage/multiple.html');
await page.goto(server.EMPTY_PAGE);
const coverage = await page.coverage.stopCSSCoverage();
- expect(coverage.length).toBe(0);
+ expect(coverage).toHaveLength(0);
});
});
});
diff --git a/test/src/drag-and-drop.spec.ts b/test/src/drag-and-drop.spec.ts
index a448083f..cb46b5e6 100644
--- a/test/src/drag-and-drop.spec.ts
+++ b/test/src/drag-and-drop.spec.ts
@@ -49,7 +49,7 @@ describe('Input.drag', function () {
const draggable = (await page.$('#drag'))!;
const data = await draggable.drag({x: 1, y: 1});
- expect(data.items.length).toBe(1);
+ expect(data.items).toHaveLength(1);
expect(
await page.evaluate(() => {
return (globalThis as any).didDragStart;
diff --git a/test/src/elementhandle.spec.ts b/test/src/elementhandle.spec.ts
index eaf0bfc1..704c262d 100644
--- a/test/src/elementhandle.spec.ts
+++ b/test/src/elementhandle.spec.ts
@@ -25,7 +25,7 @@ import {
setupTestPageAndContextHooks,
shortWaitForArrayToHaveAtLeastNElements,
} from './mocha-utils.js';
-import utils from './utils.js';
+import {attachFrame} from './utils.js';
describe('ElementHandle specs', function () {
setupTestBrowserHooks();
@@ -103,7 +103,7 @@ describe('ElementHandle specs', function () {
await page.goto(server.PREFIX + '/resetcss.html');
// Step 1: Add Frame and position it absolutely.
- await utils.attachFrame(page, 'frame1', server.PREFIX + '/resetcss.html');
+ await attachFrame(page, 'frame1', server.PREFIX + '/resetcss.html');
await page.evaluate(() => {
const frame = document.querySelector('#frame1')!;
frame.style.position = 'absolute';
@@ -134,19 +134,19 @@ describe('ElementHandle specs', function () {
const box = (await divHandle.boxModel())!;
expect(box.width).toBe(6);
expect(box.height).toBe(7);
- expect(box.margin[0]!).toEqual({
+ expect(box.margin[0]).toEqual({
x: 1 + 4, // frame.left + div.left
y: 2 + 5,
});
- expect(box.border[0]!).toEqual({
+ expect(box.border[0]).toEqual({
x: 1 + 4 + 3, // frame.left + div.left + div.margin-left
y: 2 + 5,
});
- expect(box.padding[0]!).toEqual({
+ expect(box.padding[0]).toEqual({
x: 1 + 4 + 3 + 1, // frame.left + div.left + div.marginLeft + div.borderLeft
y: 2 + 5,
});
- expect(box.content[0]!).toEqual({
+ expect(box.content[0]).toEqual({
x: 1 + 4 + 3 + 1 + 2, // frame.left + div.left + div.marginLeft + div.borderLeft + dif.paddingLeft
y: 2 + 5,
});
@@ -166,10 +166,10 @@ describe('ElementHandle specs', function () {
const {page, server} = getTestState();
await page.goto(server.EMPTY_PAGE);
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
const elementHandle = (await page.$('#frame1'))!;
const frame = await elementHandle.contentFrame();
- expect(frame).toBe(page.frames()[1]!);
+ expect(frame).toBe(page.frames()[1]);
});
});
@@ -737,7 +737,7 @@ describe('ElementHandle specs', function () {
expect(element).toBeDefined();
const elements = await page.$$('getByClass/foo');
- expect(elements.length).toBe(3);
+ expect(elements).toHaveLength(3);
});
it('should eval when both queryOne and queryAll are registered', async () => {
const {page} = getTestState();
diff --git a/test/src/evaluation.spec.ts b/test/src/evaluation.spec.ts
index 525f5ad1..f8992b05 100644
--- a/test/src/evaluation.spec.ts
+++ b/test/src/evaluation.spec.ts
@@ -21,7 +21,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils from './utils.js';
+import {attachFrame} from './utils.js';
describe('Evaluation specs', function () {
setupTestBrowserHooks();
@@ -418,7 +418,7 @@ describe('Evaluation specs', function () {
it('should throw if elementHandles are from other frames', async () => {
const {page, server} = getTestState();
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
const bodyHandle = await page.frames()[1]!.$('body');
let error!: Error;
await page
@@ -544,8 +544,8 @@ describe('Evaluation specs', function () {
const {page, server} = getTestState();
await page.goto(server.EMPTY_PAGE);
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
- expect(page.frames().length).toBe(2);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ expect(page.frames()).toHaveLength(2);
await page.frames()[0]!.evaluate(() => {
return ((globalThis as any).FOO = 'foo');
});
@@ -567,7 +567,7 @@ describe('Evaluation specs', function () {
const {page, server} = getTestState();
await page.goto(server.PREFIX + '/frames/one-frame.html');
- expect(page.frames().length).toBe(2);
+ expect(page.frames()).toHaveLength(2);
expect(
await page.frames()[0]!.evaluate(() => {
return document.body.textContent!.trim();
diff --git a/test/src/fixtures.spec.ts b/test/src/fixtures.spec.ts
index 5e546f76..4065b867 100644
--- a/test/src/fixtures.spec.ts
+++ b/test/src/fixtures.spec.ts
@@ -21,6 +21,7 @@ import path from 'path';
import expect from 'expect';
import {getTestState} from './mocha-utils.js';
+import {waitEvent} from './utils.js';
describe('Fixtures', function () {
it('dumpio option should work with pipe option', async () => {
@@ -96,9 +97,7 @@ describe('Fixtures', function () {
browserWSEndpoint: await wsEndPointPromise,
});
const promises = [
- new Promise(resolve => {
- return browser.once('disconnected', resolve);
- }),
+ waitEvent(browser, 'disconnected'),
new Promise(resolve => {
return res.on('close', resolve);
}),
diff --git a/test/src/frame.spec.ts b/test/src/frame.spec.ts
index d8fa7ee0..4d4d05cc 100644
--- a/test/src/frame.spec.ts
+++ b/test/src/frame.spec.ts
@@ -23,7 +23,13 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils, {dumpFrames} from './utils.js';
+import {
+ attachFrame,
+ detachFrame,
+ dumpFrames,
+ navigateFrame,
+ waitEvent,
+} from './utils.js';
describe('Frame specs', function () {
setupTestBrowserHooks();
@@ -34,8 +40,8 @@ describe('Frame specs', function () {
const {page, server} = getTestState();
await page.goto(server.EMPTY_PAGE);
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
- expect(page.frames().length).toBe(2);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ expect(page.frames()).toHaveLength(2);
const [frame1, frame2] = page.frames();
const context1 = await frame1!.executionContext();
const context2 = await frame2!.executionContext();
@@ -83,12 +89,8 @@ describe('Frame specs', function () {
it('should throw for detached frames', async () => {
const {page, server} = getTestState();
- const frame1 = (await utils.attachFrame(
- page,
- 'frame1',
- server.EMPTY_PAGE
- ))!;
- await utils.detachFrame(page, 'frame1');
+ const frame1 = (await attachFrame(page, 'frame1', server.EMPTY_PAGE))!;
+ await detachFrame(page, 'frame1');
let error!: Error;
await frame1
.evaluate(() => {
@@ -147,8 +149,8 @@ describe('Frame specs', function () {
page.on('frameattached', frame => {
return attachedFrames.push(frame);
});
- await utils.attachFrame(page, 'frame1', './assets/frame.html');
- expect(attachedFrames.length).toBe(1);
+ await attachFrame(page, 'frame1', './assets/frame.html');
+ expect(attachedFrames).toHaveLength(1);
expect(attachedFrames[0]!.url()).toContain('/assets/frame.html');
// validate framenavigated events
@@ -156,8 +158,8 @@ describe('Frame specs', function () {
page.on('framenavigated', frame => {
return navigatedFrames.push(frame);
});
- await utils.navigateFrame(page, 'frame1', './empty.html');
- expect(navigatedFrames.length).toBe(1);
+ await navigateFrame(page, 'frame1', './empty.html');
+ expect(navigatedFrames).toHaveLength(1);
expect(navigatedFrames[0]!.url()).toBe(server.EMPTY_PAGE);
// validate framedetached events
@@ -165,8 +167,8 @@ describe('Frame specs', function () {
page.on('framedetached', frame => {
return detachedFrames.push(frame);
});
- await utils.detachFrame(page, 'frame1');
- expect(detachedFrames.length).toBe(1);
+ await detachFrame(page, 'frame1');
+ expect(detachedFrames).toHaveLength(1);
expect(detachedFrames[0]!.isDetached()).toBe(true);
});
it('should send "framenavigated" when navigating on anchor URLs', async () => {
@@ -175,7 +177,7 @@ describe('Frame specs', function () {
await page.goto(server.EMPTY_PAGE);
await Promise.all([
page.goto(server.EMPTY_PAGE + '#foo'),
- utils.waitEvent(page, 'framenavigated'),
+ waitEvent(page, 'framenavigated'),
]);
expect(page.url()).toBe(server.EMPTY_PAGE + '#foo');
});
@@ -203,9 +205,9 @@ describe('Frame specs', function () {
it('should detach child frames on navigation', async () => {
const {page, server} = getTestState();
- let attachedFrames = [];
- let detachedFrames = [];
- let navigatedFrames = [];
+ let attachedFrames: Frame[] = [];
+ let detachedFrames: Frame[] = [];
+ let navigatedFrames: Frame[] = [];
page.on('frameattached', frame => {
return attachedFrames.push(frame);
});
@@ -216,24 +218,24 @@ describe('Frame specs', function () {
return navigatedFrames.push(frame);
});
await page.goto(server.PREFIX + '/frames/nested-frames.html');
- expect(attachedFrames.length).toBe(4);
- expect(detachedFrames.length).toBe(0);
- expect(navigatedFrames.length).toBe(5);
+ expect(attachedFrames).toHaveLength(4);
+ expect(detachedFrames).toHaveLength(0);
+ expect(navigatedFrames).toHaveLength(5);
attachedFrames = [];
detachedFrames = [];
navigatedFrames = [];
await page.goto(server.EMPTY_PAGE);
- expect(attachedFrames.length).toBe(0);
- expect(detachedFrames.length).toBe(4);
- expect(navigatedFrames.length).toBe(1);
+ expect(attachedFrames).toHaveLength(0);
+ expect(detachedFrames).toHaveLength(4);
+ expect(navigatedFrames).toHaveLength(1);
});
it('should support framesets', async () => {
const {page, server} = getTestState();
- let attachedFrames = [];
- let detachedFrames = [];
- let navigatedFrames = [];
+ let attachedFrames: Frame[] = [];
+ let detachedFrames: Frame[] = [];
+ let navigatedFrames: Frame[] = [];
page.on('frameattached', frame => {
return attachedFrames.push(frame);
});
@@ -244,17 +246,17 @@ describe('Frame specs', function () {
return navigatedFrames.push(frame);
});
await page.goto(server.PREFIX + '/frames/frameset.html');
- expect(attachedFrames.length).toBe(4);
- expect(detachedFrames.length).toBe(0);
- expect(navigatedFrames.length).toBe(5);
+ expect(attachedFrames).toHaveLength(4);
+ expect(detachedFrames).toHaveLength(0);
+ expect(navigatedFrames).toHaveLength(5);
attachedFrames = [];
detachedFrames = [];
navigatedFrames = [];
await page.goto(server.EMPTY_PAGE);
- expect(attachedFrames.length).toBe(0);
- expect(detachedFrames.length).toBe(4);
- expect(navigatedFrames.length).toBe(1);
+ expect(attachedFrames).toHaveLength(0);
+ expect(detachedFrames).toHaveLength(4);
+ expect(navigatedFrames).toHaveLength(1);
});
it('should report frame from-inside shadow DOM', async () => {
const {page, server} = getTestState();
@@ -268,13 +270,13 @@ describe('Frame specs', function () {
return (frame.onload = x);
});
}, server.EMPTY_PAGE);
- expect(page.frames().length).toBe(2);
+ expect(page.frames()).toHaveLength(2);
expect(page.frames()[1]!.url()).toBe(server.EMPTY_PAGE);
});
it('should report frame.name()', async () => {
const {page, server} = getTestState();
- await utils.attachFrame(page, 'theFrameId', server.EMPTY_PAGE);
+ await attachFrame(page, 'theFrameId', server.EMPTY_PAGE);
await page.evaluate((url: string) => {
const frame = document.createElement('iframe');
frame.name = 'theFrameName';
@@ -291,8 +293,8 @@ describe('Frame specs', function () {
it('should report frame.parent()', async () => {
const {page, server} = getTestState();
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
- await utils.attachFrame(page, 'frame2', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await 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());
@@ -300,14 +302,14 @@ describe('Frame specs', function () {
it('should report different frame instance when frame re-attaches', async () => {
const {page, server} = getTestState();
- const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ const frame1 = await attachFrame(page, 'frame1', server.EMPTY_PAGE);
await page.evaluate(() => {
(globalThis as any).frame = document.querySelector('#frame1');
(globalThis as any).frame.remove();
});
expect(frame1!.isDetached()).toBe(true);
const [frame2] = await Promise.all([
- utils.waitEvent(page, 'frameattached'),
+ waitEvent(page, 'frameattached'),
page.evaluate(() => {
return document.body.appendChild((globalThis as any).frame);
}),
@@ -320,7 +322,7 @@ describe('Frame specs', function () {
await page.goto(server.PREFIX + '/frames/one-frame-url-fragment.html');
- expect(page.frames().length).toBe(2);
+ expect(page.frames()).toHaveLength(2);
expect(page.frames()[1]!.url()).toBe(
server.PREFIX + '/frames/frame.html?param=value#fragment'
);
diff --git a/test/src/ignorehttpserrors.spec.ts b/test/src/ignorehttpserrors.spec.ts
index 367a29e2..8217092e 100644
--- a/test/src/ignorehttpserrors.spec.ts
+++ b/test/src/ignorehttpserrors.spec.ts
@@ -95,7 +95,7 @@ describe('ignoreHTTPSErrors', function () {
httpsServer.waitForRequest('/plzredirect'),
page.goto(httpsServer.PREFIX + '/plzredirect'),
]);
- expect(responses.length).toBe(2);
+ expect(responses).toHaveLength(2);
expect(responses[0]!.status()).toBe(302);
const securityDetails = responses[0]!.securityDetails()!;
const protocol = (serverRequest.socket as TLSSocket)
@@ -134,7 +134,7 @@ describe('ignoreHTTPSErrors', function () {
await page.goto(httpsServer.PREFIX + '/mixedcontent.html', {
waitUntil: 'load',
});
- expect(page.frames().length).toBe(2);
+ expect(page.frames()).toHaveLength(2);
// Make sure blocked iframe has functional execution context
// @see https://github.com/puppeteer/puppeteer/issues/2709
expect(await page.frames()[0]!.evaluate('1 + 2')).toBe(3);
diff --git a/test/src/input.spec.ts b/test/src/input.spec.ts
index 103eee08..5519fca4 100644
--- a/test/src/input.spec.ts
+++ b/test/src/input.spec.ts
@@ -24,6 +24,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
+import {waitEvent} from './utils.js';
const FILE_TO_UPLOAD = path.join(__dirname, '/../assets/file-to-upload.txt');
@@ -174,9 +175,7 @@ describe('input tests', function () {
]);
await Promise.all([
chooser.accept([FILE_TO_UPLOAD]),
- new Promise(x => {
- return page.once('metrics', x);
- }),
+ waitEvent(page, 'metrics'),
]);
expect(
await page.$eval('input', input => {
diff --git a/test/src/keyboard.spec.ts b/test/src/keyboard.spec.ts
index 7706691a..1ae6db22 100644
--- a/test/src/keyboard.spec.ts
+++ b/test/src/keyboard.spec.ts
@@ -24,7 +24,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils from './utils.js';
+import {attachFrame} from './utils.js';
describe('Keyboard', function () {
setupTestBrowserHooks();
@@ -503,7 +503,7 @@ describe('Keyboard', function () {
const {page, server} = getTestState();
await page.goto(server.EMPTY_PAGE);
- await utils.attachFrame(
+ await attachFrame(
page,
'emoji-test',
server.PREFIX + '/input/textarea.html'
diff --git a/test/src/launcher.spec.ts b/test/src/launcher.spec.ts
index 4cd6a1e1..9f1d271b 100644
--- a/test/src/launcher.spec.ts
+++ b/test/src/launcher.spec.ts
@@ -27,7 +27,7 @@ import {rmSync} from 'puppeteer-core/internal/node/util/fs.js';
import sinon from 'sinon';
import {getTestState, itOnlyRegularInstall} from './mocha-utils.js';
-import utils from './utils.js';
+import {dumpFrames, waitEvent} from './utils.js';
const TMP_FOLDER = path.join(os.tmpdir(), 'pptr_tmp_folder-');
const FIREFOX_TIMEOUT = 30 * 1000;
@@ -258,12 +258,12 @@ describe('Launcher specs', function () {
puppeteer.configuration.temporaryDirectory = testTmpDir;
// Path should be empty before starting the browser.
- expect(fs.readdirSync(testTmpDir).length).toEqual(0);
+ expect(fs.readdirSync(testTmpDir)).toHaveLength(0);
const browser = await puppeteer.launch(defaultBrowserOptions);
// One profile folder should have been created at this moment.
const profiles = fs.readdirSync(testTmpDir);
- expect(profiles.length).toEqual(1);
+ expect(profiles).toHaveLength(1);
expect(profiles[0]?.startsWith('puppeteer_dev_chrome_profile-')).toBe(
true
);
@@ -272,7 +272,7 @@ describe('Launcher specs', function () {
await browser.newPage();
await browser.close();
// Profile should be deleted after closing the browser
- expect(fs.readdirSync(testTmpDir).length).toEqual(0);
+ expect(fs.readdirSync(testTmpDir)).toHaveLength(0);
// Restore env var
puppeteer.configuration.temporaryDirectory = oldTmpDir;
@@ -523,7 +523,7 @@ describe('Launcher specs', function () {
options.args = [server.EMPTY_PAGE].concat(options.args || []);
const browser = await puppeteer.launch(options);
const pages = await browser.pages();
- expect(pages.length).toBe(1);
+ expect(pages).toHaveLength(1);
const page = pages[0]!;
if (page.url() !== server.EMPTY_PAGE) {
await page.waitForNavigation();
@@ -628,7 +628,7 @@ describe('Launcher specs', function () {
};
const browser = await puppeteer.launch(options);
const pages = await browser.pages();
- expect(pages.length).toBe(0);
+ expect(pages).toHaveLength(0);
await browser.close();
});
});
@@ -684,7 +684,7 @@ describe('Launcher specs', function () {
browserWSEndpoint: originalBrowser.wsEndpoint(),
});
await Promise.all([
- utils.waitEvent(originalBrowser, 'disconnected'),
+ waitEvent(originalBrowser, 'disconnected'),
remoteBrowser.close(),
]);
});
@@ -702,7 +702,7 @@ describe('Launcher specs', function () {
browserWSEndpoint: originalBrowser.wsEndpoint(),
});
await Promise.all([
- utils.waitEvent(originalBrowser, 'disconnected'),
+ waitEvent(originalBrowser, 'disconnected'),
remoteBrowser.close(),
]);
});
@@ -746,7 +746,7 @@ describe('Launcher specs', function () {
});
try {
const targets = browser.targets();
- expect(targets.length).toEqual(1);
+ expect(targets).toHaveLength(1);
expect(
targets.find(target => {
return target.type() === 'page';
@@ -806,7 +806,7 @@ describe('Launcher specs', function () {
const restoredPage = pages.find(page => {
return page.url() === server.PREFIX + '/frames/nested-frames.html';
})!;
- expect(utils.dumpFrames(restoredPage.mainFrame())).toEqual([
+ expect(dumpFrames(restoredPage.mainFrame())).toEqual([
'http://localhost:/frames/nested-frames.html',
' http://localhost:/frames/two-frames.html (2frames)',
' http://localhost:/frames/frame.html (uno)',
@@ -1024,7 +1024,7 @@ describe('Launcher specs', function () {
});
await Promise.all([
- utils.waitEvent(remoteBrowser2, 'disconnected'),
+ waitEvent(remoteBrowser2, 'disconnected'),
remoteBrowser2.disconnect(),
]);
@@ -1033,8 +1033,8 @@ describe('Launcher specs', function () {
expect(disconnectedRemote2).toBe(1);
await Promise.all([
- utils.waitEvent(remoteBrowser1, 'disconnected'),
- utils.waitEvent(originalBrowser, 'disconnected'),
+ waitEvent(remoteBrowser1, 'disconnected'),
+ waitEvent(originalBrowser, 'disconnected'),
originalBrowser.close(),
]);
diff --git a/test/src/mocha-utils.ts b/test/src/mocha-utils.ts
index e414f2a0..83468569 100644
--- a/test/src/mocha-utils.ts
+++ b/test/src/mocha-utils.ts
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-import * as fs from 'fs';
-import * as path from 'path';
+import fs from 'fs';
+import path from 'path';
import {TestServer} from '@pptr/testserver';
import {Protocol} from 'devtools-protocol';
diff --git a/test/src/navigation.spec.ts b/test/src/navigation.spec.ts
index ee5bf6b9..00b2e071 100644
--- a/test/src/navigation.spec.ts
+++ b/test/src/navigation.spec.ts
@@ -184,9 +184,9 @@ describe('navigation', function () {
expect(error.message).toContain('SSL_ERROR_UNKNOWN');
}
- expect(requests.length).toBe(2);
- expect(requests[0]!).toBe('request');
- expect(requests[1]!).toBe('requestfailed');
+ expect(requests).toHaveLength(2);
+ expect(requests[0]).toBe('request');
+ expect(requests[1]).toBe('requestfailed');
});
it('should fail when navigating to bad SSL after redirects', async () => {
const {page, server, httpsServer, isChrome} = getTestState();
@@ -383,9 +383,7 @@ describe('navigation', function () {
});
// Wait for the page's 'load' event.
- await new Promise(fulfill => {
- return page.once('load', fulfill);
- });
+ await waitEvent(page, 'load');
expect(navigationFinished).toBe(false);
// Wait for the initial three resources to be requested.
@@ -482,7 +480,7 @@ describe('navigation', function () {
const dataURL = 'data:text/html,yo
';
const response = (await page.goto(dataURL))!;
expect(response.status()).toBe(200);
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.url()).toBe(dataURL);
});
it('should navigate to URL with hash and fire requests without hash', async () => {
@@ -495,7 +493,7 @@ describe('navigation', function () {
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).toHaveLength(1);
expect(requests[0]!.url()).toBe(server.EMPTY_PAGE);
});
it('should work with self requesting page', async () => {
@@ -677,12 +675,8 @@ describe('navigation', function () {
server.PREFIX + '/frames/one-frame.html'
);
const frame = await waitEvent(page, 'frameattached');
- await new Promise(fulfill => {
- page.on('framenavigated', f => {
- if (f === frame) {
- fulfill();
- }
- });
+ await waitEvent(page, 'framenavigated', f => {
+ return f === frame;
});
await Promise.all([
frame.evaluate(() => {
@@ -740,7 +734,7 @@ describe('navigation', function () {
const response = (await page.frames()[1]!.goto(server.EMPTY_PAGE))!;
expect(response.ok()).toBe(true);
- expect(response.frame()).toBe(page.frames()[1]!);
+ expect(response.frame()).toBe(page.frames()[1]);
});
it('should reject when frame detaches', async () => {
const {page, server} = getTestState();
diff --git a/test/src/network.spec.ts b/test/src/network.spec.ts
index e609f57a..f3899a5f 100644
--- a/test/src/network.spec.ts
+++ b/test/src/network.spec.ts
@@ -27,7 +27,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import {attachFrame, isFavicon} from './utils.js';
+import {attachFrame, isFavicon, waitEvent} from './utils.js';
describe('network', function () {
setupTestBrowserHooks();
@@ -42,7 +42,7 @@ describe('network', function () {
return !isFavicon(request) && requests.push(request);
});
await page.goto(server.EMPTY_PAGE);
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
});
it('should fire for iframes', async () => {
const {page, server} = getTestState();
@@ -53,7 +53,7 @@ describe('network', function () {
});
await page.goto(server.EMPTY_PAGE);
await attachFrame(page, 'frame1', server.EMPTY_PAGE);
- expect(requests.length).toBe(2);
+ expect(requests).toHaveLength(2);
});
it('should fire for fetches', async () => {
const {page, server} = getTestState();
@@ -66,7 +66,7 @@ describe('network', function () {
await page.evaluate(() => {
return fetch('/empty.html');
});
- expect(requests.length).toBe(2);
+ expect(requests).toHaveLength(2);
});
});
describe('Request.frame', function () {
@@ -78,7 +78,7 @@ describe('network', function () {
return !isFavicon(request) && requests.push(request);
});
await page.goto(server.EMPTY_PAGE);
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.frame()).toBe(page.mainFrame());
});
it('should work for subframe navigation request', async () => {
@@ -90,8 +90,8 @@ describe('network', function () {
return !isFavicon(request) && requests.push(request);
});
await attachFrame(page, 'frame1', server.EMPTY_PAGE);
- expect(requests.length).toBe(1);
- expect(requests[0]!.frame()).toBe(page.frames()[1]!);
+ expect(requests).toHaveLength(1);
+ expect(requests[0]!.frame()).toBe(page.frames()[1]);
});
it('should work for fetch requests', async () => {
const {page, server} = getTestState();
@@ -107,7 +107,7 @@ describe('network', function () {
requests = requests.filter(request => {
return !request.url().includes('favicon');
});
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.frame()).toBe(page.mainFrame());
});
});
@@ -256,18 +256,19 @@ describe('network', function () {
server.setRoute('/post', (_req, res) => {
return res.end();
});
- let request!: HTTPRequest;
- page.on('request', r => {
- if (!isFavicon(r)) {
- request = r;
- }
- });
- await page.evaluate(() => {
- return fetch('./post', {
- method: 'POST',
- body: JSON.stringify({foo: 'bar'}),
- });
- });
+
+ const [request] = await Promise.all([
+ waitEvent(page, 'request', r => {
+ return !isFavicon(r);
+ }),
+ page.evaluate(() => {
+ return fetch('./post', {
+ method: 'POST',
+ body: JSON.stringify({foo: 'bar'}),
+ });
+ }),
+ ]);
+
expect(request).toBeTruthy();
expect(request.postData()).toBe('{"foo":"bar"}');
});
@@ -302,7 +303,7 @@ describe('network', function () {
server.setRedirect('/foo.html', '/empty.html');
const response = (await page.goto(server.PREFIX + '/foo.html'))!;
const redirectChain = response.request().redirectChain();
- expect(redirectChain.length).toBe(1);
+ expect(redirectChain).toHaveLength(1);
const redirected = redirectChain[0]!.response()!;
expect(redirected.status()).toBe(302);
let error!: Error;
@@ -404,17 +405,16 @@ describe('network', function () {
res.end('Hello World');
});
const url = server.CROSS_PROCESS_PREFIX + '/test.html';
- const responsePromise = new Promise(resolve => {
- page.on('response', response => {
+ const responsePromise = waitEvent(
+ page,
+ 'response',
+ response => {
// Get the preflight response.
- if (
- response.request().method() === 'OPTIONS' &&
- response.url() === url
- ) {
- resolve(response);
- }
- });
- });
+ return (
+ response.request().method() === 'OPTIONS' && response.url() === url
+ );
+ }
+ );
// Trigger a request with a preflight.
await page.evaluate(async src => {
@@ -464,7 +464,7 @@ describe('network', function () {
return responses.push(response);
});
await page.goto(server.EMPTY_PAGE);
- expect(responses.length).toBe(1);
+ expect(responses).toHaveLength(1);
expect(responses[0]!.timing()!.receiveHeadersEnd).toBeGreaterThan(0);
});
});
@@ -478,7 +478,7 @@ describe('network', function () {
return requests.push(request);
});
await page.goto(server.EMPTY_PAGE);
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.url()).toBe(server.EMPTY_PAGE);
expect(requests[0]!.resourceType()).toBe('document');
expect(requests[0]!.method()).toBe('GET');
@@ -508,7 +508,7 @@ describe('network', function () {
return responses.push(response);
});
await page.goto(server.EMPTY_PAGE);
- expect(responses.length).toBe(1);
+ expect(responses).toHaveLength(1);
expect(responses[0]!.url()).toBe(server.EMPTY_PAGE);
expect(responses[0]!.status()).toBe(200);
expect(responses[0]!.ok()).toBe(true);
@@ -537,7 +537,7 @@ describe('network', function () {
return failedRequests.push(request);
});
await page.goto(server.PREFIX + '/one-style.html');
- expect(failedRequests.length).toBe(1);
+ expect(failedRequests).toHaveLength(1);
expect(failedRequests[0]!.url()).toContain('one-style.css');
expect(failedRequests[0]!.response()).toBe(null);
expect(failedRequests[0]!.resourceType()).toBe('stylesheet');
@@ -558,7 +558,7 @@ describe('network', function () {
return requests.push(request);
});
await page.goto(server.EMPTY_PAGE);
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.url()).toBe(server.EMPTY_PAGE);
expect(requests[0]!.response()).toBeTruthy();
expect(requests[0]!.frame() === page.mainFrame()).toBe(true);
@@ -610,7 +610,7 @@ describe('network', function () {
// Check redirect chain
const redirectChain = response.request().redirectChain();
- expect(redirectChain.length).toBe(1);
+ expect(redirectChain).toHaveLength(1);
expect(redirectChain[0]!.url()).toContain('/foo.html');
expect(redirectChain[0]!.response()!.remoteAddress().port).toBe(
server.PORT
@@ -812,11 +812,7 @@ describe('network', function () {
res.end('hello world');
});
- const responsePromise = new Promise(resolve => {
- return page.on('response', response => {
- return resolve(response);
- });
- });
+ const responsePromise = waitEvent(page, 'response');
page.evaluate(() => {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/foo');
@@ -847,18 +843,16 @@ describe('network', function () {
});
await page.goto(httpsServer.PREFIX + '/setcookie.html');
const url = httpsServer.CROSS_PROCESS_PREFIX + '/setcookie.html';
- const response = await new Promise(resolve => {
- page.on('response', response => {
- if (response.url() === url) {
- resolve(response);
- }
- });
+ const [response] = await Promise.all([
+ waitEvent(page, 'response', response => {
+ return response.url() === url;
+ }),
page.evaluate(src => {
const xhr = new XMLHttpRequest();
xhr.open('GET', src);
xhr.send();
- }, url);
- });
+ }, url),
+ ]);
expect(response.headers()['set-cookie']).toBe(setCookieString);
} finally {
await page.close();
diff --git a/test/src/oopif.spec.ts b/test/src/oopif.spec.ts
index 1abc30f7..744b3108 100644
--- a/test/src/oopif.spec.ts
+++ b/test/src/oopif.spec.ts
@@ -20,7 +20,7 @@ import {BrowserContext} from 'puppeteer-core/internal/api/BrowserContext.js';
import {Page} from 'puppeteer-core/internal/api/Page.js';
import {describeWithDebugLogs, getTestState} from './mocha-utils.js';
-import utils from './utils.js';
+import {attachFrame, detachFrame, navigateFrame} from './utils.js';
describeWithDebugLogs('OOPIF', function () {
/* We use a special browser for this test as we need the --site-per-process flag */
@@ -61,8 +61,8 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return frame.url().endsWith('/empty.html');
});
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
- await utils.attachFrame(
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(
page,
'frame2',
server.CROSS_PROCESS_PREFIX + '/empty.html'
@@ -77,14 +77,14 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
);
const frame = await framePromise;
expect(frame.url()).toContain('/empty.html');
- await utils.navigateFrame(
+ await navigateFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/assets/frame.html'
@@ -98,17 +98,17 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
const frame = await framePromise;
expect(frame.isOOPFrame()).toBe(false);
- await utils.navigateFrame(
+ await navigateFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
);
expect(frame.isOOPFrame()).toBe(true);
- await utils.navigateFrame(page, 'frame1', server.EMPTY_PAGE);
+ await navigateFrame(page, 'frame1', server.EMPTY_PAGE);
expect(frame.isOOPFrame()).toBe(false);
expect(page.frames()).toHaveLength(2);
});
@@ -122,7 +122,7 @@ describeWithDebugLogs('OOPIF', function () {
const frame2Promise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 2;
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/frames/one-frame.html'
@@ -148,17 +148,17 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
const frame = await framePromise;
expect(frame.isOOPFrame()).toBe(false);
- await utils.navigateFrame(
+ await navigateFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
);
expect(frame.isOOPFrame()).toBe(true);
- await utils.detachFrame(page, 'frame1');
+ await detachFrame(page, 'frame1');
expect(page.frames()).toHaveLength(1);
});
@@ -169,19 +169,19 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
+ await attachFrame(page, 'frame1', server.EMPTY_PAGE);
const frame = await framePromise;
expect(frame.isOOPFrame()).toBe(false);
const nav = frame.waitForNavigation();
- await utils.navigateFrame(
+ await navigateFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
);
await nav;
expect(frame.isOOPFrame()).toBe(true);
- await utils.detachFrame(page, 'frame1');
+ await detachFrame(page, 'frame1');
expect(page.frames()).toHaveLength(1);
});
@@ -192,14 +192,14 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
);
const frame = await framePromise;
expect(frame.url()).toContain('/empty.html');
- await utils.navigateFrame(page, 'frame1', server.EMPTY_PAGE);
+ await navigateFrame(page, 'frame1', server.EMPTY_PAGE);
expect(frame.url()).toBe(server.EMPTY_PAGE);
});
@@ -210,7 +210,7 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
@@ -249,7 +249,7 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
@@ -282,8 +282,8 @@ describeWithDebugLogs('OOPIF', function () {
});
await page.goto(server.PREFIX + '/dynamic-oopif.html');
await frame;
- expect(oopifs(context).length).toBe(1);
- expect(page.frames().length).toBe(2);
+ expect(oopifs(context)).toHaveLength(1);
+ expect(page.frames()).toHaveLength(2);
});
it('should wait for inner OOPIFs', async () => {
@@ -292,12 +292,12 @@ describeWithDebugLogs('OOPIF', function () {
const frame2 = await page.waitForFrame(frame => {
return frame.url().endsWith('inner-frame2.html');
});
- expect(oopifs(context).length).toBe(2);
+ expect(oopifs(context)).toHaveLength(2);
expect(
page.frames().filter(frame => {
return frame.isOOPFrame();
- }).length
- ).toBe(2);
+ })
+ ).toHaveLength(2);
expect(
await frame2.evaluate(() => {
return document.querySelectorAll('button').length;
@@ -317,7 +317,7 @@ describeWithDebugLogs('OOPIF', function () {
});
await page.goto(server.PREFIX + '/dynamic-oopif.html');
await frame;
- expect(oopifs(context).length).toBe(1);
+ expect(oopifs(context)).toHaveLength(1);
});
it('should support frames within OOP iframes', async () => {
const {server} = getTestState();
@@ -327,7 +327,7 @@ describeWithDebugLogs('OOPIF', function () {
});
await page.goto(server.PREFIX + '/dynamic-oopif.html');
const oopIframe = await oopIframePromise;
- await utils.attachFrame(
+ await attachFrame(
oopIframe,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
@@ -335,7 +335,7 @@ describeWithDebugLogs('OOPIF', function () {
const frame1 = oopIframe.childFrames()[0]!;
expect(frame1.url()).toMatch(/empty.html$/);
- await utils.navigateFrame(
+ await navigateFrame(
oopIframe,
'frame1',
server.CROSS_PROCESS_PREFIX + '/oopif.html'
@@ -346,7 +346,7 @@ describeWithDebugLogs('OOPIF', function () {
{waitUntil: 'load'}
);
expect(frame1.url()).toMatch(/oopif.html#navigate-within-document$/);
- await utils.detachFrame(oopIframe, 'frame1');
+ await detachFrame(oopIframe, 'frame1');
expect(oopIframe.childFrames()).toHaveLength(0);
});
@@ -356,7 +356,7 @@ describeWithDebugLogs('OOPIF', function () {
const framePromise = page.waitForFrame(frame => {
return page.frames().indexOf(frame) === 1;
});
- await utils.attachFrame(
+ await attachFrame(
page,
'frame1',
server.CROSS_PROCESS_PREFIX + '/empty.html'
@@ -404,8 +404,8 @@ describeWithDebugLogs('OOPIF', function () {
});
await page.goto(server.PREFIX + '/dynamic-oopif.html');
await frame;
- expect(oopifs(context).length).toBe(1);
- expect(page.frames().length).toBe(2);
+ expect(oopifs(context)).toHaveLength(1);
+ expect(page.frames()).toHaveLength(2);
const browserURL = 'http://127.0.0.1:21222';
const browser1 = await puppeteer.connect({browserURL});
@@ -434,7 +434,7 @@ describeWithDebugLogs('OOPIF', function () {
const {server} = getTestState();
await page.goto(server.EMPTY_PAGE);
- await utils.attachFrame(
+ await attachFrame(
page,
'frame2',
server.CROSS_PROCESS_PREFIX + '/empty.html'
diff --git a/test/src/page.spec.ts b/test/src/page.spec.ts
index fb35fa98..0dc23bae 100644
--- a/test/src/page.spec.ts
+++ b/test/src/page.spec.ts
@@ -185,16 +185,16 @@ describe('Page', function () {
it('should throw when page crashes', async () => {
const {page, isChrome} = getTestState();
- let error!: Error;
- page.on('error', err => {
- return (error = err);
- });
+ let navigate: Promise;
if (isChrome) {
- page.goto('chrome://crash').catch(() => {});
+ navigate = page.goto('chrome://crash').catch(() => {});
} else {
- page.goto('about:crashcontent').catch(() => {});
+ navigate = page.goto('about:crashcontent').catch(() => {});
}
- await waitEvent(page, 'error');
+ const [error] = await Promise.all([
+ waitEvent(page, 'error'),
+ navigate,
+ ]);
expect(error.message).toBe('Page crashed!');
});
});
@@ -204,9 +204,7 @@ describe('Page', function () {
const {page} = getTestState();
const [popup] = await Promise.all([
- new Promise(x => {
- return page.once('popup', x);
- }),
+ waitEvent(page, 'popup'),
page.evaluate(() => {
return window.open('about:blank');
}),
@@ -226,9 +224,7 @@ describe('Page', function () {
const {page} = getTestState();
const [popup] = await Promise.all([
- new Promise(x => {
- return page.once('popup', x);
- }),
+ waitEvent(page, 'popup'),
page.evaluate(() => {
return window.open('about:blank', undefined, 'noopener');
}),
@@ -250,9 +246,7 @@ describe('Page', function () {
await page.goto(server.EMPTY_PAGE);
await page.setContent('yo');
const [popup] = await Promise.all([
- new Promise(x => {
- return page.once('popup', x);
- }),
+ waitEvent(page, 'popup'),
page.click('a'),
]);
expect(
@@ -274,9 +268,7 @@ describe('Page', function () {
'yo'
);
const [popup] = await Promise.all([
- new Promise(x => {
- return page.once('popup', x);
- }),
+ waitEvent(page, 'popup'),
page.click('a'),
]);
expect(
@@ -298,9 +290,7 @@ describe('Page', function () {
'yo'
);
const [popup] = await Promise.all([
- new Promise(x => {
- return page.once('popup', x);
- }),
+ waitEvent(page, 'popup'),
page.$eval('a', a => {
return (a as HTMLAnchorElement).click();
}),
@@ -324,9 +314,7 @@ describe('Page', function () {
'yo'
);
const [popup] = await Promise.all([
- new Promise(x => {
- return page.once('popup', x);
- }),
+ waitEvent(page, 'popup'),
page.click('a'),
]);
expect(
@@ -642,15 +630,11 @@ describe('Page', function () {
it('should work', async () => {
const {page} = getTestState();
- let message!: ConsoleMessage;
- page.once('console', m => {
- return (message = m);
- });
- await Promise.all([
+ const [message] = await Promise.all([
+ waitEvent(page, 'console'),
page.evaluate(() => {
return console.log('hello', 5, {foo: 'bar'});
}),
- waitEvent(page, 'console'),
]);
expect(message.text()).toEqual('hello 5 JSHandle@object');
expect(message.type()).toEqual('log');
@@ -720,15 +704,11 @@ describe('Page', function () {
it('should not fail for window object', async () => {
const {page} = getTestState();
- let message!: ConsoleMessage;
- page.once('console', msg => {
- return (message = msg);
- });
- await Promise.all([
+ const [message] = await Promise.all([
+ waitEvent(page, 'console'),
page.evaluate(() => {
return console.error(window);
}),
- waitEvent(page, 'console'),
]);
expect(message.text()).toBe('JSHandle@object');
});
@@ -854,11 +834,11 @@ describe('Page', function () {
it('metrics event fired on console.timeStamp', async () => {
const {page} = getTestState();
- const metricsPromise = new Promise<{metrics: Metrics; title: string}>(
- fulfill => {
- return page.once('metrics', fulfill);
- }
+ const metricsPromise = waitEvent<{metrics: Metrics; title: string}>(
+ page,
+ 'metrics'
);
+
await page.evaluate(() => {
return console.timeStamp('test42');
});
@@ -1342,13 +1322,9 @@ describe('Page', function () {
it('should fire', async () => {
const {page, server} = getTestState();
- let error!: Error;
- page.once('pageerror', e => {
- return (error = e);
- });
- await Promise.all([
+ const [error] = await Promise.all([
+ waitEvent(page, 'pageerror'),
page.goto(server.PREFIX + '/error.html'),
- waitEvent(page, 'pageerror'),
]);
expect(error.message).toContain('Fancy');
});
@@ -2220,7 +2196,7 @@ describe('Page', function () {
'black',
'magenta'
);
- expect(result.length).toEqual(1);
+ expect(result).toHaveLength(1);
});
it('should return [] on no values', async () => {
const {page, server} = getTestState();
@@ -2313,9 +2289,7 @@ describe('Page', function () {
return ((window as any)['newPage'] = window.open('about:blank'));
});
const newPage = await newPagePromise;
- const closedPromise = new Promise(x => {
- return newPage.on('close', x);
- });
+ const closedPromise = waitEvent(newPage, 'close');
await page.evaluate(() => {
return (window as any)['newPage'].close();
});
@@ -2325,9 +2299,7 @@ describe('Page', function () {
const {context} = getTestState();
const newPage = await context.newPage();
- const closedPromise = new Promise(x => {
- return newPage.on('close', x);
- });
+ const closedPromise = waitEvent(newPage, 'close');
await newPage.close();
await closedPromise;
});
diff --git a/test/src/queryhandler.spec.ts b/test/src/queryhandler.spec.ts
index ae8c66de..f3f604f6 100644
--- a/test/src/queryhandler.spec.ts
+++ b/test/src/queryhandler.spec.ts
@@ -106,13 +106,13 @@ describe('Query handler tests', function () {
await page.setContent('');
expect(await page.$('text/test')).toBeTruthy();
- expect((await page.$$('text/test')).length).toBe(1);
+ expect(await page.$$('text/test')).toHaveLength(1);
});
it('should return empty array for non-existing element', async () => {
const {page} = getTestState();
expect(await page.$('text/test')).toBeFalsy();
- expect((await page.$$('text/test')).length).toBe(0);
+ expect(await page.$$('text/test')).toHaveLength(0);
});
it('should return first element', async () => {
const {page} = getTestState();
@@ -132,7 +132,7 @@ describe('Query handler tests', function () {
await page.setContent('a
a
');
const elements = await page.$$('text/a');
- expect(elements.length).toBe(2);
+ expect(elements).toHaveLength(2);
});
it('should pierce shadow DOM', async () => {
const {page} = getTestState();
@@ -277,7 +277,7 @@ describe('Query handler tests', function () {
const elementHandle = (await page.$('div'))!;
expect(await elementHandle.$(`text/a`)).toBeTruthy();
- expect((await elementHandle.$$(`text/a`)).length).toBe(1);
+ expect(await elementHandle.$$(`text/a`)).toHaveLength(1);
});
it('should return null for non-existing element', async () => {
@@ -287,7 +287,7 @@ describe('Query handler tests', function () {
const elementHandle = (await page.$('div'))!;
expect(await elementHandle.$(`text/a`)).toBeFalsy();
- expect((await elementHandle.$$(`text/a`)).length).toBe(0);
+ expect(await elementHandle.$$(`text/a`)).toHaveLength(0);
});
});
});
@@ -300,7 +300,7 @@ describe('Query handler tests', function () {
await page.setContent('');
expect(await page.$('xpath/html/body/section')).toBeTruthy();
- expect((await page.$$('xpath/html/body/section')).length).toBe(1);
+ expect(await page.$$('xpath/html/body/section')).toHaveLength(1);
});
it('should return empty array for non-existing element', async () => {
const {page} = getTestState();
@@ -309,8 +309,8 @@ describe('Query handler tests', function () {
await page.$('xpath/html/body/non-existing-element')
).toBeFalsy();
expect(
- (await page.$$('xpath/html/body/non-existing-element')).length
- ).toBe(0);
+ await page.$$('xpath/html/body/non-existing-element')
+ ).toHaveLength(0);
});
it('should return first element', async () => {
const {page} = getTestState();
@@ -330,7 +330,7 @@ describe('Query handler tests', function () {
await page.setContent('');
const elements = await page.$$('xpath/html/body/div');
- expect(elements.length).toBe(2);
+ expect(elements).toHaveLength(2);
});
});
describe('in ElementHandles', function () {
@@ -341,7 +341,7 @@ describe('Query handler tests', function () {
const elementHandle = (await page.$('div'))!;
expect(await elementHandle.$(`xpath/span`)).toBeTruthy();
- expect((await elementHandle.$$(`xpath/span`)).length).toBe(1);
+ expect(await elementHandle.$$(`xpath/span`)).toHaveLength(1);
});
it('should return null for non-existing element', async () => {
@@ -351,7 +351,7 @@ describe('Query handler tests', function () {
const elementHandle = (await page.$('div'))!;
expect(await elementHandle.$(`xpath/span`)).toBeFalsy();
- expect((await elementHandle.$$(`xpath/span`)).length).toBe(0);
+ expect(await elementHandle.$$(`xpath/span`)).toHaveLength(0);
});
});
});
@@ -542,7 +542,7 @@ describe('Query handler tests', function () {
it('should work with selector lists', async () => {
const {page} = getTestState();
const elements = await page.$$('div, ::-p-text(world)');
- expect(elements.length).toStrictEqual(3);
+ expect(elements).toHaveLength(3);
});
const permute = (inputs: T[]): T[][] => {
@@ -587,7 +587,7 @@ describe('Query handler tests', function () {
it('should not have duplicate elements from selector lists', async () => {
const {page} = getTestState();
const elements = await page.$$('::-p-text(world), button');
- expect(elements.length).toStrictEqual(1);
+ expect(elements).toHaveLength(1);
});
});
});
diff --git a/test/src/queryselector.spec.ts b/test/src/queryselector.spec.ts
index 7b035603..190578bd 100644
--- a/test/src/queryselector.spec.ts
+++ b/test/src/queryselector.spec.ts
@@ -173,7 +173,7 @@ describe('querySelector', function () {
await page.setContent('A
B
');
const elements = await page.$$('div');
- expect(elements.length).toBe(2);
+ expect(elements).toHaveLength(2);
const promises = elements.map(element => {
return page.evaluate((e: HTMLElement) => {
return e.textContent;
@@ -186,7 +186,7 @@ describe('querySelector', function () {
await page.goto(server.EMPTY_PAGE);
const elements = await page.$$('div');
- expect(elements.length).toBe(0);
+ expect(elements).toHaveLength(0);
});
});
@@ -196,8 +196,8 @@ describe('querySelector', function () {
await page.setContent('');
const elements = await page.$x('/html/body/section');
- expect(elements[0]!).toBeTruthy();
- expect(elements.length).toBe(1);
+ expect(elements[0]).toBeTruthy();
+ expect(elements).toHaveLength(1);
});
it('should return empty array for non-existing element', async () => {
const {page} = getTestState();
@@ -210,7 +210,7 @@ describe('querySelector', function () {
await page.setContent('');
const elements = await page.$x('/html/body/div');
- expect(elements.length).toBe(2);
+ expect(elements).toHaveLength(2);
});
});
@@ -342,7 +342,7 @@ describe('querySelector', function () {
);
const html = (await page.$('html'))!;
const elements = await html.$$('div');
- expect(elements.length).toBe(2);
+ expect(elements).toHaveLength(2);
const promises = elements.map(element => {
return page.evaluate((e: HTMLElement) => {
return e.textContent;
@@ -359,7 +359,7 @@ describe('querySelector', function () {
);
const html = (await page.$('html'))!;
const elements = await html.$$('div');
- expect(elements.length).toBe(0);
+ expect(elements).toHaveLength(0);
});
});
@@ -417,7 +417,7 @@ describe('querySelector', function () {
);
const html = (await page.$('html'))!;
const elements = await html.$$('allArray/div');
- expect(elements.length).toBe(2);
+ expect(elements).toHaveLength(2);
const promises = elements.map(element => {
return page.evaluate(e => {
return e.textContent;
@@ -434,7 +434,7 @@ describe('querySelector', function () {
);
const html = (await page.$('html'))!;
const elements = await html.$$('allArray/div');
- expect(elements.length).toBe(0);
+ expect(elements).toHaveLength(0);
});
it('$$eval should work', async () => {
const {page} = getTestState();
diff --git a/test/src/requestinterception-experimental.spec.ts b/test/src/requestinterception-experimental.spec.ts
index ba235d9a..62f0cb64 100644
--- a/test/src/requestinterception-experimental.spec.ts
+++ b/test/src/requestinterception-experimental.spec.ts
@@ -30,7 +30,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils from './utils.js';
+import {isFavicon, waitEvent} from './utils.js';
describe('request interception', function () {
setupTestBrowserHooks();
@@ -98,8 +98,8 @@ describe('request interception', function () {
}
})())!;
- expect(actionResults.length).toBe(1);
- expect(actionResults[0]!).toBe(expectedAction);
+ expect(actionResults).toHaveLength(1);
+ expect(actionResults[0]).toBe(expectedAction);
expect(response!.ok()).toBe(true);
});
}
@@ -109,7 +109,7 @@ describe('request interception', function () {
await page.setRequestInterception(true);
page.on('request', request => {
- if (utils.isFavicon(request)) {
+ if (isFavicon(request)) {
request.continue({}, 0);
return;
}
@@ -192,7 +192,7 @@ describe('request interception', function () {
await page.setRequestInterception(true);
const requests: HTTPRequest[] = [];
page.on('request', request => {
- if (!utils.isFavicon(request)) {
+ if (!isFavicon(request)) {
requests.push(request);
}
request.continue({}, 0);
@@ -313,11 +313,11 @@ describe('request interception', function () {
page.on('request', request => {
request.abort('internetdisconnected', 0);
});
- let failedRequest!: HTTPRequest;
- page.on('requestfailed', request => {
- return (failedRequest = request);
- });
- await page.goto(server.EMPTY_PAGE).catch(() => {});
+
+ const [failedRequest] = await Promise.all([
+ waitEvent(page, 'requestfailed'),
+ page.goto(server.EMPTY_PAGE).catch(() => {}),
+ ]);
expect(failedRequest).toBeTruthy();
expect(failedRequest.failure()!.errorText).toBe(
'net::ERR_INTERNET_DISCONNECTED'
@@ -384,11 +384,11 @@ describe('request interception', function () {
);
expect(response!.status()).toBe(200);
expect(response!.url()).toContain('empty.html');
- expect(requests.length).toBe(5);
+ expect(requests).toHaveLength(5);
expect(requests[2]!.resourceType()).toBe('document');
// Check redirect chain
const redirectChain = response!.request().redirectChain();
- expect(redirectChain.length).toBe(4);
+ expect(redirectChain).toHaveLength(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) {
@@ -404,7 +404,7 @@ describe('request interception', function () {
const requests: HTTPRequest[] = [];
page.on('request', request => {
request.continue({}, 0);
- if (!utils.isFavicon(request)) {
+ if (!isFavicon(request)) {
requests.push(request);
}
});
@@ -418,12 +418,12 @@ describe('request interception', function () {
const response = await page.goto(server.PREFIX + '/one-style.html');
expect(response!.status()).toBe(200);
expect(response!.url()).toContain('one-style.html');
- expect(requests.length).toBe(5);
+ expect(requests).toHaveLength(5);
expect(requests[0]!.resourceType()).toBe('document');
expect(requests[1]!.resourceType()).toBe('stylesheet');
// Check redirect chain
const redirectChain = requests[1]!.redirectChain();
- expect(redirectChain.length).toBe(3);
+ expect(redirectChain).toHaveLength(3);
expect(redirectChain[0]!.url()).toContain('/one-style.css');
expect(redirectChain[2]!.url()).toContain('/three-style.css');
});
@@ -467,7 +467,7 @@ describe('request interception', function () {
let spinner = false;
// Cancel 2nd request.
page.on('request', request => {
- if (utils.isFavicon(request)) {
+ if (isFavicon(request)) {
request.continue({}, 0);
return;
}
@@ -513,7 +513,7 @@ describe('request interception', function () {
const dataURL = 'data:text/html,yo
';
const response = await page.goto(dataURL);
expect(response!.status()).toBe(200);
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.url()).toBe(dataURL);
});
it('should be able to fetch dataURL and fire dataURL requests', async () => {
@@ -523,7 +523,7 @@ describe('request interception', function () {
await page.setRequestInterception(true);
const requests: HTTPRequest[] = [];
page.on('request', request => {
- !utils.isFavicon(request) && requests.push(request);
+ !isFavicon(request) && requests.push(request);
request.continue({}, 0);
});
const dataURL = 'data:text/html,yo
';
@@ -533,7 +533,7 @@ describe('request interception', function () {
});
}, dataURL);
expect(text).toBe('yo
');
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.url()).toBe(dataURL);
});
it('should navigate to URL with hash and fire requests without hash', async () => {
@@ -548,7 +548,7 @@ describe('request interception', function () {
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).toHaveLength(1);
expect(requests[0]!.url()).toBe(server.EMPTY_PAGE);
});
it('should work with encoded server', async () => {
@@ -593,7 +593,7 @@ describe('request interception', function () {
`data:text/html,`
);
expect(response!.status()).toBe(200);
- expect(requests.length).toBe(2);
+ expect(requests).toHaveLength(2);
expect(requests[1]!.response()!.status()).toBe(404);
});
it('should not throw "Invalid Interception Id" if the request was cancelled', async () => {
@@ -613,7 +613,7 @@ describe('request interception', function () {
server.EMPTY_PAGE
),
// Wait for request interception.
- await utils.waitEvent(page, 'request');
+ await waitEvent(page, 'request');
// Delete frame to cause request to be canceled.
await page.$eval('iframe', frame => {
return frame.remove();
@@ -666,13 +666,13 @@ describe('request interception', function () {
return request.continue({}, 0);
});
- const cached = [];
+ const cached: HTTPRequest[] = [];
page.on('requestservedfromcache', r => {
return cached.push(r);
});
await page.reload();
- expect(cached.length).toBe(0);
+ expect(cached).toHaveLength(0);
});
it('should cache if cache enabled', async () => {
const {page, server} = getTestState();
@@ -686,13 +686,13 @@ describe('request interception', function () {
return request.continue({}, 0);
});
- const cached = [];
+ const cached: HTTPRequest[] = [];
page.on('requestservedfromcache', r => {
return cached.push(r);
});
await page.reload();
- expect(cached.length).toBe(1);
+ expect(cached).toHaveLength(1);
});
it('should load fonts if cache enabled', async () => {
const {page, server} = getTestState();
@@ -748,11 +748,11 @@ describe('request interception', function () {
: undefined;
request.continue({url: redirectURL}, 0);
});
- let consoleMessage!: ConsoleMessage;
- page.on('console', msg => {
- return (consoleMessage = msg);
- });
- await page.goto(server.EMPTY_PAGE);
+
+ const [consoleMessage] = await Promise.all([
+ waitEvent(page, 'console'),
+ page.goto(server.EMPTY_PAGE),
+ ]);
expect(page.url()).toBe(server.EMPTY_PAGE);
expect(consoleMessage.text()).toBe('yellow');
});
@@ -895,7 +895,7 @@ describe('request interception', function () {
);
});
const response = await page.goto(server.PREFIX + '/rrredirect');
- expect(response!.request().redirectChain().length).toBe(1);
+ expect(response!.request().redirectChain()).toHaveLength(1);
expect(response!.request().redirectChain()[0]!.url()).toBe(
server.PREFIX + '/rrredirect'
);
diff --git a/test/src/requestinterception.spec.ts b/test/src/requestinterception.spec.ts
index 2c55fe67..51e63f4b 100644
--- a/test/src/requestinterception.spec.ts
+++ b/test/src/requestinterception.spec.ts
@@ -26,7 +26,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils from './utils.js';
+import {isFavicon, waitEvent} from './utils.js';
describe('request interception', function () {
setupTestBrowserHooks();
@@ -37,7 +37,7 @@ describe('request interception', function () {
await page.setRequestInterception(true);
page.on('request', request => {
- if (utils.isFavicon(request)) {
+ if (isFavicon(request)) {
request.continue();
return;
}
@@ -118,7 +118,7 @@ describe('request interception', function () {
await page.setRequestInterception(true);
const requests: HTTPRequest[] = [];
page.on('request', request => {
- if (!utils.isFavicon(request)) {
+ if (!isFavicon(request)) {
requests.push(request);
}
request.continue();
@@ -240,11 +240,11 @@ describe('request interception', function () {
page.on('request', request => {
request.abort('internetdisconnected');
});
- let failedRequest!: HTTPRequest;
- page.on('requestfailed', request => {
- return (failedRequest = request);
- });
- await page.goto(server.EMPTY_PAGE).catch(() => {});
+ const [failedRequest] = await Promise.all([
+ waitEvent(page, 'requestfailed'),
+ page.goto(server.EMPTY_PAGE).catch(() => {}),
+ ]);
+
expect(failedRequest).toBeTruthy();
expect(failedRequest.failure()!.errorText).toBe(
'net::ERR_INTERNET_DISCONNECTED'
@@ -311,11 +311,11 @@ describe('request interception', function () {
))!;
expect(response.status()).toBe(200);
expect(response.url()).toContain('empty.html');
- expect(requests.length).toBe(5);
+ expect(requests).toHaveLength(5);
expect(requests[2]!.resourceType()).toBe('document');
// Check redirect chain
const redirectChain = response.request().redirectChain();
- expect(redirectChain.length).toBe(4);
+ expect(redirectChain).toHaveLength(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) {
@@ -331,7 +331,7 @@ describe('request interception', function () {
const requests: HTTPRequest[] = [];
page.on('request', request => {
request.continue();
- if (!utils.isFavicon(request)) {
+ if (!isFavicon(request)) {
requests.push(request);
}
});
@@ -345,12 +345,12 @@ describe('request interception', function () {
const response = (await page.goto(server.PREFIX + '/one-style.html'))!;
expect(response.status()).toBe(200);
expect(response.url()).toContain('one-style.html');
- expect(requests.length).toBe(5);
+ expect(requests).toHaveLength(5);
expect(requests[0]!.resourceType()).toBe('document');
expect(requests[1]!.resourceType()).toBe('stylesheet');
// Check redirect chain
const redirectChain = requests[1]!.redirectChain();
- expect(redirectChain.length).toBe(3);
+ expect(redirectChain).toHaveLength(3);
expect(redirectChain[0]!.url()).toContain('/one-style.css');
expect(redirectChain[2]!.url()).toContain('/three-style.css');
});
@@ -394,7 +394,7 @@ describe('request interception', function () {
let spinner = false;
// Cancel 2nd request.
page.on('request', request => {
- if (utils.isFavicon(request)) {
+ if (isFavicon(request)) {
request.continue();
return;
}
@@ -440,7 +440,7 @@ describe('request interception', function () {
const dataURL = 'data:text/html,yo
';
const response = (await page.goto(dataURL))!;
expect(response.status()).toBe(200);
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.url()).toBe(dataURL);
});
it('should be able to fetch dataURL and fire dataURL requests', async () => {
@@ -450,7 +450,7 @@ describe('request interception', function () {
await page.setRequestInterception(true);
const requests: HTTPRequest[] = [];
page.on('request', request => {
- !utils.isFavicon(request) && requests.push(request);
+ !isFavicon(request) && requests.push(request);
request.continue();
});
const dataURL = 'data:text/html,yo
';
@@ -460,7 +460,7 @@ describe('request interception', function () {
});
}, dataURL);
expect(text).toBe('yo
');
- expect(requests.length).toBe(1);
+ expect(requests).toHaveLength(1);
expect(requests[0]!.url()).toBe(dataURL);
});
it('should navigate to URL with hash and fire requests without hash', async () => {
@@ -475,7 +475,7 @@ describe('request interception', function () {
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).toHaveLength(1);
expect(requests[0]!.url()).toBe(server.EMPTY_PAGE);
});
it('should work with encoded server', async () => {
@@ -522,7 +522,7 @@ describe('request interception', function () {
`data:text/html,`
))!;
expect(response.status()).toBe(200);
- expect(requests.length).toBe(2);
+ expect(requests).toHaveLength(2);
expect(requests[1]!.response()!.status()).toBe(404);
});
it('should not throw "Invalid Interception Id" if the request was cancelled', async () => {
@@ -542,7 +542,7 @@ describe('request interception', function () {
server.EMPTY_PAGE
),
// Wait for request interception.
- await utils.waitEvent(page, 'request');
+ await waitEvent(page, 'request');
// Delete frame to cause request to be canceled.
await page.$eval('iframe', frame => {
return frame.remove();
@@ -595,13 +595,13 @@ describe('request interception', function () {
return request.continue();
});
- const cached = [];
+ const cached: HTTPRequest[] = [];
page.on('requestservedfromcache', r => {
return cached.push(r);
});
await page.reload();
- expect(cached.length).toBe(0);
+ expect(cached).toHaveLength(0);
});
it('should cache if cache enabled', async () => {
const {page, server} = getTestState();
@@ -615,13 +615,13 @@ describe('request interception', function () {
return request.continue();
});
- const cached = [];
+ const cached: HTTPRequest[] = [];
page.on('requestservedfromcache', r => {
return cached.push(r);
});
await page.reload();
- expect(cached.length).toBe(1);
+ expect(cached).toHaveLength(1);
});
it('should load fonts if cache enabled', async () => {
const {page, server} = getTestState();
@@ -678,11 +678,10 @@ describe('request interception', function () {
: undefined;
request.continue({url: redirectURL});
});
- let consoleMessage!: ConsoleMessage;
- page.on('console', msg => {
- return (consoleMessage = msg);
- });
- await page.goto(server.EMPTY_PAGE);
+ const [consoleMessage] = await Promise.all([
+ waitEvent(page, 'console'),
+ page.goto(server.EMPTY_PAGE),
+ ]);
expect(page.url()).toBe(server.EMPTY_PAGE);
expect(consoleMessage.text()).toBe('yellow');
});
@@ -815,7 +814,7 @@ describe('request interception', function () {
});
});
const response = (await page.goto(server.PREFIX + '/rrredirect'))!;
- expect(response.request().redirectChain().length).toBe(1);
+ expect(response.request().redirectChain()).toHaveLength(1);
expect(response.request().redirectChain()[0]!.url()).toBe(
server.PREFIX + '/rrredirect'
);
diff --git a/test/src/screenshot.spec.ts b/test/src/screenshot.spec.ts
index fb6b60a7..f38d7ee8 100644
--- a/test/src/screenshot.spec.ts
+++ b/test/src/screenshot.spec.ts
@@ -99,7 +99,7 @@ describe('Screenshots', function () {
);
}
const screenshots = await Promise.all(promises);
- expect(screenshots[1]!).toBeGolden('grid-cell-1.png');
+ expect(screenshots[1]).toBeGolden('grid-cell-1.png');
});
it('should take fullPage screenshots', async () => {
const {page, server} = getTestState();
@@ -193,11 +193,7 @@ describe('Screenshots', function () {
const screenshot = await page.screenshot({
encoding: 'base64',
});
- // TODO (@jackfranklin): improve the screenshot types.
- // - if we pass encoding: 'base64', it returns a string
- // - else it returns a buffer.
- // If we can fix that we can avoid this "as string" here.
- expect(Buffer.from(screenshot as string, 'base64')).toBeGolden(
+ expect(Buffer.from(screenshot, 'base64')).toBeGolden(
'screenshot-sanity.png'
);
});
diff --git a/test/src/target.spec.ts b/test/src/target.spec.ts
index 8bb70583..3b5e5c34 100644
--- a/test/src/target.spec.ts
+++ b/test/src/target.spec.ts
@@ -26,9 +26,7 @@ import {
setupTestBrowserHooks,
setupTestPageAndContextHooks,
} from './mocha-utils.js';
-import utils from './utils.js';
-
-const {waitEvent} = utils;
+import {waitEvent} from './utils.js';
describe('Target', function () {
setupTestBrowserHooks();
@@ -55,7 +53,7 @@ describe('Target', function () {
// The pages will be the testing page
const allPages = await context.pages();
- expect(allPages.length).toBe(1);
+ expect(allPages).toHaveLength(1);
expect(allPages).toContain(page);
});
it('should contain browser target', async () => {
@@ -131,13 +129,11 @@ describe('Target', function () {
expect(allPages).toContain(page);
expect(allPages).toContain(otherPage);
- const closePagePromise = new Promise(fulfill => {
- return context.once('targetdestroyed', target => {
- return fulfill(target.page());
- });
- });
- await otherPage!.close();
- expect(await closePagePromise).toBe(otherPage);
+ const [closedTarget] = await Promise.all([
+ waitEvent(context, 'targetdestroyed'),
+ otherPage!.close(),
+ ]);
+ expect(await closedTarget.page()).toBe(otherPage);
allPages = (await Promise.all(
context.targets().map(target => {
@@ -151,11 +147,7 @@ describe('Target', function () {
const {page, server, context} = getTestState();
await page.goto(server.EMPTY_PAGE);
- const createdTarget = new Promise(fulfill => {
- return context.once('targetcreated', target => {
- return fulfill(target);
- });
- });
+ const createdTarget = waitEvent(context, 'targetcreated');
await page.goto(server.PREFIX + '/serviceworkers/empty/sw.html');
@@ -164,11 +156,7 @@ describe('Target', function () {
server.PREFIX + '/serviceworkers/empty/sw.js'
);
- const destroyedTarget = new Promise(fulfill => {
- return context.once('targetdestroyed', target => {
- return fulfill(target);
- });
- });
+ const destroyedTarget = waitEvent(context, 'targetdestroyed');
await page.evaluate(() => {
return (
globalThis as unknown as {
@@ -216,19 +204,11 @@ describe('Target', function () {
const {page, server, context} = getTestState();
await page.goto(server.EMPTY_PAGE);
- let changedTarget = new Promise(fulfill => {
- return context.once('targetchanged', target => {
- return fulfill(target);
- });
- });
+ let changedTarget = waitEvent(context, 'targetchanged');
await page.goto(server.CROSS_PROCESS_PREFIX + '/');
expect((await changedTarget).url()).toBe(server.CROSS_PROCESS_PREFIX + '/');
- changedTarget = new Promise(fulfill => {
- return context.once('targetchanged', target => {
- return fulfill(target);
- });
- });
+ changedTarget = waitEvent(context, 'targetchanged');
await page.goto(server.EMPTY_PAGE);
expect((await changedTarget).url()).toBe(server.EMPTY_PAGE);
});
@@ -240,21 +220,13 @@ describe('Target', function () {
return (targetChanged = true);
};
context.on('targetchanged', listener);
- const targetPromise = new Promise(fulfill => {
- return context.once('targetcreated', target => {
- return fulfill(target);
- });
- });
+ const targetPromise = waitEvent(context, 'targetcreated');
const newPagePromise = context.newPage();
const target = await targetPromise;
expect(target.url()).toBe('about:blank');
const newPage = await newPagePromise;
- const targetPromise2 = new Promise(fulfill => {
- return context.once('targetcreated', target => {
- return fulfill(target);
- });
- });
+ const targetPromise2 = waitEvent(context, 'targetcreated');
const evaluatePromise = newPage.evaluate(() => {
return window.open('about:blank');
});
@@ -263,7 +235,7 @@ describe('Target', function () {
await evaluatePromise;
await newPage.close();
expect(targetChanged).toBe(false);
- context.removeListener('targetchanged', listener);
+ context.off('targetchanged', listener);
});
it('should not crash while redirecting if original request was missed', async () => {
const {page, server, context} = getTestState();
@@ -297,11 +269,7 @@ describe('Target', function () {
await page.goto(server.EMPTY_PAGE);
const [createdTarget] = await Promise.all([
- new Promise(fulfill => {
- return context.once('targetcreated', target => {
- return fulfill(target);
- });
- }),
+ waitEvent(context, 'targetcreated'),
page.goto(server.PREFIX + '/popup/window-open.html'),
]);
expect((await createdTarget.page())!.url()).toBe(
diff --git a/test/src/utils.ts b/test/src/utils.ts
index 5a71b2d4..43c98e95 100644
--- a/test/src/utils.ts
+++ b/test/src/utils.ts
@@ -132,15 +132,15 @@ export const dumpFrames = (frame: Frame, indentation?: string): string[] => {
return result;
};
-export const waitEvent = (
+export const waitEvent = (
emitter: EventEmitter,
eventName: string,
- predicate: (event: any) => boolean = () => {
+ predicate: (event: T) => boolean = () => {
return true;
}
-): Promise => {
+): Promise => {
return new Promise(fulfill => {
- emitter.once(eventName, (event: any) => {
+ emitter.on(eventName, (event: T) => {
if (!predicate(event)) {
return;
}
@@ -148,17 +148,3 @@ export const waitEvent = (
});
});
};
-
-/**
- * @deprecated Use exports directly.
- */
-export default {
- extendExpectWithToBeGolden,
- waitEvent,
- dumpFrames,
- navigateFrame,
- isFavicon,
- attachFrame,
- projectRoot,
- detachFrame,
-};
diff --git a/test/src/worker.spec.ts b/test/src/worker.spec.ts
index ee94a5af..733c5bdf 100644
--- a/test/src/worker.spec.ts
+++ b/test/src/worker.spec.ts
@@ -32,9 +32,7 @@ describe('Workers', function () {
const {page, server} = getTestState();
await Promise.all([
- new Promise(x => {
- return page.once('workercreated', x);
- }),
+ waitEvent(page, 'workercreated'),
page.goto(server.PREFIX + '/worker/worker.html'),
]);
const worker = page.workers()[0]!;
@@ -47,14 +45,12 @@ describe('Workers', function () {
).toBe('worker function result');
await page.goto(server.EMPTY_PAGE);
- expect(page.workers().length).toBe(0);
+ expect(page.workers()).toHaveLength(0);
});
it('should emit created and destroyed events', async () => {
const {page} = getTestState();
- const workerCreatedPromise = new Promise(x => {
- return page.once('workercreated', x);
- });
+ const workerCreatedPromise = waitEvent(page, 'workercreated');
const workerObj = await page.evaluateHandle(() => {
return new Worker('data:text/javascript,1');
});
@@ -62,9 +58,7 @@ describe('Workers', function () {
const workerThisObj = await worker.evaluateHandle(() => {
return this;
});
- const workerDestroyedPromise = new Promise(x => {
- return page.once('workerdestroyed', x);
- });
+ const workerDestroyedPromise = waitEvent(page, 'workerdestroyed');
await page.evaluate((workerObj: Worker) => {
return workerObj.terminate();
}, workerObj);
@@ -93,15 +87,13 @@ describe('Workers', function () {
it('should have JSHandles for console logs', async () => {
const {page} = getTestState();
- const logPromise = new Promise(x => {
- return page.on('console', x);
- });
+ const logPromise = waitEvent(page, 'console');
await page.evaluate(() => {
return new Worker(`data:text/javascript,console.log(1,2,3,this)`);
});
const log = await logPromise;
expect(log.text()).toBe('1 2 3 JSHandle@object');
- expect(log.args().length).toBe(4);
+ expect(log.args()).toHaveLength(4);
expect(await (await log.args()[3]!.getProperty('origin')).jsonValue()).toBe(
'null'
);
@@ -109,9 +101,7 @@ describe('Workers', function () {
it('should have an execution context', async () => {
const {page} = getTestState();
- const workerCreatedPromise = new Promise(x => {
- return page.once('workercreated', x);
- });
+ const workerCreatedPromise = waitEvent(page, 'workercreated');
await page.evaluate(() => {
return new Worker(`data:text/javascript,console.log(1)`);
});
@@ -121,9 +111,7 @@ describe('Workers', function () {
it('should report errors', async () => {
const {page} = getTestState();
- const errorPromise = new Promise(x => {
- return page.on('pageerror', x);
- });
+ const errorPromise = waitEvent(page, 'pageerror');
await page.evaluate(() => {
return new Worker(
`data:text/javascript, throw new Error('this is my error');`