Node.js 如何在Puppeter中单击弹出/新建选项卡窗口中的元素
我已经使用了下面的示例以弹出窗口/newtab为目标,但是事后可用的方法是有限的。我真的只能做一些事情,比如捕获URL和关闭标签(以及其他事情) 我试图做的是与google/twitter登录弹出窗口交互,但Puppeter似乎没有多个窗口句柄的解决方案,至少在尝试与单击元素交互时是这样Node.js 如何在Puppeter中单击弹出/新建选项卡窗口中的元素,node.js,selenium,puppeteer,Node.js,Selenium,Puppeteer,我已经使用了下面的示例以弹出窗口/newtab为目标,但是事后可用的方法是有限的。我真的只能做一些事情,比如捕获URL和关闭标签(以及其他事情) 我试图做的是与google/twitter登录弹出窗口交互,但Puppeter似乎没有多个窗口句柄的解决方案,至少在尝试与单击元素交互时是这样 const newPagePromise = new Promise(x => browser.once('targetcreated', target => x(target.page()));
const newPagePromise = new Promise(x => browser.once('targetcreated', target => x(target.page()));
await page.click('my-link'); //Opens pop-up window
const newPage = await newPagePromise;
我希望有这样的东西(除了上面写的代码):
这是行不通的。还有其他人有这种需要吗?把这个放在一边吧。我正在以api文档不推荐的方式使用Puppeter,因此我必须翻译您在下面看到的一些内容 我很乐意回答任何其他问题 总而言之,此解决方案允许您打开一个新选项卡/弹出窗口,并与该选项卡/弹出窗口交互。我甚至可以关闭弹出窗口并切换回原始页面,这在下文中没有提及
const newPagePromise = getNewPageWhenLoaded()
await page.click('my-link'); //Opens pop-up window
const newPage = await newPagePromise;
newPage = newPage.mainFrame();
const element = await newPage.waitForSelector('img');
newPage.click(element);
function getNewPageWhenLoaded() {
return new Promise((x) => browser.once('targetcreated', async (target) => {
const newPage = await target.page();
const newPagePromise = new Promise(() => newPage.once('domcontentloaded', () => x(newPage)));
const isPageLoaded = await newPage.evaluate(() => document.readyState);
return isPageLoaded.match('complete|interactive') ? x(newPage) : newPagePromise;
}));
}
const newPagePromise = getNewPageWhenLoaded()
await page.click('my-link'); //Opens pop-up window
const newPage = await newPagePromise;
newPage = newPage.mainFrame();
const element = await newPage.waitForSelector('img');
newPage.click(element);
function getNewPageWhenLoaded() {
return new Promise((x) => browser.once('targetcreated', async (target) => {
const newPage = await target.page();
const newPagePromise = new Promise(() => newPage.once('domcontentloaded', () => x(newPage)));
const isPageLoaded = await newPage.evaluate(() => document.readyState);
return isPageLoaded.match('complete|interactive') ? x(newPage) : newPagePromise;
}));
}