我是javascript和puppeteer的新手。 我尝试了下面的登录代码并失败了。 相比之下,我添加了pages2并成功了。 我怎么解决呢? 提前谢谢。
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();
答案 0 :(得分:14)
page.waitForNavigation();
在click
或从页面触发的任何导航操作后等待导航。您应该在page.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
的登录信息,我看不到您面临的实际错误。如果您可以尝试上面提供的解决方案并分享结果,那么它会更有帮助。
答案 1 :(得分:5)
使用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()
等待主页显示,然后继续前进。