无法使用 Puppeteer 登录

Jar*_*rth 1 node.js web-scraping puppeteer

我正在尝试使用以下代码通过 Puppeteer在https://moz.com/login上登录到Moz

const puppeteer = require('puppeteer');

const creds = {
    email: "myemail",
    password: "mypassword"
};

(async () => {
  const browser = await puppeteer.launch({
    args: [
        '--disable-web-security',
      ],
      headless: false
    });
  const page = await browser.newPage();

    await page.goto("https://moz.com/login");
    await page.$eval("input[name=email]", (el, value) => el.value = value, creds.email);
    await page.$eval("input[name=password]", (el, value) => el.value = value, creds.password);
    await Promise.all([
        page.$eval("input[type=submit]", elem => elem.click()),
        page.waitForNavigation({ waitUntil: 'networkidle0' }),
    ]);

  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

我知道我传递的电子邮件和密码是正确的,因为我可以使用它们手动登录,但是当我运行上面的脚本时,我在表单上方收到“无效的电子邮件或密码”错误。

Chrome 中的 JS 控制台记录了两个错误:

无法加载资源:服务器无法加载资源:服务器与404状态响应()cs.moz.com/id?d_visid_ver=1.10.0&d_fieldgroup=A&mcorgid=2C702C1653CF9B460A490D4B%40AdobeOrg&mid=86471825972219878023490878783607186756&ts=1564059866100:1

加载资源失败:服务器响应状态为 400 () svc/forge/forms/login:1

关于问题可能是什么的任何想法?

Yev*_*kov 5

发生此错误是因为您正在通过执行 javascript 函数$eval而不是函数来设置电子邮件和密码type

另外,我建议使用click函数而不是$eval函数。阅读有关“受信任”和“不受信任”输入事件之间区别的更多信息

只需替换这些行:

await page.$eval("input[name=email]", (el, value) => el.value = value, creds.email);
await page.$eval("input[name=password]", (el, value) => el.value = value, creds.password);
Run Code Online (Sandbox Code Playgroud)

用这些:

await page.type('input[name=email]', creds.email);
await page.type('input[name=password]', creds.password)
Run Code Online (Sandbox Code Playgroud)

所以你的最终脚本应该是:

const puppeteer = require('puppeteer');

const creds = {
    email: "myemail",
    password: "mypassword"
};

(async () => {
  const browser = await puppeteer.launch({
    args: [
        '--disable-web-security',
    ],
    headless: false
  });

  const page = await browser.newPage();

  await page.goto("https://moz.com/login");
  await page.type('input[name=email]', creds.email);
  await page.type('input[name=password]', creds.password)
  await Promise.all([
    page.click('input[type=submit]'),
    page.waitForNavigation({ waitUntil: 'networkidle0' }),
  ]);

  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)