创建异步循环,元素单击和导航...需要建议

时间:2019-08-29 14:23:33

标签: puppeteer

要点是,我在一个包含多个链接的网页上,所有链接均由下拉标签隐藏。一次只能打开一个下拉列表。我已经成功创建了将遍历每个标签的循环,然后按下包含链接的循环!我需要一个新的“ For循环”,其中包含要执行的异步代码:

  1. 遍历元素数组并打开新选项卡。 (完成)
  2. 收听新标签上的弹出事件,并将URL捕获到响应数组中(完成)
  3. 为该^数组使用page.goto(responses []),在主页中导航至选项卡的URL。 (完成)
  4. 拦截我的主页的请求,并使用“ request-promise”库生成一个新的请求-获取我的PDF流。 (完成)
  5. page.goback()在主框架中,然后重复循环,现在在下一个元素上。

当前,我只能在基本起作用的第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中的点击:)

0 个答案:

没有答案