web-dev-qa-db-fra.com

Le marionnettiste attend que la page soit complètement chargée

Je travaille sur la création de PDF à partir de la page Web.

L'application sur laquelle je travaille est une application d'une seule page.

J'ai essayé de nombreuses options et suggestions sur https://github.com/GoogleChrome/puppeteer/issues/1412

Mais ça ne fonctionne pas

    const browser = await puppeteer.launch({
    executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
    ignoreHTTPSErrors: true,
    headless: true,
    devtools: false,
    args: ['--no-sandbox', '--disable-setuid-sandbox']
});

const page = await browser.newPage();

await page.goto(fullUrl, {
    waitUntil: 'networkidle2'
});

await page.type('#username', 'scott');
await page.type('#password', 'tiger');

await page.click('#Login_Button');
await page.waitFor(2000);

await page.pdf({
    path: outputFileName,
    displayHeaderFooter: true,
    headerTemplate: '',
    footerTemplate: '',
    printBackground: true,
    format: 'A4'
});

Ce que je veux, c'est générer un rapport PDF dès que la page est complètement chargée.

Je ne veux écrire aucun type de retard, c'est-à-dire attendre page.waitFor (2000);

Je ne peux pas faire waitForSelector car la page contient des tableaux et des graphiques qui sont rendus après les calculs.

Votre aide sera appréciée.

9
n.sharvarish

Vous pouvez utiliser page.waitForNavigation() pour attendre que la nouvelle page se charge complètement avant de générer un PDF:

await page.goto( fullUrl, { waitUntil : 'networkidle0' } );

await page.type( '#username', 'scott' );
await page.type( '#password', 'tiger' );

await page.click( '#Login_Button' );

await page.waitForNavigation( { waitUntil : 'networkidle0' } );

await page.pdf( {
    path                : outputFileName,
    displayHeaderFooter : true,
    headerTemplate      : '',
    footerTemplate      : '',
    printBackground     : true,
    format              : 'A4'
});

S'il y a un certain élément généré dynamiquement que vous souhaitez inclure dans votre PDF, pensez à utiliser page.waitForSelector() pour vous assurer que le contenu est visible:

await page.waitForSelector( '#example', { visible : true } );
4
Grant Miller

J'aime toujours attendre sélecteurs, car beaucoup d'entre eux sont un excellent indicateur que la page est entièrement chargée:

await page.waitForSelector('#blue-button');
0
Nicolás A.

Enveloppez le page.click et page.waitForNavigation dans Promise.all

  await Promise.all([
    page.click('#submit_button'),
    page.waitForNavigation({ waitUntil: 'networkidle0' })
  ]);
0
Mark Swardstrom