Je soumets un formulaire en utilisant le code suivant et je veux que Puppeteer attende le chargement de la page après l'envoi du formulaire.
await page.click("button[type=submit]");
//how to wait until the new page loads before taking screenshot?
// i don't want this:
// await page.waitFor(1*1000); //← unwanted workaround
await page.screenshot({path: 'example.png'});
Comment attendre le chargement de la page avec le marionnettiste?
Vous pouvez attendre la navigation de manière asynchrone pour éviter d’obtenir null
lors de la redirection,
await Promise.all([
page.click("button[type=submit]"),
page.waitForNavigation({ waitUntil: 'networkidle0' }),
]);
Cela vous aidera si le page.click déclenche déjà une navigation.
await page.waitForNavigation();
Selon le documentation officielle , vous devez utiliser:
page.waitForNavigation (options)
options
< Object > Paramètres de navigation qui pourraient avoir les propriétés suivantes:
timeout
< nombre > Durée maximale de navigation en millisecondes, valeur par défaut de 30 secondes, passez0
pour désactiver le délai. La valeur par défaut peut être modifiée à l'aide de la méthode page.setDefaultNavigationTimeout (timeout) .waitUntil
< chaîne | Tablea < chaîne >> Quand la navigation a-t-elle été envisagée? Par défaut,load
. Étant donné un tableau de chaînes d'événements, la navigation est considérée comme réussie une fois que tous les événements ont été déclenchés. Les événements peuvent être:
load
- considère que la navigation est terminée lorsque l'événementload
est déclenché.domcontentloaded
- considère que la navigation est terminée lorsque l'événementDOMContentLoaded
est déclenché.networkidle0
- considère que la navigation est terminée lorsqu'il n'y a pas plus de 0 connexions réseau pour au moins500
ms.networkidle2
- considère que la navigation est terminée lorsqu'il n'y a pas plus de 2 connexions réseau pour au moins500
ms.- renvoie: < Promise <[? Response] >> Promise qui résout la réponse à la ressource principale. En cas de redirections multiples, la navigation sera résolue avec la réponse de la dernière redirection. En cas de navigation vers une ancre différente ou de navigation en raison de l'utilisation de l'historique API, la navigation sera résolue avec
null
.
Vous pouvez utiliser page.waitForNavigation()
pour attendre qu'une page navigue:
await page.waitForNavigation();
Mais comme page.waitForNavigation()
est un raccourci pour page.mainFrame().waitForNavigation()
, nous pouvons utiliser les éléments suivants pour améliorer légèrement les performances:
await page._frameManager._mainFrame.waitForNavigation();
Je sais qu'il est un peu tard pour répondre à cette question. Cela peut être utile pour ceux qui obtiennent une exception en faisant exception waitForNavigation.
(noeud: 14531) UnhandledPromiseRejectionWarning: TimeoutError: Délai d'attente de navigation dépassé: 30000ms dépassés à Promise.then (/home/user/nodejs/node_modules/puppeteer/lib/LifecycleWatcher.js:142:21) sur - Frame. (/home/user/nodejs/node_modules/puppeteer/lib/helper.js:111:15) sur Page.waitForNavigation (/home/user/nodejs/node_modules/puppeteer/lib/Page.js:649:49) sur Page . (/home/user/nodejs/node_modules/puppeteer/lib/helper.js:112:23) sur /home/user/nodejs/user/puppeteer/example7.js:14:12 sur
Le code correct qui a fonctionné pour moi est comme ci-dessous.
await page.click('button[id=start]', {waitUntil: 'domcontentloaded'});
De même, si vous allez sur une nouvelle page, le code devrait ressembler à
await page.goto('here goes url', {waitUntil: 'domcontentloaded'});
await Promise.all([
page.click(selectors.submit),
page.waitForNavigation({ waitUntil: 'networkidle0' }),
]);
Ce serait la première priorité à utiliser car il attend que tout le réseau se termine et suppose que cela est fait lorsque vous n'avez pas plus de 0 appel réseau pendant 500 ms.
vous pouvez aussi utiliser
await page.waitForNavigation({ waitUntil: 'Load' }}
ou bien, vous pouvez utiliser
await page.waitForResponse(response => response.ok())
cette fonction peut également être utilisée à divers endroits, car elle ne permet de continuer que lorsque tous les appels aboutissent, c’est-à-dire lorsque tout le statut de la réponse est correct, c.-à-d. (200-299)