javascript - Puppeteer 转到不同的页面

标签 javascript node.js puppeteer

我试图让我的脚本在成功登录后转到新页面,但是,它会在登录完成之前尝试转到下一页。

  const page = await browser.newPage();

  page.goto('https://website/login');

  page.once('load', async () => {
    console.log('Page loaded!');
    // Login script here
  });

虽然我不知道如何在登录后转到新链接,但我最初的解决方案是这样做;

// go to stats
await page.goto('https://www.website/stats');

但是,由于页面已经定义,这实际上并没有等待任何东西。

是否可以在 .click() 函数中进行回调以在之后转到新页面?

最佳答案

通过单击导航并等待页面加载的正确方法是使用 Promise.all()page.waitForNavigation() ,像这样:

await Promise.all([
    page.waitForNavigation(),
    page.click('#some-link')
]);

但是,当您通过 page.goto() 导航时, 以上不是必需的,因为 page.goto() 会自动等待页面加载。

在这两种情况下,您都可以使用 waitUntil 选项自定义它等待的事件,该选项默认为 load 事件。

page.goto(url[, options])

  • url URL to navigate page to. The url should include scheme, e.g. https://.
  • options Navigation parameters which might have the following properties:
    • timeout Maximum navigation time in milliseconds, defaults to 30 seconds, pass 0 to disable timeout. The default value can be changed by using the page.setDefaultNavigationTimeout(timeout) method.
    • waitUntil When to consider navigation succeeded, defaults to load. Given an array of event strings, navigation is considered to be successful after all events have been fired. ...

综合起来,一个登录的例子是:

const page = await browser.newPage();

await page.goto('https://website/login');

await page.type('input[type="email"]', 'foo@example.com');
await page.type('input[type="password"]', 'pass1234');
await Promise.all([
    page.waitForNavigation(),
    page.click('button')
]);

// Now we are on the home page (or wherever we end up after logging in)

一些其他注意事项:

  • 您可能需要使用 page.waitForSelector()或其他形式的等待,如果页面 load 事件在 input 字段准备就绪之前触发。
  • 您也可以通过在键盘上按 Enter 键来提交登录表单。这仍然需要 Promise.all() 模式,但这意味着您不需要提交按钮的选择器。您可能需要 .click() input 字段之一,具体取决于页面的实现方式(例如,如果页面不使用 autofocus ).

关于javascript - Puppeteer 转到不同的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53937210/

相关文章:

javascript - decodeURIComponent vs unescape,unescape有什么问题?

javascript - 找不到模块 : Can't resolve 'firebase' in react js

javascript - 需要一些帮助解码 meteor 包安装中的 npm 错误消息

node.js - express-session - session id 和 connect.sid 之间的区别?

javascript - 我可以打开多个 Puppeteer 浏览器吗?

youtube - puppeteer 师 : Unable to play video

javascript - 如何用raphael js绘制曲线?

javascript - ES6 类属性文档

javascript - 检查代码是否与 IE 5 兼容

javascript - 网页抓取 : iterate through every page of web app using puppeteer