这个问题在这里已经有了答案:
Puppeteer never completely loads the page
(3 个答案)
去年关闭。
Why puppeteer page.goto() hangs?
这是发生这种情况的另一个例子^
我一直不明白为什么,但即使是最简单的 puppeteer 脚本也无法通过 goTo()
我有以下代码:
const browser = await puppeteer.launch({ executablePath: '/usr/bin/google-chrome-unstable', args: ["--proxy-server='direct://'", '--proxy-bypass-list=*', '--no-sandbox', '--disable-setuid-sandbox'] });
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36');
await page.setDefaultNavigationTimeout(0);
log('before nav');
await page.goto('http://www.google.com');
log('waiting nav');
await page.waitForNavigation({
waitUntil: 'networkidle0'
});
log('complete');
await browser.close();
输出是:$:# node lib/tests/nav.test.js
before nav
waiting nav
它永远不会记录“完整”。我试过没有代理绕过和代理服务器,没有沙箱开关。我试过networkidle2
.它没有完成。我还尝试了各种不同的网站。我在 Puppeteer 4.x 上并使用 Node 12.x 和 npm 6.x。我研究了人们建议的 Promise 方法:
await Promise.All([ page.goto('http://www.google.com'), page.waitForNavigation() ]);
这有时有效。但它非常零星。puppeteer 师真的这么牛吗?在执行操作之前是否有任何已知的方法来保证页面加载。我需要导航并填写表格并单击按钮等,因此所有元素都需要在那里。
我也试过
waitForSelector()
版本也是,那也不加载。我觉得puppeteer从根本上被打破了。有任何想法吗?
最佳答案
你没有按照你应该的方式使用 Puppeteer,这就是为什么它感觉有问题,但这主要是因为你不知道脚本中发生了什么。
我们来看一下。
await page.goto('http://www.google.com');
这真的意味着:await page.goto('http://www.google.com', { waitUntil: 'load' });
所以你是 去到一页和等待直到加载事件触发。这意味着当您到达这条线的后面时,无需等待其他导航。因此这一行:await page.waitForNavigation();
将永远等待。这就是你所说的“它挂起”。所以由于方法
page.goTo()
已经提供了指定导航何时成功的方法(目前它们是:load、domcontentloaded、networkidle0、networkidle2),您实际上不需要将任何其他方法与 page.goTo()
结合使用.另一种情况是当您单击按钮并期望发生某些事情时,例如导航或选择器出现在页面中。由于方法
page.click()
不提供与 page.goTo()
相同的选项,你经常需要结合使用另一种方法,像这样:await Promise.all([
page.waitForNavigation(),
page.click(selector)
]);
或等待导航和一些选择器:await Promise.all([
page.waitForNavigation({ waitUntil: 'networkidle0' }),
page.waitForSelector(selector),
fbButton.click()
]);
如果你坚持这些模式,我认为你不会觉得 Puppeteer 有问题。只是它是一个低级工具,因此您需要编写比 WebdriverIO 等其他框架更多的代码。
关于javascript - Puppeteer page.goTo() 永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66287035/