Skip to content

Commit 568c6cb

Browse files
test(navigation): fix flaky networkidle tests (#1058)
The network idle tests were waiting for requests to appear on the server, but not for playwright to be notified of the request via protocol. They also assumed performance.now would match up with setTimeout times.
1 parent 84ee297 commit 568c6cb

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

test/navigation.spec.js

+28-13
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
*/
1717

1818
const utils = require('./utils');
19-
const { performance } = require('perf_hooks');
2019

2120
/**
2221
* @type {PageTestSuite}
@@ -396,29 +395,39 @@ module.exports.describe = function({testRunner, expect, playwright, MAC, WIN, FF
396395
expect(response.status()).toBe(200);
397396
});
398397

398+
/**
399+
* @param {import('../src/frames').Frame} frame
400+
* @param {TestServer} server
401+
* @param {'networkidle0'|'networkidle2'} signal
402+
* @param {() => Promise<void>} action
403+
* @param {boolean} isSetContent
404+
*/
399405
async function networkIdleTest(frame, server, signal, action, isSetContent) {
400-
let lastResponseFinished;
401406
const finishResponse = response => {
402-
lastResponseFinished = performance.now();
403407
response.statusCode = 404;
404408
response.end(`File not found`);
405409
};
406-
410+
const waitForRequest = suffix => {
411+
return Promise.all([
412+
server.waitForRequest(suffix),
413+
frame._page.waitForRequest(server.PREFIX + suffix),
414+
])
415+
}
407416
let responses = {};
408417
// Hold on to a bunch of requests without answering.
409418
server.setRoute('/fetch-request-a.js', (req, res) => responses.a = res);
410419
server.setRoute('/fetch-request-b.js', (req, res) => responses.b = res);
411420
server.setRoute('/fetch-request-c.js', (req, res) => responses.c = res);
412421
const initialFetchResourcesRequested = Promise.all([
413-
server.waitForRequest('/fetch-request-a.js'),
414-
server.waitForRequest('/fetch-request-b.js'),
415-
server.waitForRequest('/fetch-request-c.js'),
422+
waitForRequest('/fetch-request-a.js'),
423+
waitForRequest('/fetch-request-b.js'),
424+
waitForRequest('/fetch-request-c.js')
416425
]);
417426

418427
let secondFetchResourceRequested;
419428
if (signal === 'networkidle0') {
420429
server.setRoute('/fetch-request-d.js', (req, res) => responses.d = res);
421-
secondFetchResourceRequested = server.waitForRequest('/fetch-request-d.js');
430+
secondFetchResourceRequested = waitForRequest('/fetch-request-d.js');
422431
}
423432

424433
const waitForLoadPromise = isSetContent ? Promise.resolve() : frame.waitForNavigation({ waitUntil: 'load' });
@@ -442,10 +451,11 @@ module.exports.describe = function({testRunner, expect, playwright, MAC, WIN, FF
442451
expect(responses.a).toBeTruthy();
443452
expect(responses.b).toBeTruthy();
444453
expect(responses.c).toBeTruthy();
445-
// Finishing first response should leave 2 requests alive and trigger networkidle2.
446-
finishResponse(responses.a);
447-
454+
let timer;
455+
let timerTriggered = false;
448456
if (signal === 'networkidle0') {
457+
// Finishing first response should leave 2 requests alive and trigger networkidle2.
458+
finishResponse(responses.a);
449459
// Finishing two more responses should trigger the second round.
450460
finishResponse(responses.b);
451461
finishResponse(responses.c);
@@ -454,11 +464,16 @@ module.exports.describe = function({testRunner, expect, playwright, MAC, WIN, FF
454464
await secondFetchResourceRequested;
455465
expect(actionFinished).toBe(false);
456466
// Finishing the last response should trigger networkidle0.
467+
timer = setTimeout(() => timerTriggered = true, 500);
457468
finishResponse(responses.d);
469+
} else {
470+
timer = setTimeout(() => timerTriggered = true, 500);
471+
// Finishing first response should leave 2 requests alive and trigger networkidle2.
472+
finishResponse(responses.a);
458473
}
459-
460474
const response = await actionPromise;
461-
expect(performance.now() - lastResponseFinished).not.toBeLessThan(450);
475+
clearTimeout(timer);
476+
expect(timerTriggered).toBe(true);
462477
if (!isSetContent)
463478
expect(response.ok()).toBe(true);
464479

0 commit comments

Comments
 (0)