Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 木偶演员等待弹出页面完全加载,然后继续_Javascript_Node.js_Puppeteer - Fatal编程技术网

Javascript 木偶演员等待弹出页面完全加载,然后继续

Javascript 木偶演员等待弹出页面完全加载,然后继续,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我试图在继续之前等待一个弹出窗口完全加载,但我不确定如何完成,目前我正在使用wait页面。waitFor(3000)。是否有更优雅的方法来完成此操作,并等待弹出窗口完全加载,然后继续 下面是我的代码的相关部分 await page.evaluate(async () => { await $('#myDataExport').click(); await $('.export-btn a').click(); },);

我试图在继续之前等待一个弹出窗口完全加载,但我不确定如何完成,目前我正在使用
wait页面。waitFor(3000)。是否有更优雅的方法来完成此操作,并等待弹出窗口完全加载,然后继续

下面是我的代码的相关部分

        await page.evaluate(async () => {
          await $('#myDataExport').click();
          await $('.export-btn a').click();
        },);
        await page.waitFor(3000);
        const browserPages = await browser.pages();
        const exportPopup = browserPages[browserPages.length - 1]; 
我也尝试使用下面的

await Promise.all([
 await page.click('.export-btn a'),
 await page.waitForNavigation({ waitUntil: 'networkidle2' }),
]);
但我得到一个错误:节点不可见或不是HTMLElement


这方面的任何帮助都会非常好,谢谢。

我试着做一个有效的例子。您可以忽略请求拦截代码

const puppeteer = require('puppeteer')

;(async () => {

    const browser = await puppeteer.launch({headless: false})
    const [page] = await browser.pages()

    // This network interception due to massive ads on the page
    // You can remove this if you like, as this is just an example
    // page.setRequestInterception(true)
    // page.on('request', request => {
    //    if (request.url().startsWith('https://www.w3schools.com/')) {
    //        request.continue()
    //    } else {
    //        request.abort()
    //    }
    // })

    await page.goto('https://www.w3schools.com/tags/att_a_target.asp', {waitUntil: 'domcontentloaded'})
    const [popup] = await Promise.all([
        new Promise(resolve => page.on('popup', resolve)),
   
        // THE LINES COMMENTED BELOW IS JUST AN W3SCHOOL EXAMPLE
        // page.waitForSelector('a[target="_blank"].w3-btn.w3-margin-bottom'),
        // page.click('a[target="_blank"].w3-btn.w3-margin-bottom'),
    
        // YOUR CODE SHOULD LIKE THIS
        page.waitForSelector('.export-btn a'),
        page.click('.export-btn a'),
    ])

    await popup.waitForSelector('#iframeResult')
    await popup.screenshot({path: 'targetpopup.png'})
    await popup.close()

    await browser.close()

})()
您是否尝试过:使用目标域事件

调用
target.page()

单击时不会立即打开新选项卡。等待事件的一种方式是创造一个新的承诺

示例:

const newPagePromise=newpromise(resolve=>browser.once('targetcreated',target=>resolve(target.page());
等待页面。单击(“.导出btn a”);
const newPage=等待newPage承诺;

您尝试过吗?
等待page.waitFor()
{waitUntil:'networkidle2'}
@MayankGupta是的,我已经更新了问题的更多细节如果我使用waitForSelector,我会得到这个错误
错误:节点要么不可见要么不是HTMLElement
waitForSelector也只是W3Schools网站的一个例子。你应该在你想要的网页URL中找到任何匹配的选择器。我已经编辑了我的答案,请检查k以使其在您的机器上顺利工作。您好@theDavidBarton,谢谢您的回复。在我的情况下,弹出窗口不是新选项卡而是新的弹出窗口,在这种情况下仍然有效吗?我怀疑它可以工作,是的。我见过使用这种方法在GitHub上进行e2e测试的例子,但是我没有机会尝试,因为我没有这样的弹出窗口secase.如果你能给我一个示例站点,我可以查看它…但到那时你也可以尝试:)我确实尝试过,但看起来这个过程只是挂起,无法继续,我看到了。如果
等待页面,等待(3000)for
for…of
循环代替forEach(因为forEach和Array.map中的承诺工作方式与我们预期的不同)。