Программа зависает, потому что вы вызвали goto
без async-await или обещаний, а затем вы включили его в гонку за waitForNavigation, это запутало браузер, потому что все три строки кода в основном делают одно и то же на спине. Он пытается ориентироваться и ждать его.
Используйте асинхронное ожидание для обещаний. Не вызывайте асинхронные методы синхронными способами. Неважно, что именно так вы должны использовать в своем примере.
await page.goto('https://www.google.com');
Если вы хотите подождать, пока страница загрузится, функция goto также это затронула. Вам не нужно использовать waitForNavigation
после goto
.
await page.goto('https://www.google.com', {waitUntil: 'load'});
Существует также domcontentloaded
, networkidle2
, networkidle0
для свойства waitUntil
. Вы можете прочитать об этом в документации с полным объяснением.
Причина, по которой скриншот работает должным образом, заключается в том, что он выполняется асинхронно, но затем вы ожидаете навигации.
Вот код без особых сложностей и обещаний расы.
try{ // <-- wrap the whole block in try catch
const browser = await puppeteer.launch(/*{headless: false}*/);
const page = await browser.newPage();
await page.setViewport({width: 1000, height: 500}); // <-- add await here so it sets viewport after it creates the page
await page.goto('https://www.google.com/', {waitUntil: 'load'})
await page.screenshot({path: 'pic.png'});
await browser.close(); // <-- close browser after everything is done
} catch (error) {
console.log(error);
}
Вот как это прекрасно работает в песочнице.
Документы кукловода - хорошее место, чтобы начать узнавать об этом.