Puppenspieler-Warteseite wird nach dem Absenden des Formulars geladen
Lesezeit: 5 Minuten
Redochka
Ich sende ein Formular mit dem folgenden Code und möchte, dass Puppeteer nach dem Absenden des Formulars auf das Laden der Seite wartet.
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'});
Wie kann ich mit Puppeteer auf das Laden der Seite warten?
Md. Abu Taher
Sie können asynchron auf die Navigation warten, um ein Einholen zu vermeiden null bei Weiterleitung,
options <Objekt> Navigationsparameter, die folgende Eigenschaften haben können:
timeout <Nummer> Maximale Navigationszeit in Millisekunden, standardmäßig 30 Sekunden, pass 0 um die Zeitüberschreitung zu deaktivieren. Der Standardwert kann mit geändert werden page.setDefaultNavigationTimeout (Zeitüberschreitung) Methode.
waitUntil <Schnur|Array<Schnur>> Wenn die Navigation als erfolgreich betrachtet wird, ist die Standardeinstellung auf load. Bei einem Array von Ereigniszeichenfolgen gilt die Navigation als erfolgreich, nachdem alle Ereignisse ausgelöst wurden. Ereignisse können entweder sein:
load – Navigation als beendet betrachten, wenn die load Ereignis wird ausgelöst.
domcontentloaded – Navigation als beendet betrachten, wenn die DOMContentLoaded Ereignis wird ausgelöst.
networkidle0 – Navigation als beendet betrachten, wenn mindestens 0 Netzwerkverbindungen vorhanden sind 500 MS.
networkidle2 – Navigation als beendet betrachten, wenn mindestens 2 Netzwerkverbindungen bestehen 500 MS.
gibt zurück: <Versprechen<[?Response]>> Versprechen, das zur Antwort der Hauptressource führt. Bei mehreren Weiterleitungen wird die Navigation mit der Antwort der letzten Weiterleitung aufgelöst. Im Falle einer Navigation zu einem anderen Anker oder einer Navigation aufgrund der Verwendung der Verlaufs-API wird die Navigation mit aufgelöst null.
Aber seit page.waitForNavigation() ist eine Abkürzung für page.mainFrame().waitForNavigation()können wir Folgendes für eine geringfügige Leistungssteigerung verwenden:
Ich versuche zu warten, bis ein Bild in einem Popover geladen wird. Ist es möglich, einfach 10 Sekunden zu pausieren? Keiner dieser Werte funktioniert für mich.
– Chovy
13. August 2019 um 6:30 Uhr
Der Leistungshinweis ist eine verfrühte Optimierung und hat keinen praktischen Einfluss auf die Leistung in der realen Welt. Außerdem ist es wahrscheinlicher, dass es nach einem Upgrade von Puppeteer kaputt geht, da es die interne API verwendet
– Soufiane Ghzal
10. Januar 2020 um 11:57 Uhr
Nathan Gehen
Manchmal sogar mit await page.waitForNavigation() führt immer noch zu a Error: Execution context was destroyed, most likely because of a navigation.
In meinem Fall lag es daran, dass die Seite mehrmals umgeleitet wurde. Das API sagt die Vorgabe waitUntil Option ist Load– Dies erforderte, dass ich bei jeder Umleitung (3 Mal) auf die Navigation wartete.
Verwenden Sie nur eine einzige Instanz von page.waitForNavigation mit dem waitUntil Möglichkeit networkidle2 hat bei mir gut funktioniert:
Schließlich schlägt die API die Verwendung von a vor Promise.All um eine Race-Condition zu verhindern. Ich habe das nicht benötigt, stelle es aber der Vollständigkeit halber zur Verfügung:
Ich weiß, es ist etwas spät, darauf zu antworten. Es kann hilfreich sein für diejenigen, die dabei unter die Ausnahme kommen WaitForNavigation.
(node:14531) UnhandledPromiseRejectionWarning: TimeoutError: Navigation Timeout Exceeded: 30000ms überschritten bei Promise.then (/home/user/nodejs/node_modules/puppeteer/lib/LifecycleWatcher.js:142:21) bei — ASYNC — bei Frame. (/home/user/nodejs/node_modules/puppeteer/lib/helper.js:111:15) unter Page.waitForNavigation (/home/user/nodejs/node_modules/puppeteer/lib/Page.js:649:49) unter Page . (/home/user/nodejs/node_modules/puppeteer/lib/helper.js:112:23) unter /home/user/nodejs/user/puppeteer/example7.js:14:12 at
Der richtige Code, der für mich funktioniert hat, ist wie folgt.
Dies wäre die erste zu verwendende Priorität, da darauf gewartet wird, dass das gesamte Netzwerk abgeschlossen ist, und davon ausgegangen wird, dass dies abgeschlossen ist, wenn Sie 500 ms lang nicht mehr als 0 Netzwerkanrufe haben.
Diese Funktion kann auch an verschiedenen Stellen verwendet werden, da sie nur dann weitergehen kann, wenn alle Anrufe erfolgreich waren, d. h. wenn der gesamte Antwortstatus in Ordnung ist, dh (200-299).