gpt4 book ai didi

node.js - 如何将 ElementHandle 移动到另一个页面

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:48 24 4
gpt4 key购买 nike

我正在尝试迭代 ElementHandles 数组并将它们附加到第二个页面中,如下所示:

const htmlContent: string = `
<html><head></head><body>
<div class="section">Section 1</div>
<div class="section">Section 2</div>
<div class="main-container"></div>
</body></html>`

let browser: Browser = await Puppeteer.launch();
const firstPage: Page = await browser.newPage();
const secondPage: Page = await browser.newPage();
await firstPage.goto('data:text/html;charset=UTF-8,' + htmlContent);
await secondPage.goto('data:text/html;charset=UTF-8,' + htmlContent);
let sections: ElementHandle[] = await firstPage.$$('.section');

for (const section of sections) {
secondPage.$eval('.main-container', (el: any, section: ElementHandle) => {
el.append(section);
}, section);
}

browser.close()

我将此代码基于 ElementHandle 类的 Puppeteer 文档:

ElementHandle instances can be used as arguments in page.$eval() and page.evaluate() methods.

但是,这不起作用。它生成带有以下消息的堆栈跟踪:

Error: JSHandles can be evaluated only in the context they were created!

我尝试将该部分定义为 any 以及 JSHandle ,但结果相同。我一直在 api 文档中搜索有关我做错了什么的任何提示,但没有结果。

如有任何帮助,我们将不胜感激!

最佳答案

错误消息所指的“上下文”是页面 - 您试图将元素从一个页面复制到另一个页面,但它根本不允许您这样做,不幸的是,没有办法序列化它们以便您可以传递它们。也就是说,只要丢失任何带外数据(例如事件监听器或 JavaScript 中设置的其他属性)是可以接受的,您就可以复制 outerHTML 来代替:

const htmlContent: string = `
<html><head></head><body>
<div class="section">Section 1</div>
<div class="section">Section 2</div>
<div class="main-container"></div>
</body></html>`;

let browser: Browser = await Puppeteer.launch();
const firstPage: Page = await browser.newPage();
const secondPage: Page = await browser.newPage();
await firstPage.goto("data:text/html;charset=UTF-8," + htmlContent);
await secondPage.goto("data:text/html;charset=UTF-8," + htmlContent);
let sectionsAsHtml: string[] = await firstPage.$$eval(
".section",
(elements: Element[]) => Array.from(elements).map(e => e.outerHTML)
);

for (const section of sectionsAsHtml) {
await secondPage.$eval(".main-container", e => (e.innerHTML += section));
}

browser.close();

关于node.js - 如何将 ElementHandle 移动到另一个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52163083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com