Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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
Node.js 如何在Puppeter中单击弹出/新建选项卡窗口中的元素_Node.js_Selenium_Puppeteer - Fatal编程技术网

Node.js 如何在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()));

我已经使用了下面的示例以弹出窗口/newtab为目标,但是事后可用的方法是有限的。我真的只能做一些事情,比如捕获URL和关闭标签(以及其他事情)

我试图做的是与google/twitter登录弹出窗口交互,但Puppeter似乎没有多个窗口句柄的解决方案,至少在尝试与单击元素交互时是这样

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;
    }));
}