操纵up的人转到其他页面

时间:2018-12-26 21:13:19

标签: 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()函数中进行回调以在之后转到新页面?

2 个答案:

答案 0 :(得分:1)

通过点击导航并等待页面加载的正确方法是使用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。网址应包含方案,例如https://
  •   
  • options导航参数,可能具有以下属性:      
        
    • timeout最大导航时间(以毫秒为单位),默认为30秒,请传递0以禁用超时。可以使用page.setDefaultNavigationTimeout(timeout)方法更改默认值。
    •   
    • waitUntil当考虑导航成功时,默认为load。给定事件字符串数组,所有事件触发后,导航被认为是成功的。 ...
    •   
  •   

将其组合在一起,登录示例如下:

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)

其他一些注意事项:

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

答案 1 :(得分:0)

与下面的解决方案相同,但是如果我理解正确,您应该先有点击事件,然后等待导航。

await Promise.all([
page.click('button'),
page.waitForNavigation(),
]);