test(screencast): use public API for pixel tests (#3858)

This commit is contained in:
Yury Semikhatsky 2020-09-11 18:58:53 -07:00 committed by GitHub
parent 40323aa94d
commit 02275f2414
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 22 deletions

View file

@ -13,7 +13,7 @@
}, },
{ {
"name": "webkit", "name": "webkit",
"revision": "1343", "revision": "1344",
"download": true "download": true
} }
] ]

View file

@ -122,7 +122,9 @@ class VideoPlayer {
if (ended) if (ended)
throw new Error('All frames are empty'); throw new Error('All frames are empty');
const pixels = await this.pixels(); const pixels = await this.pixels();
if (!pixels.every(p => p === 255)) // Quick check if all pixels are almost white. In Firefox blank page is not
// truly white so whe check approximately.
if (!pixels.every(p => p > 245))
return; return;
} }
} }
@ -159,14 +161,17 @@ class VideoPlayer {
describe('screencast', suite => { describe('screencast', suite => {
suite.slow(); suite.slow();
suite.skip(options.WIRE);
}, () => { }, () => {
it('should capture static page', async ({page, tmpDir, videoPlayer, toImpl}) => { it('should capture static page', async ({browser, videoPlayer}) => {
const videoFile = path.join(tmpDir, 'v.webm'); const context = await browser.newContext({ _recordVideos: true, _videoSize: { width: 320, height: 240 } });
const page = await context.newPage();
const video = await page.waitForEvent('_videostarted') as any;
await page.evaluate(() => document.body.style.backgroundColor = 'red'); await page.evaluate(() => document.body.style.backgroundColor = 'red');
await toImpl(page)._delegate.startScreencast({outputFile: videoFile, width: 320, height: 240});
await new Promise(r => setTimeout(r, 1000)); await new Promise(r => setTimeout(r, 1000));
await toImpl(page)._delegate.stopScreencast(); await page.close();
const videoFile = await video.path();
expect(fs.existsSync(videoFile)).toBe(true); expect(fs.existsSync(videoFile)).toBe(true);
await videoPlayer.load(videoFile); await videoPlayer.load(videoFile);
@ -183,14 +188,18 @@ describe('screencast', suite => {
it('should capture navigation', (test, parameters) => { it('should capture navigation', (test, parameters) => {
test.flaky(); test.flaky();
}, async ({page, tmpDir, server, videoPlayer, toImpl}) => { }, async ({browser, server, videoPlayer}) => {
const videoFile = path.join(tmpDir, 'v.webm'); const context = await browser.newContext({ _recordVideos: true, _videoSize: { width: 1280, height: 720 } });
const page = await context.newPage();
const video = await page.waitForEvent('_videostarted') as any;
await page.goto(server.PREFIX + '/background-color.html#rgb(0,0,0)'); await page.goto(server.PREFIX + '/background-color.html#rgb(0,0,0)');
await toImpl(page)._delegate.startScreencast({outputFile: videoFile, width: 320, height: 240});
await new Promise(r => setTimeout(r, 1000)); await new Promise(r => setTimeout(r, 1000));
await page.goto(server.CROSS_PROCESS_PREFIX + '/background-color.html#rgb(100,100,100)'); await page.goto(server.CROSS_PROCESS_PREFIX + '/background-color.html#rgb(100,100,100)');
await new Promise(r => setTimeout(r, 1000)); await new Promise(r => setTimeout(r, 1000));
await toImpl(page)._delegate.stopScreencast(); await page.close();
const videoFile = await video.path();
expect(fs.existsSync(videoFile)).toBe(true); expect(fs.existsSync(videoFile)).toBe(true);
await videoPlayer.load(videoFile); await videoPlayer.load(videoFile);
@ -212,14 +221,18 @@ describe('screencast', suite => {
it('should capture css transformation', (test, parameters) => { it('should capture css transformation', (test, parameters) => {
test.fail(options.WEBKIT(parameters) && WIN, 'Does not work on WebKit Windows'); test.fail(options.WEBKIT(parameters) && WIN, 'Does not work on WebKit Windows');
}, async ({page, tmpDir, server, videoPlayer, toImpl}) => { }, async ({browser, server, videoPlayer}) => {
const videoFile = path.join(tmpDir, 'v.webm'); const size = {width: 320, height: 240};
// Set viewport equal to screencast frame size to avoid scaling. // Set viewport equal to screencast frame size to avoid scaling.
await page.setViewportSize({width: 320, height: 240}); const context = await browser.newContext({ _recordVideos: true, _videoSize: size, viewport: size });
const page = await context.newPage();
const video = await page.waitForEvent('_videostarted') as any;
await page.goto(server.PREFIX + '/rotate-z.html'); await page.goto(server.PREFIX + '/rotate-z.html');
await toImpl(page)._delegate.startScreencast({outputFile: videoFile, width: 320, height: 240});
await new Promise(r => setTimeout(r, 1000)); await new Promise(r => setTimeout(r, 1000));
await toImpl(page)._delegate.stopScreencast(); await page.close();
const videoFile = await video.path();
expect(fs.existsSync(videoFile)).toBe(true); expect(fs.existsSync(videoFile)).toBe(true);
await videoPlayer.load(videoFile); await videoPlayer.load(videoFile);
@ -299,12 +312,17 @@ describe('screencast', suite => {
await browser.close(); await browser.close();
}); });
it('should scale frames down to the requested size ', async ({page, videoPlayer, tmpDir, server, toImpl}) => { it('should scale frames down to the requested size ', async ({browser, videoPlayer, server}) => {
await page.setViewportSize({width: 640, height: 480}); const context = await browser.newContext({
const videoFile = path.join(tmpDir, 'v.webm'); viewport: {width: 640, height: 480},
// Set size to 1/2 of the viewport.
_recordVideos: true,
_videoSize: { width: 320, height: 240 },
});
const page = await context.newPage();
const video = await page.waitForEvent('_videostarted') as any;
await page.goto(server.PREFIX + '/checkerboard.html'); await page.goto(server.PREFIX + '/checkerboard.html');
// Set size to 1/2 of the viewport.
await toImpl(page)._delegate.startScreencast({outputFile: videoFile, width: 320, height: 240});
// Update the picture to ensure enough frames are generated. // Update the picture to ensure enough frames are generated.
await page.$eval('.container', container => { await page.$eval('.container', container => {
container.firstElementChild.classList.remove('red'); container.firstElementChild.classList.remove('red');
@ -314,7 +332,9 @@ describe('screencast', suite => {
container.firstElementChild.classList.add('red'); container.firstElementChild.classList.add('red');
}); });
await new Promise(r => setTimeout(r, 1000)); await new Promise(r => setTimeout(r, 1000));
await toImpl(page)._delegate.stopScreencast(); await page.close();
const videoFile = await video.path();
expect(fs.existsSync(videoFile)).toBe(true); expect(fs.existsSync(videoFile)).toBe(true);
await videoPlayer.load(videoFile); await videoPlayer.load(videoFile);