【发布时间】:2019-09-02 20:10:09
【问题描述】:
我正在尝试使用一堆 ID 登录网页。
我已经使用单个 id 创建了代码并且我的代码正在运行,但我对如何在异步函数中引入循环感到震惊。
const puppeteer = require('puppeteer');
let scrape = async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('URL');
const id=[IDs];
for(const i of id)
{
await page.$eval('#username', el => el.value = i);
await page.$eval('#password', el => el.value = 'PASSWORD');
await page.click('#loginbutton');
await page.waitFor(1000);
const result = await page.evaluate(() => {
let a=document.getElementById('signin-caption').innerText;
let b=document.getElementById('statusmessage').innerText;
if(b)
return b;
return a;
});
await console.log(result);
if(result.startsWith('You'))
break;
}
await browser.close();
return result;
};
scrape().then((value) => {
console.log(value);
});
收到以下错误: “UnhandledPromiseRejectionWarning:错误:评估失败:ReferenceError:我未定义”
【问题讨论】:
-
循环就好了。您不能做的是通过
$eval回调中的闭包访问变量。 -
将
return b;然后return a;放在下一行是没有意义的。它永远不会执行return a;代码行。此外,await console.log(result);中的await毫无意义。console.log()不返回承诺,因此await没有任何用处。await仅在您等待承诺时才会做一些有用的事情。
标签: javascript node.js loops async-await puppeteer