node.js - 如何让 Puppeteer waitForNavigation 在点击后工作

标签 node.js puppeteer

我试图让 puppeteer 操纵者等待导航完成,然后再继续下一个语句。基于Docs对于 waitForNavigation() ,代码应该在下面工作。但它只是跳到下一条语句,我必须使用解决方法来等待响应中的特定 URL。

我也尝试了所有 waituntil 选项
(加载、domcontentloaded、networkidle0 和 networkidle2)。

任何如何让我正常工作的想法都值得赞赏。

const browser = await puppeteer.launch({
  headless: false,
})
const page = await browser.newPage()
const home = page.waitForNavigation()
await page.goto(loginUrl)
await home

const login = page.waitForNavigation()
await page.type('#email', config.get('login'))
await page.type('#password', config.get('password'))
await page.click('#submitButton')
await login // << skips over this

// the following line is my workaround and it works , but ideally I don't want 
// to specify the expected "after" page each time I navigate
await page.waitForResponse(request => request.url() === 'http://example.com/expectedurl')

最佳答案

函数page.waitForNavigation()等待导航开始和结束。

导航已通过 page.click() 启动.

因此,您可以使用Promise.all()避免上述函数之间的竞争条件:

const browser = await puppeteer.launch({
  headless: false,
});

const page = await browser.newPage();

await page.goto(loginUrl);

await page.type('#email', config.get('login'));
await page.type('#password', config.get('password'));

await Promise.all([
  page.click('#submitButton'),
  page.waitForNavigation({
    waitUntil: 'networkidle0',
  }),
]);

await browser.close();

关于node.js - 如何让 Puppeteer waitForNavigation 在点击后工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211871/

相关文章:

node.js - 如何使用 aws ses 在电子邮件 header 中添加姓名

javascript - 在Ubuntu 18.04上安装nodemon时出错

mysql - NodeJS 无法打开 MySQL 连接端口

node.js - 如何将 headless Chrome 模块与AWS Lambda捆绑在一起?

javascript - PDF A4 页面中的网站内容不响应

node.js - 嵌套异步函数变量范围

node.js - 在 Pug/Jade 中迭代未知的 JSON

node.js - 创建 Stormpath 用户并在一次调用中分配给组

node.js - 将Electron + Puppeteer打包为.exe

javascript - 如何在 puppeteer 中获取子 iframe?