很酷的墨镜 · RDP登录相关开发者社区· 1 月前 · |
强健的猕猴桃 · js和jq给select绑定onchange ...· 4 周前 · |
有腹肌的伤痕 · javascript ...· 3 周前 · |
瘦瘦的人字拖 · qtextbrowser,如何使用?添加一行 ...· 2 周前 · |
叛逆的长颈鹿 · offset commit failed ...· 2 周前 · |
傻傻的香烟 · 三张图读懂机器学习:基本概念、五大流派与九种 ...· 1 年前 · |
坐怀不乱的乌冬面 · mysql通过json数组字符串及JSON_ ...· 1 年前 · |
冷静的茶壶 · 动画提示和技巧 - WPF .NET ...· 1 年前 · |
Why puppeteer page.goto() hangs?
这是另一个发生这种情况的例子^
我从来不知道为什么,但即使是最简单的木偶脚本也无法通过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
。它还没有完成。我也尝试过各种不同的网站。我在Puppetor4.x上,使用节点12.x和NPM6.x。
我研究了人们建议的承诺方法:
await Promise.All([ page.goto('http://www.google.com'), page.waitForNavigation() ]);
这有时也能用。但这是非常零星的。
木偶师真的是这辆马车吗?在执行操作之前,是否有任何已知的方法来保证页面加载。我需要周围的导航,填写表格,点击按钮等,所以元素都需要在那里。
我也尝试了
waitForSelector()
版本,这也不加载。
我觉得木偶师已经彻底崩溃了。有什么想法吗?
发布于 2021-02-20 11:01:07
你并没有以你应该的方式使用Puppeteer,这就是为什么它让人感觉到有问题,但这主要是因为你不知道脚本中发生了什么。
让我们来看看。
await page.goto('http://www.google.com');
这实际上意味着:
await page.goto('http://www.google.com', { waitUntil: 'load' });
因此,您将 转到 到页面, 等待 ,直到load事件触发。这意味着当您到达这条线后面时,就没有其他导航可以等待了。因此,这一行:
await page.waitForNavigation();
将永远等待。这就是你所说的“挂起的”。
因此,由于
page.goTo()
方法已经提供了指定导航何时成功的方法(目前它们是: load、domcontentloaded、networkidle0、networkidle2),所以您实际上不需要使用任何其他方法与
page.goTo()
结合使用。
另一种情况是,当您单击一个按钮并期望发生一些事情时,例如导航或选择器会出现在页面中。由于
page.click()
方法不提供与
page.goTo()
相同的选项,所以通常需要组合使用另一种方法,如下所示:
await Promise.all([
page.waitForNavigation(),