如何登录 Puppeteer?

Posted

技术标签:

【中文标题】如何登录 Puppeteer?【英文标题】:How to login in Puppeteer? 【发布时间】:2018-10-09 00:44:43 【问题描述】:

我是 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();

【问题讨论】:

【参考方案1】:

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

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

它将等到两个 Promise 都解决。

所以现在你的初始代码应该是这样的,

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 的登录名,而且我看不到您面临的实际错误。如果您可以尝试上面提供的解决方案并分享结果,那将会更有帮助。

【讨论】:

出现错误消息“断言失败:没有找到选择器的节点:#id”,我已修复它,您的代码运行良好!!哇,非常感谢。 为什么我们需要添加 waitUntil: 'networkidle0' 我只看到page.waitForNavigation(),它工作得很好。【参考方案2】:

page.waitForNavigation()

使用 Puppeteer 登录网站通常就像使用以下代码一样简单:

await page.goto('https://www.example.com/login');

await page.type('#username', 'username');
await page.type('#password', 'password');

await page.click('#submit');

await page.waitForNavigation(); // <------------------------- Wait for Navigation

console.log('New Page URL:', page.url());

注意:请记住在点击提交按钮后使用page.waitForNavigation()等待主页显示后再继续前进。

【讨论】:

提交按钮没有和id怎么办? 不要在这里 waitForNavigationclick 承诺 need to be grouped using Promise.all

以上是关于如何登录 Puppeteer?的主要内容,如果未能解决你的问题,请参考以下文章

在 puppeteer 中如何等待弹出页面完成加载?

如何从 Puppeteer 将文本输入到 Flash TextArea 中?

从 Puppeteer 中的 page.evaluate 获取元素?

Puppeteer:如何在 ec2 服务器上安装 puppeteer

puppeteer设置cookie获取网页内容

不考虑 puppeteer 输入字段