一尘不染

如何登录Puppeteer?

node.js

我是JavaScript和Puppeteer的新手。我在下面尝试了登录代码,但失败了。相比之下,我添加page2并成功。我该如何解决?

const CREDS = require('./creds');

async function main() {
  const puppeteer = require('puppeteer');
  const browser = await puppeteer.launch({headless: false});

  const page = await browser.newPage();
  await page.setViewport({width: 1200, height: 720})
  await page.goto('https://www.daum.net');
  await page.waitForNavigation();
  await page.type('#id', CREDS.username);
  await page.type('#loginPw', CREDS.password);
  await page.click('#loginSubmit');

  const page2 = await browser.newPage();
  await page2.setViewport({width: 1200, height: 720})
  await page2.goto('https://google.com');
  await page2.type('#lst-ib', 'Headless Chrome');
}

main();

阅读 272

收藏
2020-07-07

共1个答案

一尘不染

page.waitForNavigation();在页面click触发任何导航操作之后等待导航。您可能应该在页面之后添加waitForNavigation。单击。

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

它将等到两个诺言都解决。

所以现在您的初始代码应如下所示:

const puppeteer = require('puppeteer');
async function main() {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.setViewport({width: 1200, height: 720})
await page.goto('https://www.daum.net', { waitUntil: 'networkidle0' }); // wait until page load
await page.type('#id', CREDS.username);
await page.type('#loginPw', CREDS.password);
// click and wait for navigation
await Promise.all([
          page.click('#loginSubmit'),
          page.waitForNavigation({ waitUntil: 'networkidle0' }),
]);
}

main();

注意:除了回答,我无法测试此操作,因为我没有登录名,daum.net也无法看到您面临的实际错误。如果您可以尝试上面提供的解决方案并分享结果,它将大有帮助。

2020-07-07