要点是,我在一个包含多个链接的网页上,所有链接均由下拉标签隐藏。一次只能打开一个下拉列表。我已经成功创建了将遍历每个标签的循环,然后按下包含链接的循环!我需要一个新的“ For循环”,其中包含要执行的异步代码:
当前,我只能在基本起作用的第1步上创建循环。注释掉的循环更符合我的需要(但会抛出错误)
await page.evaluate(() => {
let elements = $('.glyphicon-triangle-right').toArray();
let elements2 = $('[data-type-invoice]').toArray();
for (i=0; i<elements.length; i++) {
$(elements[i]).click();
$(elements2[i]).click();
}
});
// elements.forEach(async (e,i) => {
// $(elements[i]).click();
// $(elements2[i]).click();
// await page.goto(responses[i])
// })
// for (const elem of elements) {
// for (const elem2 of elements2) {
// $(elem).click();
// $(elem2).click();
// }
// }
第2步(获取弹出网址),例如:
let responses = [];
page.on('popup', async (request) => {
if (request.target().url().startsWith('https://myaccount.coxbusiness.com/billingtool/viewinvoicepdf.cox')) {
responses.push(request.target().url())
} else {
return;
}
});
第3步(导航:应该是我的第1步循环的一部分,考虑到我一次只想执行整个5步动作,而不是12个弹出窗口。...)类似:
await page.goto(responses[0]);
第4步(侦听请求/生成一个新的请求),例如:
await page.setRequestInterception(true);
page.on('request', async (request) => {
if (request.url().startsWith('https://myaccount.coxbusiness.com/billingtool/viewinvoicepdf.cox')) {
console.log(request);
options = {
method: request._method,
uri: request._url,
body: request._postData,
headers: request._headers,
encoding: "binary"
}
let cookies = await page.cookies();
options.headers.Cookie = cookies.map(ck => ck.name + '=' + ck.value).join(';');
//console.log(options)
//Send a seperate request NOT through the puppet library to receive and parse PDF, after copying puppet request headers.
let rand = Math.floor((Math.random() * 100) + 1)
rp(options).then(function (body) {
fs.writeFile(`./myfile${rand}.pdf`, body, "binary", (err) => { console.log(err) })
}).catch(err => { })
request.abort();
} else {
request.continue()
}
});
所以...所有部分都是分开工作的,但是我想遍历它们分别进入1,2,3,4,5(5为page.goback())---不是11111111(循环/打开15个选项卡first),2、3、4、5。因为在打开选项卡之后,在其之前打开的选项卡基本上变得不活动。
希望我已经很好地解释了这一点。非常感谢任何知道如何执行步骤2-5的人,然后再循环回到步骤1中的点击:)