/**
* @license
* Copyright 2023 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
import {statSync} from 'fs' ;
import expect from 'expect' ;
import {getTestState, setupTestBrowserHooks} from '../mocha-utils.js' ;
import {getUniqueVideoFilePlaceholder} from '../utils.js' ;
describe('Prerender' , function () {
setupTestBrowserHooks();
it('can navigate to a prerendered page via input' , async () => {
const {page, server} = await getTestState();
await page.goto (server.PREFIX + '/prerender/index.html' );
using button = await page.waitForSelector('button' );
await button?.click();
using link = await page.waitForSelector('a' );
await Promise.all([page.waitForNavigation(), link?.click()]);
expect(
await page.evaluate(() => {
return document.body.innerText;
}),
).toBe('target' );
});
it('can navigate to a prerendered page via Puppeteer' , async () => {
const {page, server} = await getTestState();
await page.goto (server.PREFIX + '/prerender/index.html' );
using button = await page.waitForSelector('button' );
await button?.click();
await page.goto (server.PREFIX + '/prerender/target.html' );
expect(
await page.evaluate(() => {
return document.body.innerText;
}),
).toBe('target' );
});
describe('via frame' , () => {
it('can navigate to a prerendered page via input' , async () => {
const {page, server} = await getTestState();
await page.goto (server.PREFIX + '/prerender/index.html' );
using button = await page.waitForSelector('button' );
await button?.click();
const mainFrame = page.mainFrame();
using link = await mainFrame.waitForSelector('a' );
await Promise.all([mainFrame.waitForNavigation(), link?.click()]);
expect(mainFrame).toBe(page.mainFrame());
expect(
await mainFrame.evaluate(() => {
return document.body.innerText;
}),
).toBe('target' );
expect(mainFrame).toBe(page.mainFrame());
});
it('can navigate to a prerendered page via Puppeteer' , async () => {
const {page, server} = await getTestState();
await page.goto (server.PREFIX + '/prerender/index.html' );
using button = await page.waitForSelector('button' );
await button?.click();
const mainFrame = page.mainFrame();
await mainFrame.goto (server.PREFIX + '/prerender/target.html' );
expect(
await mainFrame.evaluate(() => {
return document.body.innerText;
}),
).toBe('target' );
expect(mainFrame).toBe(page.mainFrame());
});
});
it('can screencast' , async () => {
using file = getUniqueVideoFilePlaceholder();
const {page, server} = await getTestState();
const recorder = await page.screencast({
path: file.filename,
scale: 0 .5 ,
crop: {width: 100 , height: 100 , x: 0 , y: 0 },
speed: 0 .5 ,
});
await page.goto (server.PREFIX + '/prerender/index.html' );
using button = await page.waitForSelector('button' );
await button?.click();
using link = await page.locator('a' ).waitHandle();
await Promise.all([page.waitForNavigation(), link.click()]);
using input = await page.locator('input' ).waitHandle();
await input.type('ab' , {delay: 100 });
await recorder.stop();
expect(statSync(file.filename).size).toBeGreaterThan(0 );
});
describe('with network requests' , () => {
it('can receive requests from the prerendered page' , async () => {
const {page, server} = await getTestState();
const urls: string[] = [];
page.on('request' , request => {
urls.push(request.url());
});
await page.goto (server.PREFIX + '/prerender/index.html' );
using button = await page.waitForSelector('button' );
await button?.click();
const mainFrame = page.mainFrame();
using link = await mainFrame.waitForSelector('a' );
await Promise.all([mainFrame.waitForNavigation(), link?.click()]);
expect(mainFrame).toBe(page.mainFrame());
expect(
await mainFrame.evaluate(() => {
return document.body.innerText;
}),
).toBe('target' );
expect(mainFrame).toBe(page.mainFrame());
expect(
urls.find(url => {
return url.endsWith('prerender/target.html' );
}),
).toBeTruthy();
expect(
urls.find(url => {
return url.includes('prerender/index.html' );
}),
).toBeTruthy();
expect(
urls.find(url => {
return url.includes('prerender/target.html?fromPrerendered' );
}),
).toBeTruthy();
});
});
describe('with emulation' , () => {
it('can configure viewport for prerendered pages' , async () => {
const {page, server} = await getTestState();
await page.setViewport({
width: 300 ,
height: 400 ,
});
await page.goto (server.PREFIX + '/prerender/index.html' );
using button = await page.waitForSelector('button' );
await button?.click();
using link = await page.waitForSelector('a' );
await Promise.all([page.waitForNavigation(), link?.click()]);
const result = await page.evaluate(() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
dpr: window.devicePixelRatio,
};
});
expect({
width: result.width,
height: result.height,
}).toStrictEqual({
width: 300 * result.dpr,
height: 400 * result.dpr,
});
});
});
});
Messung V0.5 in Prozent C=97 H=74 G=86
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-04)
¤
*© Formatika GbR, Deutschland