首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >木偶师page.goTo()永远不会完成

木偶师page.goTo()永远不会完成
EN

Stack Overflow用户
提问于 2021-02-20 01:19:45
回答 1查看 5.8K关注 0票数 5

Why puppeteer page.goto() hangs?

这是另一个发生这种情况的例子^

我从来不知道为什么,但即使是最简单的木偶脚本也无法通过goTo()

我有以下代码:

代码语言:javascript
运行
复制
    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();

产出如下:

代码语言:javascript
运行
复制
$:# node lib/tests/nav.test.js
    before nav
    waiting nav

它永远不会记录“完整”。我尝试过没有代理旁路和代理服务器,没有沙箱开和关。我试过了networkidle2。它还没有完成。我也尝试过各种不同的网站。我在Puppetor4.x上,使用节点12.x和NPM6.x。

我研究了人们建议的承诺方法:

代码语言:javascript
运行
复制
await Promise.All([ page.goto('http://www.google.com'), page.waitForNavigation() ]);

这有时也能用。但这是非常零星的。

木偶师真的是这辆马车吗?在执行操作之前,是否有任何已知的方法来保证页面加载。我需要周围的导航,填写表格,点击按钮等,所以元素都需要在那里。

我也尝试了waitForSelector()版本,这也不加载。

我觉得木偶师已经彻底崩溃了。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-02-20 11:01:07

你并没有以你应该的方式使用Puppeteer,这就是为什么它让人感觉到有问题,但这主要是因为你不知道脚本中发生了什么。

让我们来看看。

代码语言:javascript
运行
复制
await page.goto('http://www.google.com');

这实际上意味着:

代码语言:javascript
运行
复制
await page.goto('http://www.google.com', { waitUntil: 'load' });

因此,您将转到到页面,等待,直到load事件触发。这意味着当您到达这条线后面时,就没有其他导航可以等待了。因此,这一行:

代码语言:javascript
运行
复制
await page.waitForNavigation();

将永远等待。这就是你所说的“挂起的”。

因此,由于page.goTo()方法已经提供了指定导航何时成功的方法(目前它们是: load、domcontentloaded、networkidle0、networkidle2),所以您实际上不需要使用任何其他方法与page.goTo()结合使用。

另一种情况是,当您单击一个按钮并期望发生一些事情时,例如导航或选择器会出现在页面中。由于page.click()方法不提供与page.goTo()相同的选项,所以通常需要组合使用另一种方法,如下所示:

代码语言:javascript
运行
复制
await Promise.all([
    page.waitForNavigation(),
    page.click(selector)
]);

或者等待导航和一些选择器:

代码语言:javascript
运行
复制
await Promise.all([
    page.waitForNavigation({ waitUntil: 'networkidle0' }),
    page.waitForSelector(selector),
    fbButton.click()
]);

如果你坚持这些模式,我不认为你会觉得木偶车是有问题的。这只是一个低级的工具,所以您需要编写更多的代码,而不是像WebdriverIO之类的其他框架。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66287035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档