javascript - Puppeteer page.goTo() 永远不会完成

标签 javascript node.js automation puppeteer e2e-testing

这个问题在这里已经有了答案:





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/

相关文章:

javascript - 在 Jest 中模拟过程方法

javascript - 如何更改文件输入语言

javascript - 在 HTML/JavaScript 中,有没有办法在图像开始加载时知道图像的最终布局尺寸?

java - Java 按时间间隔运行循环

php - 使用 CRON 作业执行 PHP 脚本

javascript - vue 声明中的引用对象

node.js - 全局 Sequelize Store 查询值

mysql - NodeJS : Where to connect to the database in code?

node.js - 在 golang 中解密 JWE token

java - 处理日历以从日历中的当前日期选择日期? Selenium