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)我认为这是一种可以接受的方法,尤其是api没有提供等待弹出窗口的直接解决方案。另外,如果还没有决定,您会接受我的建议:我建议使用常规for
或for…of
循环代替forEach(因为forEach和Array.map中的承诺工作方式与我们预期的不同)。